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 实战】

基于系统Topic实现RRPC同步调用(1)

【往期回顾】

1、39张传感器工作原理GIF图汇总

2、智能手持测温枪开发实践

3、JMeter压测MQTT服务性能实战

4、IoT物联网平台日志服务详解

5、自建MQTT集群迁移阿里云IoT实践

6、工业Modbus电力104规约接入IoT平台

7、设备免烧录三元组,即时注册解决方案

8、IoT+TSDB+Quick BI 搭建楼宇环境监控

9、JS全栈开发,构建智能家居小程序

10、图解 IoT 物联网

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐