天猫精灵打开电脑 语音控制电脑

“天猫精灵”
“哎,我在!”
“打开电脑”


上了一天班,回到家就想静静的玩会游戏,吼一句天猫精灵,立马帮你开机,多么舒服装x的体验。然而现实是骨感的,精灵无此功能,网上有人让弄个智能插排+通电自启,这明显无法满足我们的高逼格。

前言

准备工作:

  1. 外部网络可以访问的一个接口,用于逻辑处理,如果你的服务器外网不能访问,就不要整php+nginx,别想着在虚拟机里面搭个,没用!
  2. 电脑有外网ip,可以外部魔术包唤醒,网卡方面需要支持,一般网卡都支持
  3. 博主搭建的php+nginx可以提供给有兴趣的小伙伴(之前买的服务器已经到期了,所以暂时无法提供给小伙伴)
  4. 双11阿里云针对新人的活动真心不错,80元1核2G1M的服务器用来练练手,着实不错

PHP + Nginx 整合CentOS8.0

安装Nginx

dnf install -y nginx #安装nginx
cd /etc/nginx
## 备份nginx.conf
cp nginx.conf nginx.conf_`date +%Y%m%d`
## grep -Ev '#|^%|^$' nginx.conf_`date +%Y%m%d` > nginx.conf
## 新增index.php用于测试
echo -e "<?php \nphpinfo();\n?>" > /usr/share/nginx/html/index.php
## 赋权
chown nginx:nginx -R /usr/share/nginx/html

vi /etc/nginx/nginx.conf
## 参照下面conf进行修改
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    root		/usr/share/nginx/html;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       8765 default_server;
        listen       [::]:8765 default_server;
        server_name  _;
        include /etc/nginx/default.d/*.conf;
    	location / {
    	}
		location ~ \.php$ {
	    	fastcgi_pass unix:/run/php-fpm/www.sock;
	    	fastcgi_index index.php;
	    	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	    	include fastcgi_params;
		}
    	error_page 404 /404.html;
    	location = /40x.html {
        }
    	error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

安装PHP

dnf install -y php #安装php
dnf install -y php-json #安装php-json

启动服务

## 服务启动php和nginx
systemctl start nginx
systemctl start php-fpm
## 服务器检查
# ps -ef|grep nginx
# ps -ef|grep php-fpm
## 停止命令
# systemctl stop nginx
# systemctl stop php-fpm
## 重启命令
# systemctl restart nginx
# systemctl restart php-fpm

整合结果检查

看到这个页面说明整合完成

phpinfo

编写wol.php用于处理逻辑

cd /usr/share/nginx/html
vi wol.php
<?php
$tmpData = strval(file_get_contents("php://input"));
$dataArray = json_decode($tmpData, true);
if($dataArray == null || $_SERVER['HTTP_HOSTNAME'] == null){
	header('location: /404.html');
}else{

	$hostName = $_SERVER['HTTP_HOSTNAME'];
	$ip = $_SERVER['HTTP_IP'];

	if($ip == "null"){
		$ip = gethostbyname($hostName);
	}

	$request = $dataArray["slotEntities"];
	$skillName = $dataArray["skillName"];
	if($skillName == "打开电脑"){

		if($request[0]["intentParameterName"] == "place"){
			//查位置
			$place = $request[0]["slotValue"];
			//确认电脑的其他信息
			$customArray = explode("|",$request[1]["slotValue"]);
			for($i=0;$i<count($customArray);$i++){
				if((explode(",",$customArray[$i]))[0] == $place){
					$placeArray = explode(",",$customArray[$i]);
				}
			}
		}else{
			//查位置
			$place = $request[1]["slotValue"];
			//确认电脑的其他信息
			$customArray = explode("|",$request[0]["slotValue"]);
			for($i=0;$i<count($customArray);$i++){
				if((explode(",",$customArray[$i]))[0] == $place){
					$placeArray = explode(",",$customArray[$i]);
				}
			}
		}

		$placeArray[0] = $ip;
		
		/*
		 * 生成唤醒包
		 */
		$addr_byte = explode(':', $placeArray[1]);
		$hw_addr = '';
		for ($a=0; $a<6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
		$msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
		for ($a=1; $a<=16; $a++) $msg .= $hw_addr;

		$handle = stream_socket_client('udp://'.$placeArray[0].':'.$placeArray[2],$errno,$errstr);
		if (!$handle) {
			die('ERROR:'.$errno. '- '.$errstr.'\n');
		}
		fwrite($handle,$msg);
		fclose($handle);

		echo json_encode(array('returnCode'=>'0','returnValue'=>array('reply'=>$place.'的电脑已经打开了','resultType'=>'RESULT','executeCode'=>'SUCCESS')));
	}else{
		header('location: /404.html');
	}
}
?>

前面的操作主要用于逻辑判断,根据个人喜欢,也可以用java,目的很简单,当请求/wol.php页面时候,向目标服务器发送魔术包,wol.php中写了魔术包的生成,以及从Header中获取地址,mac信息

Aligenie 开发者平台

https://iap.aligenie.com/home
需要自行注册为开发者,填写自己的个人信息等等

创建技能

创建语音技能

技能调用词,如果选择无调用词,天猫精灵无法语音识别,需要修改为有调用词,名字设置为“打开电脑”。技能创建完成后,能力申请页可以不做调整

创建实体

我们先创建实体,然后创建意图
创建了两个实体custom和place

实体1

位置实体中设置两个变量“卧室”和“客厅”,这个可以自己根据自己的情况进行调整,后续会说到意图里面传参的问题,这个要和自定义实体对应上,不要自定义里面有三个位置信息,而这里只有两个,会导致不匹配

位置

自定义实体中没有写任何实体值,因为这个实体目的是用于往逻辑服务器传值,我们只需要在意图里面加上默认值即可

自定义

创建意图

创建一个名为唤醒电脑的意图

意图

设置单轮对话


此处是重点:

  1. 取消精灵追问,因为过程太过简单,只要一次通话即可解决所有问题
  2. 位置实体设置一个默认值
  3. 自定义实体的默认值,如果用我的wol.php,请参照这个例子填写,位置不要乱,内容是: 卧室,00:1B:00:40:00,3453|客厅,00:1C:00:04:00:D2,3454
    位置信息,mac地址,端口 如果有多条用竖线分开,并且要保证和位置实体对应的上,例如有三个位置电脑:
    卧室,00:00:00:00:00,123|客厅,00:00:00:00:00,124|书房,00:00:00:00:00,125 对应的实体取值应该是:卧室|客厅|书房

在这里插入图片描述

设置回复逻辑

选择默认逻辑WEBHOOK
下载认证文件,将txt存放至/usr/share/nginx/html/aligenie,具体教程官方文档也有https://www.aligenie.com/doc/357834/xwndex
url:对外开放的接口地址
hostname:需要开机的外网访问地址
ip:没有固定ip可以为null
点击提交后会对接口地址进行认证(如果目前没有外部服务器,可以私信我)(之前买的服务器已经到期了,所以暂时无法提供给小伙伴)

回复逻辑

测试

在这里插入图片描述

在线测试几次后就可以真机测试,自己使用,无需发布

纯手打,各位看官给个赞吧

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值