ThingsBoard 使用持久化 RPC 案例场景
正文与配图来自原稿。设备 B 可能离线时,如何让其上线后仍收到 A 侧消息——用 持久化 RPC(Persistent RPC)。
1、概述
场景:扫描枪 A 上报到 ThingsBoard,需要把数据发给设备 B。在线时给 B 下发一条 RPC 即可;难点是 B 可能离线——如何保证 B 上线后仍能收到 A 的消息。
有团队为此折腾很久。解决办法是 ThingsBoard 的持久化 RPC:RPC 会落库并带过期时间,设备在有效期内上线仍可取到。
官方说明:
https://thingsboard.io/docs/user-guide/rpc/
2、问题分析
关键:B 上线后仍能收到 A→B 的消息。
要点:
- 用 RPC 下发
- A 与 B 建立关联,才能从 A 的消息切换发起者到 B
- RPC 配成持久化(写入数据库 + 过期时间);在过期前上线即可收到

3、案例实操
3.1、创建设备
创建 deviceA、deviceB:

3.2、绑定关系
由 deviceA(上报方)创建到 deviceB 的关系:

3.3、编写规则链
规则链核心已标注:

① script:组装下发给 deviceB 的参数,并开启持久化 RPC:

② change originator:按关系查询,把发起者切到 deviceB:

③ rpc call request:向 deviceB 发 RPC:

3.4、模拟测试
连接 deviceA:


deviceA 发送遥测:

此时先不连 deviceB(B 离线)。再创建 / 连接 deviceB:


deviceB 订阅:
text
v1/devices/me/rpc/request/+此前 A 已发过数据,看 B 上线后能否收到:

再验证「断开 B → A 再发 → 约 5 分钟内重连 B 仍能收到」:
断开 deviceB:

deviceA 再次发送:

重连 B,确认仍能订阅到:

补充(辅)
| 点 | 说明 |
|---|---|
| 持久化 | RPC 存库;需在 script / API 中打开 persistent,并设合理 expiration |
| 过期 | 超过过期时间未上线则不再投递;案例按「约 5 分钟内」验证,以你配置为准 |
| 订阅 | B 必须订阅 v1/devices/me/rpc/request/+(或你自定义的 RPC Topic) |
| 一对多 | 多台 B 可配合 duplicate to related 再持久化 RPC |
