IoT 充电桩场景基于MQTT协议的业务同步调用RRPC实战

MQTT协议是基于Pub/Sub的异步通信模式,无法实现HTTP协议的同步响应业务处理结果,导致云端业务系统开发难度高。

为了适应智能灯开灯,智能锁开锁,充电宝弹出,自动售货机付款后出货,按摩椅启动等业务场景,IoT物联网平台基于MQTT协议制定了一套请求和响应的同步机制,无需改动MQTT协议即可实现同步通信。应用服务器通过POP API发起RRPC调用,IoT设备端只需要在Timeout内,按照固定的格式回复Pub消息,服务端即可同步获取IoT设备端的响应结果。

技术原理

服务端同步RRPC调用业务流程如下:


Topic格式约定:

设备端开发

我们以充电桩场景为例,用户完成付款后,服务端推送充电指令,并实时获取设备处理结果。

指令如下:

{"power":200,"port":3}

设备响应:

{"bizCode": 0,"errMsg":"xxxxx"};// 0 成功,400 充电失败

创建充电桩产品,并注册设备。

设备端监听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(`/sys/${options.productKey}/${options.deviceName}/rrpc/request/+`)


client.on('message', function(topic, message) {
    
    if(topic.indexOf(`/sys/${options.productKey}/${options.deviceName}/rrpc/request/`)>-1){
        // 4.接收并处理业务,响应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));
}

服务端开发

服务端通过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: "Your ProductKey",
    DeviceName: "Your DeviceName",
    RequestBase64Byte: new Buffer(JSON.stringify(payload)).toString("base64"),
    Timeout: 8000
};


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、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 物联网

### 设备接入华为云的方式 通过 Python 实现设备接入华为云,可以采用两种常见方式:一种是基于 **IoTDA 平台的应用侧 API 接口** 使用官方提供的 Python SDK;另一种则是利用 **Paho-MQTT 库** 进行 MQTT 协议通信。以下是具体方法及示例代码。 #### 方法一:使用 Huawei IoTDA 的 Python SDK Huawei IoTDA 提供了专门的 Python SDK 来简化应用侧与平台之间的集成过程[^1]。开发者可以通过该 SDK 轻松调用 IoTDA 的 RESTful API 完成设备注册、数据上报等功能。 ##### 示例代码 ```python from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkiotda.v5 import * from huaweicloudsdkcore.exceptions import exceptions def init_client(): ak = "your_access_key" sk = "your_secret_key" project_id = "your_project_id" region = "cn-north-4" credentials = BasicCredentials(ak, sk, project_id) client = IotDaClient.new_builder().with_credentials(credentials).with_region(region).build() return client def create_device(client): request = AddDeviceRequest() add_device_body = { "nodeType": "GATEWAY", "productName": "TestProduct", "authInfo": "{\"secret\":\"device_secret\"}" } request.body = Device(add_device_body=add_device_body) response = client.add_device(request) print(response) if __name__ == "__main__": client = init_client() create_device(client) ``` 上述代码展示了如何初始化客户端并创建新设备。需要注意的是,在实际部署前需替换 `your_access_key` 和其他占位符为真实值。 --- #### 方法二:使用 Paho-MQTT 库实现 MQTT 数据交互 对于轻量级场景下的设备接入,可以直接借助开源库 paho-mqtt 与华为云物联网服务进行通信[^2]。这种方式适合资源受限的小型嵌入式设备。 ##### 示例代码 ```python import paho.mqtt.client as mqtt import json import time # 配置参数 client_id = "test_device_001" username = "your_username" password = "your_password" server_address = "iot-mqtts.cn-north-4.myhuaweicloud.com" port = 8883 # 回调函数定义 def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected successfully.") client.subscribe("/sys/{}/{}/rrpc/request/+".format(username, client_id)) else: print(f"Connection failed with code {rc}") def on_message(client, userdata, msg): payload = str(msg.payload.decode('utf-8')) print(f"Received message: {payload}") # 处理接收到的消息... def publish_data(client): data = {"temperature": 25.5, "humidity": 60} topic = "/sys/{}/{}/thing/event/property/post".format(username, client_id) payload = json.dumps({ "services": [ { "service_id": "default_service", "properties": data } ] }) client.publish(topic, payload=payload, qos=1) print(f"Published data to topic '{topic}': {data}") # 初始化客户端 client = mqtt.Client(client_id=client_id, protocol=mqtt.MQTTv311) client.username_pw_set(username=username, password=password) client.tls_set() # 启用 TLS 加密 client.on_connect = on_connect client.on_message = on_message try: client.connect(server_address, port, keepalive=60) client.loop_start() while True: publish_data(client) time.sleep(10) # 模拟每 10 秒发送一次数据 except KeyboardInterrupt: client.disconnect() client.loop_stop() ``` 此脚本实现了设备到云端的数据上传功能,并订阅了一个 RRPC 请求主题用于接收来自服务器端的通知。 --- ### 总结 以上分别介绍了基于 Huawei IoTDA SDK 和 Paho-MQTT 的两种主流方案来完成 Python 程序中的设备接入操作。前者适用于复杂业务逻辑需求较高的场合,而后者则更适合简单快速开发的需求环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值