天猫精灵智能家居对接,及天猫iot官网配置图文讲解(二)
2、天猫精灵设备对接
2-1、介绍
上一章里,我已经讲了天猫精灵的技能配置,设备创建,登录验证这三个部分做了,此次篇文章就讲之后的设备查询,设备信息上报,以及获取开发权限。
文章地址
天猫精灵智能家居对接,及天猫iot官网配置图文讲解(一)
2-2、设备查询请求
在之前的文章中,最后面写的登录验证。在用户走到这一步时,会向服务器发送请求,请求内容在官方文档中很详细了。这里可以用一个类封装这些数据,格式是固定的
用spring方法体中的@RequestBody,路径方法中接收参数,具体代码可以使用fastjson jar包,将字符串转成JSONObject格式的类之后,下一步就是执行具体的业务了。
启动项目,开始测试,可以看到,下面的图片是接收到的请求路径和它所携带的数据。内容和官方提供的是一致的。
之后对代码进行处理,代码的功能主要还是看header中的namespace和name这两个标签,访问返回中,namespace不用修改,但是要修改的是name。messageId保留不动,在此之前要了解一下设备发现中返回的设备协议。这边对设备进行封装。代码如下,构造方法,get,set和toString也是由读者自己生成。
public class Device {/*** 设备id*/private String deviceId;/*** 设备别名*/private String deviceName;/*** 设备英文名*/private String deviceType;/*** 设备品牌*/private String brand;/*** 产品型号*/private String model;/*** 位置,这里是指厨房,客厅这些*/private String zone;/*** 设备状态*/private JSONObject status;/*** 设备的扩展信息*/private JSONObject extensions;
}
这里面的一些信息介绍
-
deviceId,由开发者自己定义,长度不限,
-
deviceName,设备被别名,也是由用户自己定义,开发者保存
-
deviceType,这里不能随便填写,要和阿里精灵平台中的产品品类一致,但是不用填写中文,填写outlet就可以了
-
brand,也是要和途中的产品品牌一致,这里是填写:“中文名·英文名”(图片这里有复制按钮)
-
model,这里是开发者自己定义的代码数据了内容和产品型号是一致的
-
zone,产品所在的位置,例如厨房,客厅,办公室这些。
这个值,只会在第一次设备发现的时候提交有用,之后重复提交,都不会修改这个值,唯一有效的就是设备更新,告诉官方服务器设备已经被删除,然后再提交一次,这样就是一个新设备了。
-
status,设备属性,这里的属性暂时只设置有开关两个,子参数为powerstate:1
-
extensions,设备扩展信息
下面创建一个类,模拟设备,内容如下
路径映射方法如下
@RequestMapping("getDevices")@ResponseBodypublic Map<String, Object> handler(@RequestBody String json) {Map<String, Object> map = new HashMap<>();JSONObject object = JSONObject.parseObject(json);JSONObject header = object.getJSONObject("header");JSONObject payload = object.getJSONObject("payload");if (header != null && payload != null) {String namespace = header.getString("namespace");String name = header.getString("name");//判断请求是否是属于“设备发现”if ("AliGenie.Iot.Device.Discovery".equals(namespace) && "DiscoveryDevices".equals(name)) {//创建一个数组类存储数据JSONArray array = new JSONArray();JSONObject deviceInfo = new JSONObject();deviceInfo.put("deviceId", myDevice.getDeviceId());deviceInfo.put("deviceName", myDevice.getDeviceName());deviceInfo.put("deviceType", myDevice.getDeviceType());deviceInfo.put("brand", myDevice.getBrand());deviceInfo.put("model", myDevice.getModel());deviceInfo.put("zone", myDevice.getZone());deviceInfo.put("status", myDevice.getStatus());deviceInfo.put("extensions", myDevice.getExtensions());array.add(deviceInfo);payload = new JSONObject();//数据存入payload.put("devices", array);//数据name修改header.put("name", "DiscoveryDevicesResponse");}}//数据返回map.put("header", header);map.put("payload", payload);System.out.println(map);return map;}
下面就可以进行下一步了,设备的开关,点击上图中的在线调试按钮进入设备调试界面。调试界面如下,用户可以点击标准语料里的按钮,调试,在这里查询设备状态是不会发送请求的。但是设备开关和需要发送请求到开发者服务器的。
2-3设备状态设置
能够查询设备状态了,之后就要进行设备的状态设置。依旧是判断name和namespace这两个参数。之后进行数据的设置及返回。这里的代码如下,判断请求是否属于属性设置,之后遍历发送来的设备列表,按照params的内容进行设置。并返回。res的内容设置,可以参考设备控制响应协议格式,返回数据使用的是deviceResponseList这个key值。
if (header != null && payload != null) {String namespace = header.getString("namespace");String name = header.getString("name");//判断请求是否是属于“设备发现”if ("AliGenie.Iot.Device.Discovery".equals(namespace) && "DiscoveryDevices".equals(name)) {...} else if ("AliGenie.Iot.Device.Control".equals(namespace) && "thing.attribute.set".equals(name)) {JSONArray array = payload.getJSONArray("deviceIds");if (myDevice.getDeviceId().equals(array.get(0))) {//这里的params是有多个参数的,这里只接收开关状态请求,其他请求忽略int set = payload.getJSONObject("params").getInteger("powerstate");myDevice.getStatus().put("powerstate", set);//请求返回JSONObject res = new JSONObject();res.put("deviceId", array.get(0));res.put("errorCode", "SUCCESS");res.put("message", "SUCCESS");JSONArray resArr = new JSONArray();resArr.add(res);payload = new JSONObject();payload.put("deviceResponseList", resArr);}}
}
去调试界面看看,点击打开插座和关闭插座,得到如下反馈
如需代码,请联系博主