天猫精灵智能家居对接,及天猫iot官网配置图文讲解(二)

天猫精灵智能家居对接,及天猫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;
}

​ 这里面的一些信息介绍

  1. deviceId,由开发者自己定义,长度不限,

  2. deviceName,设备被别名,也是由用户自己定义,开发者保存

  3. deviceType,这里不能随便填写,要和阿里精灵平台中的产品品类一致,但是不用填写中文,填写outlet就可以了

  4. brand,也是要和途中的产品品牌一致,这里是填写:“中文名·英文名”(图片这里有复制按钮)

  5. model,这里是开发者自己定义的代码数据了内容和产品型号是一致的

  1. zone,产品所在的位置,例如厨房,客厅,办公室这些。

    这个值,只会在第一次设备发现的时候提交有用,之后重复提交,都不会修改这个值,唯一有效的就是设备更新,告诉官方服务器设备已经被删除,然后再提交一次,这样就是一个新设备了。

  2. status,设备属性,这里的属性暂时只设置有开关两个,子参数为powerstate:1

  3. extensions,设备扩展信息

    ​ 下面创建一个类,模拟设备,内容如下

​ 路径映射方法如下

    @RequestMapping("getDevices")
    @ResponseBody
    public 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);
        }
    }
}

​ 去调试界面看看,点击打开插座和关闭插座,得到如下反馈

posted @ 2022-01-12 09:57  码龙一号  阅读(275)  评论(0)    收藏  举报