php对接AliGenie天猫精灵服务器控制智能硬件esp8266③ 渗入熟悉AliGenie 对接协议,揭开第三方云平台是如何让天猫精灵是发送消息到私有服务器的!

Posted 半颗心脏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php对接AliGenie天猫精灵服务器控制智能硬件esp8266③ 渗入熟悉AliGenie 对接协议,揭开第三方云平台是如何让天猫精灵是发送消息到私有服务器的!相关的知识,希望对你有一定的参考价值。



文章目录

一、前言;

  • 新年也快来临了,一个月没写嵌入式开发代码了。临近年末,工作也就不断加紧,偶尔做下自己的服务器!天猫精灵对接已经完毕,今天抽出点时间,终于可以写下这篇文章了。
  • 毕竟自己出身嵌入式,又自学于网络编程,这对整个协议的流程了解容易上手!因为涉及到一些商业机密,不想被骂!我这里就不在多详细地做笔记,只做协议分析,和在开发过程中遇到的坑。如有需要技术讨论,请加群群里大牛一起讨论。

二、天猫精灵如何授权?


  • 上篇文章已经提到,在开发时期,天猫精灵服务器官网会向我们在后台填写的地址发起一个 oauth2.0协议的请求,要识别这个是否oauth2.0的请求,需要自己来做判断。下面,我们来看看我的后台授权截图:、
    • 天猫精灵发起请求,之后,我们自己向用户展示一个登录界面 ,用来绑定此账号下面的所有设备。
    • 服务器验证密码账号是否正确,之后天猫精灵会拿我们的授权码去兑换access_token,然后我们根据这个access_token就可以识别是天猫精灵根据哪个用户来请求数据了。
    • 下面的是aligenie服务器后台授权,当我们的应用被通过审核就可以在天猫精灵app上操作这个了!


三、天猫精灵请求有哪些?


  • 开始这个的讲解,要知道天猫精灵服务器很人性化,把设备的某个属性作为技能点来写入和读取,这种编程思想让我很感觉到是AI时代的进步!那么,下面的协议都是涉及有技能点设计以及请求的动作!
  • 上面已经提到了如果授权成功,那么天猫精灵会来向我们的服务器发起请求,那么我们服务器需要怎么样来做判断这个请求了?其实在开发文档中非常详细了:点我查看

  • 协议请求时候,都是json数据,以下面控制为例:
{
  "header":
      "namespace":"AliGenie.Iot.Device.Control",
      "name":"TurnOn",
      "messageId":"1bd5d003-31b9-476f-ad03-71d471922820",
      "payLoadVersion":1
   ,
   "payload":
       "accessToken":"123456789abc",
       "deviceId":"34234",
       "deviceType":"light",
       "attribute":"powerstate",
       "value":"on",
       "extensions":
          "extension1":"",
          "extension2":""
      
    
 }
  • messageId是作为调试追踪某个消息来的,总的来说,没什么用!
  • 其实我们看header里面的namespace就可以知道天猫精灵请求都是什么内容了!总的来说就只有三个:
namespace含义
AliGenie.Iot.Device.Discovery设备发现,天猫精灵来请求当前用户的设备列表
AliGenie.Iot.Device.Control设备控制,控制某个设备
AliGenie.Iot.Device.Query设备属性查询,查询某个设备的状态

3.1 发现设备列表:


  • 以下面为例,简单分析天猫精灵在请求什么?
    • name就是上面我们说的在设备发现,说明天猫精灵来请求当前用户的设备列表了。
    • 那么这个天猫精灵是指哪个用户呢?我们根据颁发的accessToken来做识别就好了!

	"header": 
		"messageId": "bf5a411b-e65f-486f-84ed-123456789902",
		"name": "DiscoveryDevices",
		"namespace": "AliGenie.Iot.Device.Discovery",
		"payLoadVersion": 1
	,
	"payload": 
		"accessToken": "d4c3e4c57f7415dac5be"
	


3.2 查询某个设备属性:

  • 因为目前天猫精灵不支持多设备查询!以下面单个设备查询为例:
    • 首先我们服务器来看看这个accessToken是否有效期内?
    • 那么我们怎么知道这时候天猫精灵要查询哪个设备呢?看deviceId这个字段,这个字段是我们在发现设备时候返回给它的,查询或者控制时候,都是根据这个字段来的!

	"header": 
		"messageId": "68a1f301-bc43-4cec-86d6-123456",
		"name": "Query",
		"namespace": "AliGenie.Iot.Device.Query",
		"payLoadVersion": 1
	,
	"payload": 
		"accessToken": "0a8bb37def2b45e3e3c5d9c8af",
		"attribute": "",
		"deviceId": "a226",
		"deviceType": "light",
		"value": ""
	


3.3 控制某个设备:

  • 以下面控制为例
  • 下面大概意思是:**控制deviceIdabc28的设备灯类型的色温为 2 **。
  • name是指设置动作,attribute是指其属性,value就是指其具体的数值了!可以为字符型或者整型!大家可以慢慢琢磨!

	"header": 
		"messageId": "8c134775-7640-4073-a9ad-a513483622222",
		"name": "SetColorTemperature",
		"namespace": "AliGenie.Iot.Device.Control",
		"payLoadVersion": 1
	,
	"payload": 
		"accessToken": "0a8bb37def2b45e3e3",
		"attribute": "colorTemperature",
		"deviceId": "abc28",
		"deviceType": "light",
		"value": "2"
	


四、天猫精灵请求我们应该如何响应?


  • 响应的格式那肯定要遵循天猫精灵的文档协议,要不然它会说我好像遇到了阻碍,智能家居遇到了问题!
  • 每次响应的name正常的话都是在后面加个Response"
  • 注意响应格式的头部必须要application/json;

4.1 发现设备列表响应:

  • payload是我们的设备列表,而里面是一个对象数组,下面为例是2个设备,每一个设备里面都要有下面的字段,具体的含义自己去看文档。每个字段都是有意义的!要严格遵循!
  • 还有要注意的是,其不能包含特殊字符,要不然在天猫精灵app会显示不了!
  • 有个坑就是:actions字段官网说该设备支持的技能点,但是在控制时候,天猫精灵还是发生其他技能点的控制信息来,感觉这个返回什么天猫精灵都没用的!

	"header": 
		"namespace": "AliGenie.Iot.DeviceCenter.Discovery",
		"name": "DiscoveryDevicesResponse",
		"messageId": "bf5a411b-e65f-486f-84ed-52891222222222222",
		"payLoadVersion": 1
	,
	"payload": 
		"devices": [
			"deviceId": "28",
			"deviceName": "\\u53cc\\u8272\\u706fB4E6",
			"deviceType": "light",
			"zone": "",
			"brand": "",
			"model": "\\u534a\\u9897\\u5fc3\\u810f\\u54c1\\u724c",
			"icon": "https:\\/\\/www.domain.cn\\/files\\/ali_light.jpg",
			"properties": [
				"name": "powerstate",
				"value": "off"
			],
			"actions": ["TurnOn", "TurnOff", "SetBrightness", "AdjustBrightness", "SetTemperature", "Query"],
			"extensions": 
				"extension1": "",
				"extension2": ""
			
		, 
			"deviceId": "26",
			"deviceName": "cwLight68C6",
			"deviceType": "light",
			"zone": "",
			"brand": "",
			"model": "\\u534a\\u9897\\u5fc3\\u810f\\u54c1\\u724c",
			"icon": "https:\\/\\/www.domain.com\\/files\\/ali_light.jpg",
			"properties": [
				"name": "powerstate",
				"value": "off"
			],
			"actions": ["TurnOn", "TurnOff", "SetBrightness", "AdjustBrightness", "SetTemperature", "Query"],
			"extensions": 
				"extension1": "",
				"extension2": ""
			
		]
	


4.2 查询某个设备状态回应:

  • 下面可以看到,多了properties这个字段,而且里面都是一个数组,都是以键值对存在的!
  • 当你对天猫精灵说客厅灯打开了吗?,就会查询客厅灯设备状态。如果返回下面,就会说:客厅灯当前为打开状态,色温为2700,亮度为65。天猫精灵会不断地把properties里面的属性一个一个读出来!@_@

	"properties": [
		"name": "powerstate",
		"value": "on"
	, 
		"name": "onlinestate",
		"value": "online"
	, 
		"name": "remotestatus",
		"value": "on"
	, 
		"name": "colorTemperature",
		"value": 2700
	, 
		"name": "brightness",
		"value": 65
	],
	"header": 
		"namespace": "AliGenie.Iot.Device.Query",
		"name": "QueryResponse",
		"messageId": "0e2d981a-081b-44b6-9aa7-123456789",
		"payLoadVersion": 1
	,
	"payload": 
		"deviceId": "abc28"
	


4.3 控制某个设备回应:

  • 这个回应就比较简单了: name数值为TurnOnResponse,然后在payload后面加上这个设备的deviceId就可以了!
{
  "header":
      "namespace":"AliGenie.Iot.Device.Control",
      "name":"TurnOnResponse",
      "messageId":"1bd5d003-31b9-476f-ad03-71d471922820",
      "payLoadVersion":1
   ,
   "payload":
      "deviceId":"34234"
    
 }

五、其他

  • 后台配置详情:

  • 之后,我们就可以在天猫精灵APP看到我们的设备了,品牌是半颗心脏,呵呵!

以上是关于php对接AliGenie天猫精灵服务器控制智能硬件esp8266③ 渗入熟悉AliGenie 对接协议,揭开第三方云平台是如何让天猫精灵是发送消息到私有服务器的!的主要内容,如果未能解决你的问题,请参考以下文章

小米电饭煲怎么连接天猫精灵

蓝牙Mesh笔记 ①ESP32-C3 模组上实现天猫精灵蓝牙 BLE Mesh AliGenie 接入,无需WiFi 连接也可以实现天猫精灵语音控制。

蓝牙Mesh笔记 ①ESP32-C3 模组上实现天猫精灵蓝牙 BLE Mesh AliGenie 接入,无需WiFi 连接也可以实现天猫精灵语音控制。

天猫精灵能连接小米智能设备吗

对接天猫精灵X1 (https 的申请)

天猫精灵对接1:outh对接