tencent cloud

物联网通信

动态与公告
产品动态
产品简介
产品概述
产品功能
产品优势
应用场景
产品限制
基本概念
快速入门
快速开始
场景一:设备互通
场景二:设备状态上报与状态设置
MQTT.fx接入指南
控制台使用手册
产品管理
规则引擎
子账号访问IoT
固件升级
资源管理
证书管理
开发者手册
功能组件
签名方法
设备身份认证
设备接入协议
网关子设备
消息通信
设备影子
设备固件升级
设备远程配置
资源管理
设备日志上报
NTP服务
设备端接入手册
设备接入概述
基于C SDK接入
基于 Android SDK 接入
基于 Java SDK 接入
基于 Python SDK 接入
API 文档
History
Introduction
API Category
Making API Requests
Device Shadow APIs
Device APIs
CA Certificate APIs
Product APIs
Data Types
Error Codes
常见问题
一般性问题
设备接入和上报问题
规则引擎问题
控制台相关问题
IoT Hub 政策
隐私协议
数据处理和安全协议
词汇表

RRPC通信

PDF
聚焦模式
字号
最后更新时间: 2024-12-27 15:54:13

功能概述

因MQTT 协议基于发布/订阅的异步通信模式,服务器控制设备后,将无法同步感知设备的返回结果。为解决此问题,物联网通信平台利用 RRPC(Revert RPC)实现同步通信机制。

通信原理

通信 Topic

订阅消息 Topic: $rrpc/rxd/${productID}/${deviceName}/+用于订阅云端下发(下行)的 RRPC 请求消息。
请求消息 Topic:$rrpc/rxd/${productID}/${deviceName}/${processID}用于云端发布(下行)RRPC 请求消息。
应答消息 Topic:$rrpc/txd/${productID}/${deviceName}/${processID}用于发布(上行)RRPC 应答消息。
说明:
${productID}:产品 ID。
${deviceName}:设备名称。
${processID}: 服务器生成的唯一的消息 ID,用来标识不同 RRPC 消息。可以通过 RRPC 应答消息中携带的 processID 找到对应的 RRPC 请求消息。

通信流程

1. 设备端订阅 RRPC 订阅消息 Topic。
2. 服务器通过调用PublishRRPCMessage接口发布 RRPC 请求消息。
3. 设备端接收到消息之后截取请求消息 Topic 中云端下发的 processID,设备将应答消息 Topic 的 processID 设置为截取的 processID,并向应答消息 Topic 发布设备的返回消息 。
4. 物联网通信平台接收到设备端返回消息之后,根据 processID 对消息进行匹配并将设备返回消息发送给服务器。
注意:
RRPC 请求4s超时,即4s内设备端没有应答就认为请求超时。
流程示意图如下:
image.png


RRPC 通信示例

示例为基于 Linux 平台利用设备端 C-SDK 完成接入,并结合腾讯云 API Explorer 工具完成接口的调用,具体使用步骤如下。

控制台创建设备

创建产品和设备

请参考 设备互通 创建空调产品,并创建 airConditioner1 空调设备。

编译运行示例程序(以密钥认证设备为例)

1. 编译 SDK

修改CMakeLists.txt确保以下选项存在:
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_RRPC_ENABLED ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
执行脚本编译:
./cmake_build.sh
示例输出rrpc_sample位于output/release/bin文件夹中。

2. 填写设备信息

将上面创建的 airConditioner1 设备的设备信息填写到 JSON 文件aircond_device_info1.json中:
{
"auth_mode":"KEY",
"productId":"KL4J2****8",
"deviceName":"airConditioner1",
"key_deviceinfo":{
"deviceSecret":"zOZXUaycuwleP****78dBA=="
}
}

3. 执行rrpc_sample示例程序

可以看到设备airConditioner1订阅了RRPC消息,然后处于等待状态。
./rrpc_sample -c ./aircond_device_info1.json -l 1000
INF|2020-08-03 23:57:55|qcloud_iot_device.c|iot_device_info_set(50): SDK_Ver: 3.2.0, Product_ID: KL4J2****8, Device_Name: airConditioner1
DBG|2020-08-03 23:57:55|HAL_TLS_mbedtls.c|HAL_TLS_Connect(200): Setting up the SSL/TLS structure...
DBG|2020-08-03 23:57:55|HAL_TLS_mbedtls.c|HAL_TLS_Connect(242): Performing the SSL/TLS handshake...
DBG|2020-08-03 23:57:55|HAL_TLS_mbedtls.c|HAL_TLS_Connect(243): Connecting to /KL4J2****8.iotcloud.tencentdevices.com/8883...
INF|2020-08-03 23:57:55|HAL_TLS_mbedtls.c|HAL_TLS_Connect(265): connected with /KL4J2****8.iotcloud.tencentdevices.com/8883...
INF|2020-08-03 23:57:56|mqtt_client.c|IOT_MQTT_Construct(113): mqtt connect with id: 2**** success
INF|2020-08-03 23:57:56|rrpc_sample.c|main(206): Cloud Device Construct Success
DBG|2020-08-03 23:57:56|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(142): topicName=$rrpc/rxd/KL4J2****8/airConditioner1/+|packet_id=****
INF|2020-08-03 23:57:56|rrpc_sample.c|_mqtt_event_handler(49): subscribe success, packet-id=*****
DBG|2020-08-03 23:57:56|rrpc_client.c|_rrpc_event_callback(104): rrpc topic subscribe success

4. 调用云 API PublishRRPCMessage 发送 RRPC 请求消息

打开腾讯云 API控制台,填写个人密钥和设备参数信息,选择在线调用并发送请求。

5. 观察 RRPC 请求消息

观察设备 airConditioner1 的打印输出,可以看到已经收到 RRPC 请求消息,process id为***。
DBG|2020-08-04 00:07:36|rrpc_client.c|_rrpc_message_cb(85): topic=$rrpc/rxd/KL4J2****8/airConditioner1/***
INF|2020-08-04 00:07:36|rrpc_client.c|_rrpc_message_cb(86): len=6, topic_msg=closed
INF|2020-08-04 00:07:36|rrpc_client.c|_rrpc_get_process_id(76): len=3, process id=***
INF|2020-08-04 00:07:36|rrpc_sample.c|_rrpc_message_handler(137): rrpc message=closed

6. 观察RRPC应答消息

观察设备 airConditioner1 的打印输出,可以看到已经处理了 RRPC 请求消息,并回复了 RRPC 应答消息,process id为***。
DBG|2020-08-04 00:07:36|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$rrpc/txd/KL4J2****8/airConditioner1/***|payload=ok

7. 观察服务器响应结果

观察服务器的响应结果,可以看到已经收到了 RRPC 应答消息。MessageId***Payload经过base64编码后为****,其与客户端实际应答消息经过base64编码后一致。可以确认收到了应答消息。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈