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

2023-05-16

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

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

请添加图片描述

如需代码,请联系博主

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • IntelliJ IDEA的Debug教程

    1 什么是Debug模式 它是供程序员使用的程序调试工具 xff0c 它可以用于查看程序的执行流程 xff0c 也可以用于追踪程序执行过程来调试程序 2 Debug模式操作流程 如何加断点 选择要设置断点的代码行 xff0c 在行号的区域后
  • opencv获取相机图像并发布为ROS节点

    仅记录工程中的使用 完整代码请查看 xff1a https github com chx725 cv and ros ROS是最普遍使用的机器人系统之一 xff0c 提供了各种功能包 xff0c 仿真环境 xff0c 模型 xff0c 可视
  • Java中两种方法实现栈和队列(面试)

    学到LinkedList xff0c 上课时老师提了一下代码实现栈和队列 xff0c 面试可能会用上 xff0c 就码了栈和队列两种实现方案 如有问题 xff0c 希望指出 一 栈 1 数组实现栈 span class token comm
  • docker容器迁移教程

    前言 被领导要求部署一个和测试环境一样的演示环境 xff0c 并且数据库也要同步过去 xff0c 服务器上的各种服务都是docker部署的 xff0c 由于之前docker玩的比较少 xff0c 所以还是踩了不少坑的 xff0c 在此记录一
  • Java多sheet模板导出表格

    前言 需求是这样的 xff0c 需要在页面导出列表表格时同时导出每项的详情数据 xff0c 而且详情表格并不是一个常规的二维表格 xff0c 就像图中这样的效果 xff0c 所以要解决的最主要两个问题就是 xff1a 多sheet实现 异形
  • docker容器时间不同步导致在java应用中获取的时间不正确问题

    一 前言 在把Java应用部署到docker容器时 xff0c 发现应用获取到的时间和现实时间相差了8个小时 xff0c 会导致一系列不必要的麻烦 二 解决方案 1 首选需要确保宿主机的时区和时间的准确 现在宿主机上用 date R 看一下
  • Caffeine一级缓存介绍和应用

    Caffeine介绍 redis和caffeine的区别 相同点就不用说 xff0c 广义上都是缓存的方式 咱们就说说不同 redis是将数据存储到内存里 xff1b caffeine是将数据存储在本地应用里caffeine和redis相比
  • Java中使用es条件构造器BoolQueryBuilder

    前言 由于es在java中查询没法像mybatis那样方便 xff0c 而且es的构造器使用也比较繁琐 xff0c 理解不是很方便 xff0c 所以写一篇文章来记录es构造器BoolQueryBuilder查询时各种条件的构造的正确姿势 教
  • 群晖docker容器内mysql部署和远程连接

    群晖docker容器内mysql部署和远程连接 1 docker内Mysql部署2 Mysql远程访问配置 1 docker内Mysql部署 首先在群晖docker内安装ubuntu镜像 xff0c 启用镜像时注意对容器和宿主机的端口映射进
  • eclipse的安装及配置PyDev插件(win10)

    原博文 xff1a Windows下安装Eclipse 43 python2 7 43 Pydev 一 安装eclipse 学习Java第一步就是装eclipse 我每学习一门语言都会先死在安装程序上 这个也一样 一 去eclipse官网下
  • 小微企业技术人员面试流程及常见问题整理分析

    技术人员面试流程 在同一个小的企业做久了 xff0c 当有人员离职后 xff0c 招聘中的面试的工作就落在了资历老一点的员工上 虽然不是专业的HR xff0c 但还是在此记录一下一些人员面试的基本流程步骤及主要内容 一 面试流程 1 接待应
  • Ubuntu 解决触摸板不识别问题

    Ubuntu 解决触摸板不识别问题 span class hljs built in sudo span vi etc default grub span class hljs comment 把GRUB CMDLINE LINUX 61
  • 图像的灰度化、二值化

    目录 1 图像像素点 2 灰度化 3 二值化 4 使用open cv库进行图片的灰度化 二值化 4 1 将图片转换为灰度图 4 2 将灰度图转换为二值化图图片 1 图像像素点 在图像处理中 xff0c 用RGB三个分量 xff08 R xf
  • 【嵌入式】stm32程序跳转实验

    嵌入式 stm32程序跳转实验 菜老越 于 2019 04 23 17 54 56 发布 2888 收藏 22 分类专栏 xff1a 嵌入式 文章标签 xff1a keil stm32 程序跳转 IAP BootLoader 版权 嵌入式
  • C++/C语言实现HTTP的GET和POST请求

    阅读目录 HTTP请求和IP TCP 实现GET请求 实现POST请求 xff1a 参考 xff1a 回到顶部 HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建sock
  • C++ 简单实现HTTP GET/POST 请求

    HTTP 超文本传输协议 是一种客户端与服务端的传输协议 xff0c 最早用于浏览器和服务器之间的通信 xff0c 后来因为其使用灵活 方便等特点 xff0c 广泛用于客户端与服务端的通信 文章将简单介绍HTTP协议 xff0c 同时以C
  • 分布式系统架构简单介绍

    目录 xff1a 一 什么是分布式系统 xff1f 二 为什么要走分布式系统架构 xff1f 三 系统如何进行拆分 xff1f 四 分布式之后带来的技术挑战 xff1f 一 什么是分布式系统 xff1f 在谈分布式系统架构前 xff0c 我
  • 使用javascript实现对于chineseocr的API调用

    ChineseOCR在线API 网页地址 界面 提供多种接口调用方式 xff0c 比如在线调用 Javascript api调用 curl api调用和python api调用四种方式 xff0c 本次使用javascript api调用的
  • Qt-QMessageBox用法详解

    QMessageBox 是 Qt 框架中常用的一个类 xff0c 可以生成各式各样 各种用途的消息对话框 xff0c 如图 1 所示 图 1 QMessageBox消息对话框 很多 GUI 程序都会用到消息对话框 xff0c 且很多场景中使
  • C++中UDP通讯详解

    C 43 43 Socket编程及TCP UDP通信代码实现 一 简介 Socket编程的目的是使网络的进程进行通信 xff0c 基于TCP IP协议簇 xff0c 通过三元组 xff08 ip地址 协议 端口 xff09 标志进程 xff

随机推荐