天猫精灵家居对接第三方设备(详细版)

2023-05-16

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档·

文章目录

  • 前言
  • 补充准备阶段(内网映射到外网)
  • 一、天猫精灵官网配置准备
  • 二、天猫精灵部分实现代码
  • 三、天猫精灵配置技能广场
  • 四、天猫精灵语音调试测试
  • 总结

前言

随着物联网的发展,众多的硬件厂商都开发出自己的智能家居产品,智能音箱的问世,又让智能家居行业涌起一段浪潮,今天我带大家使用Java语言对接天猫精灵智能家居提供的Api,下面开始教程,请仔细阅读


准备阶段

将本地服务器发布到外网上 推荐使用工具为:花生壳

1、进入花生壳官网配置映射内网

​​​​​花生壳官网

2、

 

 补充本地服务器路由内网地址为:

下载PC端花生壳应用  

一、天猫精灵官网对接配置

  • 打开官网 天猫精灵开发官网

  •  点击技能开发
  • 点击添加技能配置信息如下

  •  配置完毕后选择产品开发添加新产品

设计信息如下:  

  •  介绍产品开发信息:

 

  • 1、账号的授权:
    • 点击账号授权跳转到厂商的授权页面 
    • 输入厂商中的账号密码登录
    • 登录成功后跳转发AliGennie回调地址并返回code
    • AliGennie通过code获取到access_token、refresh_token
    • AliGennie保存token信息

出现这个页面就说明配置成功了

​​​​​​​二、测试代码如下

  • controller层
@RequestMapping("/toLogin")
public String toLogin() {
        PageData pd = getPageData();
        HttpSession session = getRequest().getSession();
        session.setAttribute("oauth2", new HashMap<String, Object>(pd));
        return "/html/system/index/login/loginTMHome.html";
}
@Controller
@RequestMapping("device")
public class TianMaoTestContrllor {
    public static Device myDevice;

    static {
        JSONObject status = new JSONObject();
        status.put("powerstatus",1);
        myDevice = new Device
                    ("eelinker·eelinker","天猫测试","outlet","亿易联","test-socket","南美洲",
                            status,new JSONObject());
    }

    @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;
    }
}
  •   前端页面
<body onload="load()">
    <div class="background"></div>
    <div class="content">
        <div class="head">绑定天猫精灵</div>
        <div class="inp">
            <input id="phone" type="text" placeholder="用户名" maxlength="11">
        </div>
        <div class="inp">
            <input id="password" type="password" placeholder="密码">
        </div>
        <div class="code">
            <input id="code" type="text" placeholder="验证码">
            <img id="yzmImg" src="" alt="" onclick="load()">
        </div>
        <div class="btn">
            <button onclick="login()">绑定</button>
        </div>
    </div>
</body>
  • 实体类 
    
    @Data
    @AllArgsConstructor
    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;
    
    
    }
    

操作步骤:当在登录页面上输入的信息再做二次请求时可以获取这些信息进行具体的业务

访问路径校验权限/tianmao/home/login
进入权限validation拦截器key:PHONE   value:1231321
key:PASSWORD   value:123456
key:CODE   value:lyj61
=========================================
key:CODE  |  value:lyj61
key:PASSWORD  |  value:123456
key:PHONE  |  value:12312313
=========================================
sessioncode : LYJ61
内部方法:调用=========================================
key:response_type  |  value:code
key:redirect_uri  |  value:https://open.xxx.xxx.com/oauth/callback?skillId=91880&token=MjIxMzc3NDYxODMwNkFGRUhJTkZEVlE=
key:state  |  value:0.7748120350429886
key:client_id  |  value:Test
=========================================

例子:测试获取当前天猫精灵绑定的可用设备

 AliGennie会进入我们配置的网关:tianmao/home/getdevices

1、先判断操作的类型 比如:DiscoveryDevices请求 获取设备信息

访问路径校验权限/tianmao/home/getDevices
{
    "header":{
        "messageId":"40402a38-b764-4f71-a98b-a18661fdb84c",唯一的标识符
        "name":"DiscoveryDevices",程序名称
        "namespace":"AliGenie.Iot.Device.Discovery",命名空间
        "payLoadVersion":2协议版本
    },
    "payload":{
        "accessToken":"3107a0a628055992c0fa976d1fc92c56ebfbb33d"

        绑定码,用来开发商识别用户 会在请求是携带 返回时不需要携带
    }
}

2、然后按照协议返回对应的信息就好了,我这里是模拟一个假的设备数据返回了,封装类如下,可用作参考,主要是看官方文档:

{
    "payload":{
        "devices":[
            {
                "deviceType":"outlet",
                "extensions":{
                    
                },
                "zone":"NULL",
                "model":"WifiPower",
                "deviceId":"1446223",
                "deviceName":"Wifi插座",
                "brand":"亿益联·eelinker",
                "status":{
                    "powerstate":1
                }
            }
        ],
        "accessToken":"3107a0a628055992c2c92c56ebfbb33d"
    },
    "header":{
        "name":"DiscoveryDevicesResponse",
        "namespace":"AliGenie.Iot.Device.Discovery",
        "messageId":"40402a38-b764-4f71-a98b-a18661fdb84c",
        "payLoadVersion":2
    }
}

补充:产品不显示问题:

 

三、天猫精灵app技能广场配置

官方提供了一个供给开发者对接设备的一个接口。用户可以通过天猫精灵app里下载开发者创建的技能,绑定用户在开发者平台拥有的设备。让用户可以使用自己的天猫精灵访问我们的设备。

​ 但是在此之前,我觉得有必要让开发者首先知道,这个应用是怎么使用的。首先假设我们的技能发布上线了,那么我们需要做的是找到我们的技能,并且注册,且能够执行:

  • 1、打开天猫精灵app 并为其绑定一个天猫音箱(必须为开发者淘宝账户相关联)、
  • 2、进入首页面,也就是精灵家这里,然后点击技能广场,如果找不到,可以去”查看更多“按钮里面去寻找。进入技能广场,点击搜索按钮进入搜索界面查找我们发布的技能

四、调试天猫语音功能

下面就可以进行下一步了,设备的开关,点击上图中的在线调试按钮进入设备调试界面。调试界面如下,用户可以点击标准语料里的按钮,调试,在这里查询设备状态是不会发送请求的。但是设备开关和需要发送请求到开发者服务器的。

 设备入参: 2022-08-26 14:32:51.022 traceId = 0b085d4216614955709693511e87d7 ,request params = 打开插座

设备入参: 2022-08-26 14:32:51.963 traceId=0b085d4216614955709693511e87d7, Request to gateway URL : https://wwwxxxx//tianmao/home/getDevices

设备入参: 2022-08-26 14:32:51.965 HTTP Request Headers: Accept : application/json

设备入参: 2022-08-26 14:32:51.966 Request body : {"header":{"messageId":"9a7df45c-9f22-4667-98ee8ce9cb2dd00","name":"thing.attribute.set","namespace":"AliGenie.Iot.Device.Control","payLoadVersion":2},"payload":{"accessToken":"3107a0a628055992c0fa976d1fc92c56ebfbb33d","deviceIds":["1446263543"],"extensions":{"1446263543":{"aiIcon":"https://ai-genie-center.oss-cn-hangzhou.aliyuncs.com/app-data/iot-center/outlet800.png","productKey":"a19E6Wv0WAL"}},"params":{"powerstate":1}}

设备状态设置:

​ 能够查询设备状态了,之后就要进行设备的状态设置。依旧是判断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);
        }
    }
}

五、实际配合天猫精灵语音功能测试

  • 保证天猫精灵开机并绑定上开发测试的淘宝账号
  • 1、直接对天猫精灵呼叫命令控制打开插座
  • 2、在天猫精灵app上测试

教程如上:新人大佬勿喷

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

天猫精灵家居对接第三方设备(详细版) 的相关文章

  • [Adaptive Autosar]深入理解--Persistency

    目录 1 Per架构 2 Per初始化 3 Per错误处理 4 多进程访问 5 冗余存储 6 安装和更新per数据 7 Key Value 方式 8 file storage 方式 9 典型使用代码 Persistency模块对比 CP 中
  • 用Excel教会你PID算法!

    01 引入PID 电机控制 这样是没有反馈的 xff0c 也就是说我们完全相信输入的数字 xff0c 且是理想化的模型 xff0c 比如输入占空比为50 的25Kz的PWM xff0c 车轮速度为1m s xff0c 实际产品中会受到各种这
  • 带你快速理解FreeRTOS的代码规范~

    导读 遇到些朋友感觉FreeRTOS内核代码看起来很不习惯 xff0c 不习惯其编码风格 xff0c 本文就来梳理一下其代码规范 xff0c 便于提高阅读其代码的效率 代码基于FreeRTOS V10 4 3 FreeRTOS代码结构 其内
  • 单片机串口最底层的本质​!

    嵌入式开发中 xff0c UART串口是最常见的一种通信接口 xff0c 你知道为啥串口这么常见吗 xff1f 本文就带你深入了解串口最底层的本质内容 一 什么是串口通讯 xff1f 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行
  • 一个本科生学习嵌入式的心得~

    为毕业后能找到工作而读书 xff0c 本着务实精神 xff0c 从入学那一刻起就要开始准备找工作了 发这篇文章主要是针对大学刚接触嵌入式的同学 很多新手觉得嵌入式入门并不容易 xff0c 牵扯的内容 知识点太多 像C语言基础是否掌握 xff
  • 使用 Rust 进行嵌入式开发

    作者 xff1a RT Thread社区团队 liukang 原文链接 xff1a https club rt thread org ask article 2944 html Rust 是什么 Rust 是一门赋予每个人构建可靠且高效软件
  • STM32的SPI外设片选只有一个,怎么破?

    之前用STM32的SPI需要控制很多外部芯片 xff0c 可是一个SPI的外设只有一个片选 xff0c 要实现独立片选一主多从 xff0c 怎么实现呢 xff1f SPI总线拓扑 一般地 xff0c SPI总线按照下图方式进行连接 xff0
  • 编程规范 | 关于头文件的几条规范

    一般来说 xff0c 每一个 c或者 cpp文件对应一个头文件 h文件 xff0c 当然 xff0c 也有例外 xff0c 例如一些测试单元或者main文件 xff0c 头文件的一些规范可以令代码可读性 程序的性能等大为改观 xff0c 所
  • 10分钟教你在MDK中部署LVGL

    说在前面的话 说实话 xff0c LVGL这么有牌面的项目 xff0c 其维护者居然没听说过cmsis pack xff0c 这着实让我略为破防 xff1a 连lwIP都在Pack Installer里有个坑位 xff0c 难道这是个LVG
  • 国产高性能RISC-V通用MCU又来一个新成员!

    业界新锐MCU厂商先楫半导体宣布2022年5月正式推出 HPM6300系列 xff0c 这是继去年11月发布全球性能最强RISC V微控制器HPM6700 6400系列后 xff0c 再添一款新力量 集高性能 高实时 低功耗 高性价比于一身
  • 趟过这20个坑,才敢说自己是搞电的~

    电子工程师指从事各类电子设备和信息系统统研究 教学 产品设计 科技开发 生产和管理等工作的高级工程技术人才 一般分为硬件工程师和软件工程师 硬件工程师 xff1a 主要负责电路分析 设计 xff1b 并以电脑软件为工具进行PCB设计 xff
  • 【随笔篇】2019全国大学生电子设计竞赛回望与总结

    1 写在前面 2019全国大学生电子设计大赛已经落幕 xff0c 我和李同学各带一队斩获国一 短暂的休息后我们从国一的喜悦中恢复 xff0c 逐渐开始了新的征程 本来是希望能够通过电赛保研 xff0c 但无奈四非大学名额有限 xff0c 留
  • STM32的SPI外设片选只有一个怎么破?

    之前用STM32的SPI需要控制很多外部芯片 xff0c 可是一个SPI的外设只有一个片选 xff0c 要实现独立片选一主多从 xff0c 怎么实现呢 xff1f SPI总线拓扑 一般地 xff0c SPI总线按照下图方式进行连接 xff0
  • IT开发的岔路口:究竟是Java好还是嵌入式好?

    一份工作在一个人的生活中占据重要地位 xff0c 对于一个人的生活质量占据决定性作用 xff0c 可以说工作决定一个人一生 xff0c 对于选择工作当然是要选择新兴产业且有发展前途的行业 xff0c 那么在IT技术领域 xff0c 选择Ja
  • 做好一块PCB板不难,但做一块好PCB板却不容易!

    我们说做PCB板就是把设计好的原理图变成一块实实在在的PCB电路板 xff0c 请别小看这一过程 xff0c 有很多原理上行得通的东西在工程中却难以实现 xff0c 或是别人能实现的东西另一些人却实现不了 xff0c 因此说做好一块PCB板
  • 用python在树莓派上编程,你可以将项目扩展到令人难以置信的规模

    树莓派是一个非常廉价的 只有手掌大小的完全可编程的计算机 虽然树莓派的体积小 xff0c 但是它的潜力无限 你可以像使用常规台式计算机一样在树莓派上创建一个非常酷的工程 例如 xff0c 你可以用树莓派搭建你自己的家用云存储服务器 树莓派用
  • 很多人觉得FPGA难学,因为他们没总结出数电的尽头是模电!

    问 xff1a 本人零基础 xff0c 想学FPGA xff0c 求有经验的人说说 xff0c 我应该从哪入手 xff0c 应该看什么教程 xff0c 应该用什么学习板和开发板 xff0c 看什么书等 xff0c 希望有经验的好心人能够给我
  • 作为硬件工程师的基本技能,画PCB板有许多经验需要get!

    一 原理图常见错误 xff08 1 xff09 ERC报告管脚没有接入信号 xff1a a 创建封装时给管脚定义了I O属性 xff1b b 创建元件或放置元件时修改了不一致的grid属性 xff0c 管脚与线没有连上 xff1b c 创建
  • 如何判断CPU是否正在执行中断函数?

    1 这是一个有许多经验的攻城狮都遇到过的坑 xff0c 本文教你正确绕过这个坑 xff1b 2 教大家了解 get CONTROL的用法 xff0c 及xQueueSend和xQueueSendFromISR的区别 xff1b 问题来源 今
  • 一颗MCU可以搞定无人机的电机驱动+飞控算法!

    i MX RT跨界处理器具有实时操作和应用处理器级的功能 xff0c 其已经实际应用在智能交互 工厂自动化 智能支付终端 语音处理和语音识别等领域 xff0c 这些应用场景已经足以证明i MX RT的强大与广泛的适应性 除了前述的应用方向之

随机推荐

  • 重磅!美国最新14类技术出口管制来了,想买的基本都买不到了

    根据2018年国会通过的 出口管制改革法案 xff08 Export Control Reform Act xff09 要求 xff0c 美国商务部工业安全署 xff08 Department of Commerce Bureau of I
  • 从行业到技术,10+年资深工程师带你进行嵌入式行业职业规划!

    找一个好工作 xff0c 谈一份好薪水详细这也是大部分人的心愿 xff0c 那么嵌入式行业该如何规划呢 xff1f 下面我们从几方面来深入探讨 1 了解嵌入式行业 嵌入式系统的应用已经覆盖到我们的生产 工作和生活的各个方面 小到智能家电 x
  • mitmproxy下载安装配置

    具体介绍可以参考 xff1a Mitmproxy mitmdump中文文档以及配置教程 守护式等待 博客园 我记录下自己操作过程中的一些细节 目录 一 下载 二 PC证书生成及安装 三 安卓端证书安装 xff08 雷电模拟器 xff09 x
  • 5G,带给嵌入式产业的机会在哪里?

    从现在开始 我们将会目睹5G 的爆发式成长 5G最突出的优点在于低时延和点对点的快速高效通信 那么它会给嵌入式产业带来哪些机会呢 嵌入式工程师面对5G的到来 又需要做哪些方面的准备和改变呢 最近 单片机与嵌入式系统应用 邀请了业内专家 公司
  • 在ubuntu+vs code上通过HTTP协议实现服务器端和客户端通信

    一 操作系统 xff1a Ubuntu16 0 4 xff08 两台虚拟机 xff09 二 编译工具 xff1a vs code xff08 相关配置见之前的文章vs code安装与配置 xff0c 在搜索C 43 43 配件时 xff0c
  • 树莓派设置开机自启动任务导致无法进入系统

    环境 树莓派 32位 问题描述 使用 Hugo 搭建博客后 xff0c 每次启动树莓派都要手动执行在博客文件夹下执行 hugo server watch 命令 xff0c 想要使用开机自启动方式 按照网上方式 xff1a 将写好的脚本 sh
  • 功能齐全的串口调试工具——串口猎人

    1 xff0c 简介 官方介绍 xff1a 串口猎人 Serial Hunter 是一款强大实用的串口调试工具 xff0c 串口猎人调试工具能以十六进制显示信息 xff0c 可进行基本发码 xff0c 高级收码和发码 xff0c 显示波形及
  • 旷视张祥雨:高效轻量级深度模型的研究和实践 | AI ProCon 2019

    演讲嘉宾 张祥雨 xff08 旷视研究院主任研究员 基础模型组负责人 xff09 编辑 Just 出品 AI科技大本营 xff08 ID rgznai100 xff09 基础模型是现代视觉识别系统中一个至关重要的关注点 基础模型的优劣主要从
  • 深挖谷歌 DeepMind 和它背后的技术

    作者 James Murphy 译者 天道酬勤 责编 Carol 出品 AI科技大本营 xff08 ID rgznai100 xff09 人工智能 AI 的子集已经成倍增长 xff0c 并完成了只有人类才能完成的各种任务 像机器学习这样的技
  • 无限想象空间,用Python玩转3D人体姿态估计

    前言 姿态估计 xff0c 一直是近几年的研究热点 它就是根据画面 xff0c 捕捉人体的运动姿态 xff0c 比如 2D 姿态估计 xff1a 再比如 3D 姿态估计 xff1a 看着好玩 xff0c 那这玩应有啥用呢 xff1f 自动驾
  • 如何成为一名合格的算法工程师?我们做了一次技能拆分…

    文 张相於 成为一名合格的开发工程师不是一件简单的事情 xff0c 需要掌握从开发到调试到优化等一系列能力 xff0c 这些能力中的每一项掌握起来都需要足够的努力和经验 而要成为一名合格的机器学习算法工程师 xff08 以下简称算法工程师
  • 马上 2018 年了,该不该下定决心转型AI呢?

    本文授权转自知乎 如此火爆的AI xff0c 会不会像Android和iOS一样 xff0c 五年后归于平淡 xff1f 转型AI真的有必要吗 xff1f 2017年 xff0c AI就像一个点石成金的神器 xff0c 所有的行业 xff0
  • 一文看懂深度学习发展史和常见26个模型

    参加 2019 Python开发者日 xff0c 请扫码咨询 来源 AI部落联盟 xff08 ID xff1a AI Tribe xff09 作者简介 xff1a 沧笙踏歌 xff0c 硕士毕业于北京大学 xff0c 目前计算机科学与技术博
  • QT的QMessageBox

    QMessageBox是弹出的消息框 xff0c 分为 xff1a 错误 消息 问题 警告 span class token comment 具体参数如下 xff1a span span class token function criti
  • 我在旷视研究院做检测 | 技术头条

    作者 俞刚 xff0c 旷视研究院Detection组负责人 2014年博士毕业于新加坡南洋理工大学 xff0c 加入旷视 主要负责检测 xff0c 分割 xff0c 跟踪 xff0c 骨架 xff0c 动作行为等方面的研究以及算法落地工作
  • 63万张!旷视发布最大物体检测数据集Objects365 | 技术头条

    编辑 琥珀 来源 AI科技大本营 xff08 id xff1a rgznai100 xff09 昨日 xff0c 在旷视科技联合北京智源人工智能研究院举办的发布会上 xff0c 旷视研究院发布了物体检测数据集 Objects365 xff0
  • C语言中跨文件的全局变量

    声明 xff1a 突然看到这篇文章 xff0c 发现了c语言中使用全局变量的错误 xff0c 特转之 首先看一段代码 xff08 https gist github com 3760736 xff09 func c 1 2 3 4 5 6
  • debian/ubuntu增加自定义启动服务

    1 创建启动服务文件 vi lib systemd system sdvn service Unit Description 61 sdvn After 61 network target Service Type 61 forking E
  • ROS环境下Pixhawk+XPlane半实物仿真

    使用pixhawk作为飞控开发固定翼飞机的相关应用时 xff0c 半实物的仿真环境可以很好的模拟真实的飞行环境 本文介绍了借助Mavros软件包实现ROS环境下机载处理的半实物仿真环境搭建 实验所需软硬件 xff1a pixhawk xff
  • 天猫精灵家居对接第三方设备(详细版)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言补充准备阶段 xff08 内网映射到外网 xff09 一 天猫精灵官网配置准备二 天猫精灵部分实现代码三 天猫精灵配置技能广