开发者学堂课程【阿里云 AIoT 物联网开发实战:快速学习 AIoT 企业物联网平台实战03】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/754/detail/13231
AIoT 企业物联网平台实战03
(2)、APP 端:轮巡查询业务服器,开机指令处理的结果是怎么样的,如果结果一致,可以直接告诉 APP 端的用户已经开机。
(3)、RRPC 的调用方式:APP 同样送开机指令到业务系统,业务系统调用RRPC的接口,需要传递等待的超时时间,指令调用到物联网平台后,物联网平台并不会立刻给业务系统返回结果,而是把消息先推送到设备端,等待设备端的回复,设备端回复后,物联网平台会自动的匹配和前面的请求的关系,然后把最终状态返回到业务系统。
这个业务系统是通过一条 HTTP 的调用,直接在 response 里拿到了设备的响应结果,可以实时的通过 ApI 的方式给到消费端,消费者也能实时的感知设备的状态。
下图是背后的技术实践,如图:
业务服务器发起 RRPC 的 API 调用,这里允许客户来传递超时时间是1~8秒,互联网平台收到这条请求之后并不会直接返回结果,而是给设备发送 MQTT 的报文,topic 上会携带 ID,设备收到 topic 消息后会做业务处理,处理后会响应 request加 ID,respond 加 ID,这两个 ID 要保持一致,互联网平台会匹配这两个 ID,匹配后会给业务服务器返回 HTTP response,可能是超时,也有可能是设备返回业务的结果。
交互的核心就是保持一致。
在真实的设备运行中会替换成具体的 id,设备回复的也需要回复这个 ID
5、调用示例:
(1)设备端模拟代码:
const mqtt require('aliyun-iot-mqtt');
//
设备属性
const options ={
productKey:"a1HDWBEeHRa", deviceName:"7rmjmujquyh",
deviceSecret:"d19e5469ae45cfaadad48f5443bc6356" regionId:"cn-shanghai"};
//
建立连接
const client mqtt.getAliyunIotMgttClient(options);
client.subscribe(*/sys/${options.productKey}/${options.deviceName}/rrpc/request/+`)
client.on('message', function(topic, message) {
if(topic.index0f(`/sys/${options.productKev}/${options.deviceName}/rrpc/request/`)>-1)
//
接收并处理业务系统RRPC指令 handleRrpc(topic, message)
})
function handleRrpc(topic, message){
topic =topic.replace("/request/',"/response/');
console.log("topic=" topic)
console.log("payload="+ message)
//
响应RRPC指令 payload自定义
const payloadJson ={bizCode:0};// 0
成功,400 充电失败client.publish(topic,JSoN.stringify(payloadJson));
}
(2)设备端调用过程:
//2.
构建RRPC 请求 const params ={
ProductKey:"a1HDWBEeHRa" DeviceName:"7rmjmujquyh",
RequestBase64Byte: new Buffer(JSON.stringify(payload)).toString("base64"), Timeout:B000};
co(function*() {
//3.
发起API调用 try {
const response=yield client.request('Rrpc'params);
console.log(JSON.stringify(response));
console.log(response.RrpcCode);
if(response.RrpcCode=="SUCCESS"){
var resultJSON =new Buffer(response.PayloadBase64Byte, "base64').toString();
console.log("RRPC SUCCESS =-===>",JSON.stringify(JSON.parse(resultJSON)));}
} catch (err){
console.log("RRPC ERROR =--==>",JSON.stringify(err.data));
}
});
运行效果如下图:
首先启动设备,他会和云平台建立链接,通过云端的API发送指令,发送出去后,云端也实时的给设备端响应了结果。
设备端收到了 topic 以及业务的报文
整个过程就是一个同步过程,如果是异步调用,是没有业务报文的。业务报文需要新的匹配。
三、广播消息和设备影子
1、广播消息
很多智能门锁接入到互联网平台,可能要周期性的来更新,门锁配置或者是批量的修改初始密码。
pub broadcast 广播的 API,通过广播 API,可以通过一个 API 调用触达几十万的设备,面向的是当前在线的全量设备。
调用方式:参数设置好后,调用广播的 API,广播 API 会直接把消息发送到全量设备上,瞬间触达几十万在线设备。
广播限制:只给当前在线的设备,比如说全部在线的门锁或者是全部在线的充电宝机柜,但是很多时候有一些配置目的是送达到量设备,但并不太关心设备当前是在线还是离线,只需要平台能把这个信息触达就可以了,如果是在线,就及时收到,如果不在线,下次上线的时候,这个信息给到他也可以的,这种场景更多的是配置的全量的配置参数的更新,针对产量的一些配置的更新,提供了设备影子的这样功能。
2、设备影子
通过设备影子服务端可以调用影子的 API,把配置信息直接写入到设备在云端的影子上,是否在线影响不大,只要数据成功的写到影子上,设备影子会和设备做这种实时的通讯,离线设备上线后及时的同步信息。
比如说灯的颜色,灯的亮度的值会实时同步给刚刚开开启的电灯,设备开启后它会把进行同步下来,然后直接把颜色调整成红色或者是亮度值80%的亮度,同样设备影子还有一个特点是他只缓存最后一条指令,比如说灯,当前的灯不在线,云端给灯推送了一条信息,要调整成红色、亮度50%,过了一秒钟云端又改变了想法,要调整成绿色、亮度80%,过了一段时间又调整了一下规则,改成紫色亮度20%,这时候当灯在这此刻上线的时候,灯收到的是紫色20%的配置参数,前面的配置过程是被影子给默置掉了,看到的灯就直接是紫色20%红色50%,又变成绿色了80%,又变成紫色20%,看到的结果,就是最终的这个影子的结果。
在控制台上,每一个设备上面也会有设备影子,整个设备影子的 jason 分几部分,状态包含两种,一种是云端的期望值,二是设备的真实情况的上报。以及原数据、期望值是在什么时间设置的,以及整个影子的版本。
同时我们的 SDK 也已经把影子做了完整的封装,只需要调用更新影子或者是获取影子的 API。
也可以来看一下 update shadow 更新影子的操作,更新的内容,哪个设备更新影子?以及获取影子的数据的,调用就会返回它的影子数据。
以上就是整个物联网平台开发涉及到的主链路上报,采集以及控制指令的下行。