(8)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接3

导航链接

(1)香橙派+apache2与php+天猫精灵=自建平台语音支持--前言

(2)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派操作系统安装

(3)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派环境配置

(4)香橙派+apache2与php+天猫精灵=自建平台语音支持--apache2与php

(5)香橙派+apache2与php+天猫精灵=自建平台语音支持--MariaDB的安装

(6)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接1

(7)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接2

(8)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接3

(9)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接4

(10)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接5

(11)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接6

(12)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接7

程序总体框架

首先我们需要模拟一个真正的外部设备通过天猫精灵进行交互的过程,对于一个设备来说主要是由控制,状态等组成,天猫精灵给了3中方式实现,分别是发现、控制和状态查询(Discovery,Control,Query)。对于一个服务器来说真的通过一些方法去控制远端的设备是很难的,因为远端的设备往往是无法直接访问,一般的实现方法是远端设备去定时访问服务器来同步最新的状态,如果服务器记录的状态改变则设备状态变化,如果本地的设备有主动变化则主动上报服务器去修改记录。服务器端一般是由一个对应设备的数据库来记录设备的状态,我们这里为了简便,我们使用一个txt文本模拟数据库,文本中的数据代表着远端设备的状态。

首先展示一下我们目录结构:

.
├── aligenie (针对天猫精灵的php文件)
│   ├── aligenies_authorize.php
│   ├── aligenies_gate.php
│   ├── aligenies_handle.php
│   ├── aligenies_server.php
│   ├── aligenies_token.php
│   ├── ControlResponse.php
│   ├── DiscoveryResponse.php
│   └── QueryResponse.php
├── icon (显示使用的图标)
│   ├── cz.png
│   └── td.png
├── oauth2-server-php (下载的认证源码)
└── sqldata.txt (模拟数据库的文本文件)

其中sqldata.txt就是我们用来模拟设备数据库的文件,其中的内容是我们设备需要记录的一个json结构,比如我们需要记录一个具有黄白双色的可调光的吸顶灯,一个开关。

{"dev_array": [{"entity_id": "light.ceiling_lamp.34ce008dc8c3","device_type": "ceiling_lamp","properties": [{"name": "powerstate","value": "on"},{"name": "brightness_w","value": 0},{"name": "brightness_y","value": 100}]},{"entity_id": "switch.gateway_switch.34ce008dc8c3","device_type": "gateway_switch","properties": [{"name": "powerstate","value": "on"}]}]
}

entity_id是设备ID,device_type是设备的类型,这个类型不是天猫使用的,而是我们自己定义的设备类型,properties是该设备具有的属性,powerstate是灯的状态属性,brightness_w是白色的亮度属性,brightness_y是黄色的亮度属性。在我们自己的app上可以比天猫精灵控制更多的属性(一般都是这样),比如我们可以自由的组合黄白双色的亮度比例,而天猫精灵一次对话只能控制其中一个属性的变化。

总的天猫精灵控制流程就是首先会进入aligenies_gate.php文件,这个是天猫精灵控制的入口,也是我们在天猫精灵服务器网页设置的网址,aligenies_gate.php中会调用aligenies_handle.php去处理数据,把天猫精灵的格式转为我们自己的格式,并做相应的动作。

ControlResponse.php,DiscoveryResponse.php,QueryResponse.php分别是天猫精灵需要回复的json格式的类,我们需要将类填充并转为json格式传给天猫精灵即可。

三种回复的格式

DiscoveryResponse.php文件是设备发现使用的回复格式

设备发现主要是如下的格式例子

正确相应

{"header":{"namespace":"AliGenie.Iot.Device.Discovery","name":"DiscoveryDevicesResponse","messageId":"1bd5d003-31b9-476f-ad03-71d471922820","payLoadVersion":1},"payload":{"devices":[{"deviceId":"34ea34cf2e63","deviceName":"light1","deviceType":"light","zone":"",          "brand":"","model":"",     "icon":"https://git.cn-hangzhou.oss-cdn.aliyun-inc.com/uploads/aicloud/aicloud-proxy-service/41baa00903a71c97e3533cf4e19a88bb/image.png","properties":[{"name":"color","value":"Red"}],"actions":["TurnOn","TurnOff","SetBrightness",       "AdjustBrightness",     "SetTemperature","Query"        ],"extensions":{"extension1":"","extension2":""}}]}
}

错误相应

{"header":{"namespace":"AliGenie.Iot.Device.XXXX","name":"ErrorResponse","messageId":"1bd5d003-31b9-476f-ad03-71d471922820","payLoadVersion":1},"payload":{"deviceId":"34234","errorCode":"DEVICE_NOT_SUPPORT_FUNCTION","message":"device not support"}}

所以总结上面的格式我们定义了个回复设备发现的类DiscoveryResponse.php

<?php
namespace AliGenie;class DiscoveryResponse {public $header;public $payload;public function __construct($isError = false) {$this->header = new DiscoveryHeader();if ($isError) {$this->header->putResponseName("Error");$this->payload = new DiscoveryErrPayload();} else {$this->payload = new DiscoveryPayload();}}
}class DiscoveryHeader {public $namespace = "AliGenie.Iot.Device.Discovery";public $name = "DiscoveryDevicesResponse";public $messageId = "";public $payLoadVersion = 1;public function putResponseName($name) {$this->name = $name."Response";}public function putResponseMessageId($messageId) {$this->messageId = $messageId;}
}class DiscoveryPayload {public $devices = array();public function putResponseDevices($device) {$this->devices[] = $device;}
}class DiscoveryErrPayload extends DiscoveryPayload{public $errorCode;public $message;public function putResponseError($errorCode, $message = "") {$this->errorCode = $errorCode;switch ($errorCode) {case "INVALIDATE_CONTROL_ORDER":if ($message == "") {$this->message = "invalidate control order";}break;case "SERVICE_ERROR":break;case "DEVICE_NOT_SUPPORT_FUNCTION":if ($message == "") {$this->message = "device not support";}break;case "INVALIDATE_PARAMS":if ($message == "") {$this->message = "invalidate params";}break;case "DEVICE_IS_NOT_EXIST":if ($message == "") {$this->message = "device is not exist";}break;case "IOT_DEVICE_OFFLINE":if ($message == "") {$this->message = "device is offline";}break;case "ACCESS_TOKEN_INVALIDATE":if ($message == "") {$this->message = "access_token is invalidate";}break;default:break;}}
}class DiscoveryDevice {public $deviceId;public $deviceName;public $deviceType;public $zone = "";public $brand = "";public $model = "";public $icon;public $properties = array();public $actions = array();public $extensions;public function putResponseDeviceInfo($deviceId, $deviceName, $deviceType, $icon) {$this->deviceId = $deviceId;$this->deviceName = $deviceName;$this->deviceType = $deviceType;$this->icon = $icon;}public function putResponseProperties($propertie) {$this->properties[] = $propertie;}public function putResponseExtensions($extension) {$this->extensions = $extension;}
}class DiscoveryPropertie {public $name;public $value;public function __construct($name, $value) {$this->name = $name;$this->value = $value;}
}class DiscoveryExtension {public $extension1 = "";public $extension2 = "";
}class DiscoveryExtensionEx extends DiscoveryExtension {public $parentId;public function __construct($parentId) {$this->parentId = $parentId;}
}function discovery_response_demo()
{$res = new DiscoveryResponse();$res->header->putResponseMessageId("1bd5d003-31b9-476f-ad03-71d471922820");$dev = new DiscoveryDevice();$dev->putResponseDeviceInfo("34ea34cf2e63", "单孔插座", "outlet", "https://git.cn-hangzhou.oss-cdn.aliyun-inc.com/uploads/aicloud/aicloud-proxy-service/41baa00903a71c97e3533cf4e19a88bb/image.png");$pro = new DiscoveryPropertie("powerstate", "off");$dev->putResponseProperties($pro);$ext = new DiscoveryExtension();$dev->putResponseExtensions($ext);$dev->actions = array("TurnOn", "TurnOff");$res->payload->putResponseDevices($dev);$dev = new DiscoveryDevice();$dev->putResponseDeviceInfo("34ea34cf2eff", "灯", "light", "https://git.cn-hangzhou.oss-cdn.aliyun-inc.com/uploads/aicloud/aicloud-proxy-service/41baa00903a71c97e3533cf4e19a88bb/image.png");$pro = new DiscoveryPropertie("powerstate", "off");$dev->putResponseProperties($pro);$ext = new DiscoveryExtensionEx("34ea34cf2e63");$dev->putResponseExtensions($ext);$dev->actions = array("TurnOn", "TurnOff");$res->payload->putResponseDevices($dev);$resJson = json_encode($res);echo "$resJson";
}?>

ControlResponse.php文件是设备控制使用的回复格式

设备控制主要是如下的格式例子

正确相应

{"header":{"namespace":"AliGenie.Iot.Device.Control","name":"TurnOnResponse","messageId":"1bd5d003-31b9-476f-ad03-71d471922820","payLoadVersion":1},"payload":{"deviceId":"34234"}}

错误相应同上。

所以总结上面的格式我们定义了个回复设备控制的类ControlResponse.php

<?php
namespace AliGenie;class ControlResponse {public $header;public $payload;public function __construct($isError = false) {$this->header = new ControlHeader();if ($isError) {$this->header->putResponseName("Error");$this->payload = new ControlErrPayload();} else {$this->payload = new ControlPayload();}}
}class ControlHeader {public $namespace = "AliGenie.Iot.Device.Control";public $name = "";public $messageId = "";public $payLoadVersion = 1;public function putResponseName($name) {$this->name = $name."Response";}public function putResponseMessageId($messageId) {$this->messageId = $messageId;}
}class ControlPayload {public $deviceId;public function putResponseDeviceId($deviceId) {$this->deviceId = $deviceId;}
}class ControlErrPayload extends ControlPayload{public $errorCode;public $message;public function putResponseError($errorCode, $message = "") {$this->errorCode = $errorCode;switch ($errorCode) {case "INVALIDATE_CONTROL_ORDER":if ($message == "") {$this->message = "invalidate control order";}break;case "SERVICE_ERROR":break;case "DEVICE_NOT_SUPPORT_FUNCTION":if ($message == "") {$this->message = "device not support";}break;case "INVALIDATE_PARAMS":if ($message == "") {$this->message = "invalidate params";}break;case "DEVICE_IS_NOT_EXIST":if ($message == "") {$this->message = "device is not exist";}break;case "IOT_DEVICE_OFFLINE":if ($message == "") {$this->message = "device is offline";}break;case "ACCESS_TOKEN_INVALIDATE":if ($message == "") {$this->message = "access_token is invalidate";}break;default:break;}}
}function control_response_demo()
{$res = new ControlResponse();$res->header->putResponseName("TurnOn");$res->header->putResponseMessageId("1bd5d003-31b9-476f-ad03-71d471922820");$res->payload->putResponseDeviceId("34234");$resJson = json_encode($res);echo "$resJson";$res = new ControlResponse(true);$res->header->putResponseMessageId("1bd5d003-31b9-476f-ad03-71d471922820");$res->payload->putResponseDeviceId("34234");$res->payload->putResponseError("DEVICE_NOT_SUPPORT_FUNCTION");$resJson = json_encode($res);echo "$resJson";
}?>

QueryResponse.php文件是设备状态查询使用的回复格式

设备状态查询主要是如下的格式例子

正确相应

{"properties":[{"name":"temperature","value":"27"} ],"header":{"namespace":"AliGenie.Iot.Device.Query","name":"QueryTemperatureResponse","messageId":"1bd5d003-31b9-476f-ad03-71d471922820","payLoadVersion":1},"payload":{"deviceId":"34234"}}

错误相应同上

所以总结上面的格式我们定义了个回复设备状态查询的类QueryResponse.php

<?php
namespace AliGenie;class QueryResponse {public $header;public $payload;public function __construct($isError = false) {$this->header = new QueryHeader();if ($isError) {$this->header->putResponseName("Error");$this->payload = new QueryErrPayload();} else {$this->payload = new QueryPayload();$this->properties = array();}}
}class QueryPropertie {public $name;public $value;public function __construct($name, $value) {$this->name = $name;$this->value = $value;}
}class QueryHeader {public $namespace = "AliGenie.Iot.Device.Query";public $name = "";public $messageId = "";public $payLoadVersion = 1;public function putResponseName($name) {$this->name = $name."Response";}public function putResponseMessageId($messageId) {$this->messageId = $messageId;}
}class QueryPayload {public $deviceId;public function putResponseDeviceId($deviceId) {$this->deviceId = $deviceId;}
}class QueryErrPayload extends QueryPayload{public $errorCode;public $message;public function putResponseError($errorCode, $message = "") {$this->errorCode = $errorCode;switch ($errorCode) {case "INVALIDATE_CONTROL_ORDER":if ($message == "") {$this->message = "invalidate control order";}break;case "SERVICE_ERROR":break;case "DEVICE_NOT_SUPPORT_FUNCTION":if ($message == "") {$this->message = "device not support";}break;case "INVALIDATE_PARAMS":if ($message == "") {$this->message = "invalidate params";}break;case "DEVICE_IS_NOT_EXIST":if ($message == "") {$this->message = "device is not exist";}break;case "IOT_DEVICE_OFFLINE":if ($message == "") {$this->message = "device is offline";}break;case "ACCESS_TOKEN_INVALIDATE":if ($message == "") {$this->message = "access_token is invalidate";}break;default:break;}}
}function query_response_demo()
{$res = new QueryResponse();$res->header->putResponseName("Query");$res->header->putResponseMessageId("1bd5d003-31b9-476f-ad03-71d471922820");$res->payload->putResponseDeviceId("34234");$pro = new QueryPropertie("powerstate", "on");$res->properties[] = $pro;$pro = new QueryPropertie("color", "Red");$res->properties[] = $pro;$pro = new QueryPropertie("temperature", "27");$res->properties[] = $pro;$pro = new QueryPropertie("humidity", "20");$res->properties[] = $pro;$pro = new QueryPropertie("windspeed", "2");$res->properties[] = $pro;$pro = new QueryPropertie("humidity", "23");$res->properties[] = $pro;$pro = new QueryPropertie("pm2.5", "20");$res->properties[] = $pro;$pro = new QueryPropertie("direction", "left");$res->properties[] = $pro;$pro = new QueryPropertie("angle", "60");$res->properties[] = $pro;$resJson = json_encode($res);echo "$resJson";$res = new QueryResponse(true);$res->header->putResponseMessageId("1bd5d003-31b9-476f-ad03-71d471922820");$res->payload->putResponseDeviceId("34234");$res->payload->putResponseError("DEVICE_NOT_SUPPORT_FUNCTION");$resJson = json_encode($res);echo "$resJson";
}?>

以上是三种类型的回复,其实这里实现的并不是很好,因为三种错误的回复格式都是一样的,可以把错误回复提炼成一个类,但是懒得做了,因为在做的过程中开始渐渐的对天猫精灵失去了信心,想把这里做完了就去实现小度的语音开发,后面我们在说天猫精灵的各种问题。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/54426.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(13)香橙派+apache2与php+天猫精灵=自建平台语音支持--duerOS对接

这篇主要总结一下小度音箱的对接方法&#xff0c;答题流程与天猫精灵一样&#xff0c;只是php稍有不同&#xff0c;我也会把php源码上传&#xff0c;需要的可以下载&#xff0c;流程与天猫精灵的php文件大体相同&#xff0c;只是其中的细节稍有差异。 php文件链接&#xff1a;…

(11)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接6

导航链接 &#xff08;1&#xff09;香橙派apache2与php天猫精灵自建平台语音支持--前言 &#xff08;2&#xff09;香橙派apache2与php天猫精灵自建平台语音支持--香橙派操作系统安装 &#xff08;3&#xff09;香橙派apache2与php天猫精灵自建平台语音支持--香橙派环境配置…

【 安信可模组TG-12F/TG-01M①】AT指令入门教程 接入阿里飞燕/天猫精灵平台

文章目录 一. TG-12F概述二. 模组接线三、接入阿里飞燕平台1.功能定义2.人机交互3. 添加测试设备4. 发布产品5.设置五元组进入配网 注意&#xff0c;DeviceName必须是小写的MAC地址6. 数据上报下发 四、接入天猫精灵平台 一. TG-12F概述 TG-12F/TG-01M模块采用天猫精灵TG7100C芯…

天猫精灵对接3 (具体代码实现)

1.有什么协议问题&#xff0c;请先看对接文档 2.基础流程请看上一篇文章&#xff0c;已经讲得比较详细了。 3.代码写得渣&#xff0c;有什么可以优化的地方麻烦提一下&#xff0c;喷我也没啥用。 运行&#xff08;调试&#xff09;流程&#xff1a; 本机测试&#xff08;内网模…

什么样的量化交易策略才是最有用的?

一、什么是交易策略&#xff1f; 交易策略是一系列规则的集合&#xff0c;包括进场和出场的条件&#xff0c;资金管理和风险控制等。策略有简单和复杂之分&#xff0c;简单的策略通常使用技术指标和价格行为&#xff0c;复杂的策略使用高阶数学和统计模型。 通常情况下&#x…

虚拟信用卡绑定paypal验证的教程

用于PayPal验证的虚拟卡教程 如果您的卡无法添加到您的paypal中。您必须需要联系支持才能知道您的账单地址和邮政编码。您可以使用银行卡设置自己的Paypal帐单邮寄地址。 1.使用可用的付款方式 2.使用您的PayPal帐户中提供的相同名称和地址注册卡。 3.登录到您的PayPal帐户并转…

银行卡号返回银行信息

支付宝的开放API, 银行卡校验接口 接口URL https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charsetutf-8&cardNo6230580000354174000&cardBinChecktrue 请求方式 GET 请求Query参数 参数名示例值参数类型是否必填参数描述_input_charsetutf-8Str…

如何提升APP端银行卡绑卡效率,应用移动端银行卡识别接口

随着互联网浪潮的推进&#xff0c;网上购物已不再稀奇&#xff0c;而作为线上支付的前提——绑定银行卡是必不可少的。但是五花八门的购物APP绑卡时都得一个一个的输入银行卡号是极不方便的&#xff0c;慢还容易出错。随着机器学习和人工智能的飞速发展&#xff0c;在计算机视觉…

根据银行卡号获取开户行及银行卡类型的demo(python、android 和ios)

最近更新了一个项目&#xff1a;关于银行卡匹(根据银行卡号获取开户行以及银行卡类型等信息)。 CSDN下载地址:https://download.csdn.net/download/wy363681759/10724995 ###背景&#xff1a; 当前网络上流传的较多的关于这俄中需求的工具类&#xff0c;大都较为过时&#xff…

输入银行卡号,可以自动识别到银行卡类型的方法

根据银行卡号信息可以自动识别到银行卡类型 下载依赖&#xff1a;npm install bankcardinfo 使用方法&#xff1a; 1: var BIN require(‘bankcardinfo’); 2&#xff1a;调用:两个参数&#xff0c;一个是卡号&#xff0c;一个是报错&#xff0c;以及返回的信息 BIN.getBank…

APP嵌入手机拍照银行卡识别接口,实现快速绑定银行卡号

受支付宝银行卡识别的启发&#xff0c;腾讯随后在微信、QQ中添加银行卡识别功能&#xff0c;通过技术上的创新提升用户支付的体验&#xff0c;均得到用户的肯定。为此&#xff0c;更多的行业用户希望在其业务系统中集成手机拍照银行卡识别功能&#xff0c;比如&#xff1a;证券…

九龙证券|避险情绪升温,黄金上破2000大关,概念股逆市大涨

A股今天早盘强势拉升&#xff0c;午后回落走低&#xff0c;两市成交额时隔1个月再度打破万亿&#xff1b;港股大幅跳水&#xff0c;恒生指数一度跌超3%。 详细来看&#xff0c;A股方面&#xff0c;三大股指早盘震动走高&#xff0c;午后在酿酒、金融等板块的拖累下回落。到收盘…

工业企业如何降费减负?度能智能电费优化了解一下

工业企业如何降费减负&#xff1f;度能智能电费优化了解一下 原文链接&#xff1a;https://www.idcs.cn/a/v2341 工业企业福利来啦&#xff01;工厂用电容量经常用不满&#xff0c;资源浪费&#xff0c;成本增加。百度新推出度能智能电费优化服务&#xff0c;也叫智能电网用电…

预付费系统中电费电价管理的分析与应用

0引言 随着自动化控制技术的不断完善&#xff0c;自动化系统已经可以在许多方面熟练的掌握人工需要做的操作。在电费电价管理中&#xff0c;自动抄表就有着人工远不能及的数据收集能力&#xff0c;而且自动抄表还有着成本低、不易出错率的好处。但近些年随着电力企业不断扩充用…

内蒙古电力交易对数据中心用电费用的影响分析

内蒙古电力交易对数据中心用电费用的影响分析 从北京往西北方向出发&#xff0c;沿着京藏高速驱车约5个小时&#xff0c;经过张家口&#xff0c;即可到达中国的“草原云谷”-内蒙古自治区乌兰察布市。凭借着优越的地理位置&#xff0c;全年平均气温4.3摄氏度、盛夏的平均气温18…

数据中心太废电?为省电费阿里和微软是这么做的....

数据中心是个非常耗电的庞大的家伙&#xff0c;据《中国数据中心能耗现状白皮书》显示&#xff0c;2015年数据中心的电耗达1000亿度&#xff0c;年耗电量超过全社会用电量的1.5%。在美国&#xff0c;2013年数据中心领域总用电量就达到恐怖的910亿度。同时据调研&#xff0c;至2…

电费计算

代码如下&#xff1a; import java.util.Scanner; public class Record { double lastRecord;//上月用电数 double curentRecod;//本月用电数 double usedAmount;//本月用电量 double usedFee;//本月电费 //获取上月和本月的用电数 public void setRcord() { Scanner scannew S…

2023开年第一涨!有省市IDC电费拟环比上浮23.41 %

2022年的最后几天&#xff0c;两大电网各省市公司再一次更新了代理购电工商业用户电价表&#xff0c;这意味着绝大部分数据中心即将引来“电费2023开年第一涨”。 “1439号文件”&#xff08;《关于进一步深化燃煤发电上网电价市场化改革的通知(发改价格〔2021〕1439号》&#…

1元课,学会小学数学应用题,你的孩子也能秒解“鸡兔同笼”

要说小学时遇到头疼的数学题有哪些&#xff1f;“鸡兔同笼”一定是其中之一。最近微博上有一个三岁的宝宝&#xff0c;在没人教的情况下&#xff0c;凭着自己逻辑清晰的计算思路解答出来。 对此&#xff0c;网友们在微博下纷纷留言&#xff0c;比如这位宝妈就说道&#xff1a; …

懒人版小学生1-6年级计算题练习(口算练习)可直接电脑上答题或者打印题目

[懒人版]小学生1-6年级计算题练习 欢迎使用软件编程语言软件功能软件操作流程下载地址软件使用到的工具 欢迎使用 网上众多小学生计算题练习&#xff08;小学生口算练习&#xff09;软件使用起来都不是很方便。网上现有类型基本上要么只能在电脑上答题&#xff0c;要么生成doc…