天猫精灵家居对接第三方设备(详细版)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档·
文章目录
- 前言
- 补充准备阶段(内网映射到外网)
- 一、天猫精灵官网配置准备
- 二、天猫精灵部分实现代码
- 三、天猫精灵配置技能广场
- 四、天猫精灵语音调试测试
- 总结
前言
随着物联网的发展,众多的硬件厂商都开发出自己的智能家居产品,智能音箱的问世,又让智能家居行业涌起一段浪潮,今天我带大家使用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")@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;}
}
- 前端页面
<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上测试
教程如上:新人大佬勿喷
天猫精灵家居对接第三方设备(详细版)相关推荐
- 毕业设计--20200228--内网搭建domoticz系统 frp内网穿透实现天猫精灵控制内网设备
记录一下三天的成果. 花费了3天的时间 我在树莓派上面搭建了一个domoticz 的智能家居系统 然后利用frp 去实现将本地的内网地址 穿透到 公网上面的 阿里云的个人服务器的8080 端口, 最终 ...
- 天猫精灵智能设备对接(8) 开发者网关地址
洋洋洒洒六七千字已经搭进去了,终于把服务器篇写的差不多了,当然小狂不是专业的写手,有些东西写的凑合看吧,只是说明过程,并不修饰言辞,看的舒服就点个赞,不舒服就当学东西了吧.这篇文章我们将完成天猫精灵服 ...
- 天猫精灵智能设备对接(7) OAuth2.0
在开始之前先放两篇参考,一篇英文http://bshaffer.github.io/oauth2-server-php-docs/cookbook/,一篇中文https://www.cnblogs.c ...
- 天猫精灵智能设备对接—前篇(1)
本系列文章小狂决定一步步来完成其他智能设备与天猫精灵的对接,简单粗暴的目的就是使用ESP8266或者其他的wifi设备制造一个智能设备,完成一次天猫精灵智能音箱对我们自己制造的智能设备的控制,以来验证 ...
- 天猫精灵智能设备对接(3)
这一篇文章主要讲解服务器端的设置,这里我使用的是腾讯云,当时学生价1块钱一个月买的,现在的学生价涨到了10块,为我当时的机智点赞.为什么一定要使用服务器呢,这个是因为天猫精灵协议的对接是云服务器与云服 ...
- 天猫精灵 python_跟着小狂玩天猫精灵智能设备对接--硬件篇
本帖最后由 3guoyangyang7 于 2017-12-12 22:55 编辑 做了三天的东西,写了将近4天的文章,把技术的内容通过语言描述出来还是比本身做技术难得的多也要费时间的多.这也是对接天 ...
- 天猫精灵智能设备对接(2)
一.准备条件 1. 云服务器的支持(当然可以使用内网穿透) 2. 域名的支持 3. SSL认证书. 4. 当然最重要的要有一个天猫精灵,我99买的,我99买的,我99买的,(秀一波) 二.软件 ...
- java加按钮_如何从零开始对接第三方登录(Java版):QQ登录和微博登录
阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了HashMap和TreeMap的知识,今天跟大家分享下对 ...
- 如何从零开始对接第三方登录(Java版):QQ登录和微博登录
前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了QQ和微博这2大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小坑,但不算多,完整记录下来方便后来人快速对接. 后台设 ...
- java中如何实现qq登录与微博登录,如何从零开始对接第三方登录(Java版):QQ登录和微博登录(2)...
到了这一步基本上涉及第三方的就结束了,是不是很简单?后面无非就是如何插入.如何存放token.写入session等. 有几点注意事项: 相关文档官网已经写得非常细了,但是相当乱: 这个我就不详细讲了, ...
最新文章
- 第二章 Servlet核心技术 实训二
- C#一个事件中调用另一个事件
- 传说中的WCF(5):数据协定(a)
- 区块链与边缘计算(3)系统介绍
- 蓝桥杯第七届决赛真题大全题解(java版本)
- Openfire及Spark配置(Mac)
- 神策数据迁移服务正式上线,以服务产品化迎战云迁移难题
- Springmvc的服务端数据验证-----Hibernate Validator
- centOS7 安装mysql 设置远程访问
- Java容器的遍历之增强for循环
- 关于token你需要知道的
- python参数传递_python参数的传递
- RF模型(随机森林模型)详解
- 加权平均数的例子_EXCEL 加权平均数的计算
- scanf输入回车问题
- 大数据解读:穹顶之下,谁在关注雾霾
- 软件工程微信平台作业总结
- Interactive natural language question answering over knowledge graphs论文导读
- 小米笔记本 wifi 频繁断开重连 解决方案
- 国科大数字图像处理(复习与整理)
热门文章
- Android、Symbian系统手机通讯录和Google Gmai同步
- Installing VMware Tools, please wait解决办法
- CMMI2.0和1.3之间的区别有哪些?
- 截图工具-picpick绿色破解版免安装
- 不知道PDF转Word用什么软件?试试这3款实用软件
- 网赚在线之Cashfiesta公司网上赚钱全攻略
- st7789 旋转_玩转 ESP32 + Arduino(二十八) TFT_eSPI库驱动ST7789
- UMD 被淘汰了吗?不考虑的 UMD 的库如何在纯 UMD 前端项目中运行?
- 计算机科学技术学报官网convex,计算机学报chin
- 魔兽世界单机服务器物品查询,魔兽世界单机版gm命令-物品代要码大全.doc