IoT 物联网平台自定义Topic同步调用RRPC实战(二)
RRPC:Revert-RPC。RPC(Remote Procedure Call)采用客户机/服务器模式,用户不需要了解底层技术协议,即可远程请求服务。RRPC则可以实现由服务端请求设...
RRPC:Revert-RPC。RPC(Remote Procedure Call)采用客户机/服务器模式,用户不需要了解底层技术协议,即可远程请求服务。RRPC则可以实现由服务端请求设备端并能够使设备端响应的功能。
为了适应智能灯开灯,智能锁开锁,充电宝弹出,自动售货机付款后出货,按摩椅启动等业务场景,应用服务器通过POP API发起RRPC调用,IoT设备端只需要在Timeout内,按照固定的格式回复Pub消息,服务端即可同步获取IoT设备端的响应结果。
技术原理
服务端同步RRPC调用业务流程如下:
设备端开发
我们以充电桩场景为例,用户完成付款后,服务端推送充电指令,并实时获取设备处理结果。
指令示例如下:
Topic: /ext/rrpc/1234252323/charging/cmd
Payload: {"power": 200,"port":"3"}
设备响应示例:
Topic: /ext/rrpc/1234252323/charging/cmd
Payload: {"bizCode": 0,"errMsg":"xxxxx"}
创建充电桩产品,并注册设备。
为了配合自定义Topic的RRPC调用,设备端需要在MQTT的CONNECT参数clientId中增加 ext=1 标识:
设备端监听RRPC指令Topic,开启指定把枪充电,并返回响应结果。示例代码如下:
const mqtt = require('aliyun-iot-mqtt');
// 1.设备身份三元组
const options = {
productKey: "Your productKey",
deviceName: "Your deviceName",
deviceSecret: "Your deviceSecret",
regionId:"cn-shanghai"
};
// 2.建立连接
const client = mqtt.getAliyunIotMqttClient(options);
// 3.订阅RRPC主题
client.subscribe(`/ext/rrpc/+`)
client.on('message', function(topic, message) {
console.log("topic <<=" + topic)
console.log("payload <<=" + message)
if(topic.indexOf(`/ext/rrpc/`)>-1){
// 接收并处理业务系统RRPC指令
handleRrpc(topic, message)
}
})
function handleRrpc(topic, message){
//响应RRPC指令 payload自定义
const payloadJson = {bizCode:0};// 0 成功,400 充电失败
console.log()
console.log("reply topic =>>" + topic)
console.log("reply payload =>>" + JSON.stringify(payloadJson))
client.publish(topic, JSON.stringify(payloadJson));
}
服务端开发
服务端通过RRPC API即可发起同步调用,实时获取设备端响应结果。
RRPC API文档地址:
https://help.aliyun.com/document_detail/69797.html
我们以Node.js发起同步调用,代码示例:
const co = require('co');
const RPCClient = require('@alicloud/pop-core').RPCClient;
const options = {
accessKey: "your accessKey",
accessKeySecret: "your accessKeySecret"
};
//1.初始化client
const client = new RPCClient({
accessKeyId: options.accessKey,
secretAccessKey: options.accessKeySecret,
endpoint: 'https://iot.cn-shanghai.aliyuncs.com',
apiVersion: '2018-01-20',
opts: {
timeout: 9000
}
});
// 指令内容
const payload = {
power: 200,
port: 3
};
//2.构建RRPC 请求
const params = {
ProductKey: "",
DeviceName: "",
RequestBase64Byte: new Buffer(JSON.stringify(payload)).toString("base64"),
Timeout: 8000,
Topic:"/charging/cmd"
};
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));
}
});
联机调试
1.正常响应结果:
设备端日志:
控制台日志:
2.异常响应结果,设备超时:
控制台日志:
3.异常响应结果,设备离线:
控制台日志:
【IoT平台 RRPC 实战】
【往期回顾】
更多推荐
所有评论(0)