Thingsboard 源码分析 -- Gateway mqtt网关原理实现

本文详细解析了ThingsBoard网关的工作原理,包括设备数据上报、RPC请求处理及心跳机制等核心流程。此外,还介绍了如何根据业务需求定制网关或直接使用采集服务与ThingsBoard平台通信。
部署运行你感兴趣的模型镜像

Thingsboard的网关通过tb核心服务提供的mqtt以客户端的形式连接到tb上,一个网关的mqtt连接同时只能在线一个客户端服务。正常情况下,网关下的所有设备上报数据都是通过网关上报,网关下所有设备都是先把数据上报到边缘端的mqtt上,然后网关通过订阅边缘端的mqtt获取设备数据,再统一通过tb的mqtt上传到tb上,网关服务上传操作还考虑到了服务掉线的情况,会把数据暂时存起来,待服务连接正常继续上报。

Thingsboard官方网关用的python写的,最早官方网关用的java,但是不知道什么原因下架换成python,有知道的朋友请留言。

Thingsboard网关核心功能有两个,

1,上报数据。

2,接收服务端rpc请求,转发给设备连接的边缘端mqtt,我们有些场景下,网关显得鸡肋,我们就可以按以下逻辑定制一个简易的网关。

3,多协议支持。

Thingsboard mqtt网关的核心代码都在MqttGatewayService类中,业务也比较简单,有兴趣可以跟一下代码看看。

但是某些场景下,我们业务很简单,边缘端又不想部署这么多服务,可以考虑去掉tb网关,采集服务模拟网关直接跟tb通信完成数据上报和控制。

首先说一下上报数据的核心逻辑,设备数据上报前要做一次connect,tb会为我们在设备列表中创建设备,否则,tb核心服务会为我们创建一个没有设备类型的设备出来。

topic:v1/gateway/connect

body: {"device":"1111",type:"sensor"}

上报遥测数据

topic:v1/gateway/telemetry

body:{"1111":[{ "switch1": 1, "switch2": 1}]}

上报客户端属性

topic:v1/gateway/attributes

body:{"1111":{"deviceType":"xxx","supplier":"xxx"}}

再说下rpc请求的核心逻辑

单向和双向的topic都需要订阅以下topic,主要在规则引擎里区分好单向还是双向,写到body里,便于网关区分返回响应。

v1/gateway/rpc

订阅上述topic,rpc请求可以收到如下body

{"device":"F8EF6B0F004B1200","data":{"id":123,"method":"set/njwl/switch1","params":{"state":1,"supplier":"njwl","deviceId":"F8EF6B0F004B1200","deviceType":"switch","isOneway":"false"}}}

双向rpc 响应,body中的id就是requestid。

v1/gateway/rpc

body: {"id":123,"device":"F8EF6B0F004B1200","data":"{\"state\":1111,\"supplier\":\"njwl\"}"} 

网关心跳

MqttGatewayService 在init方法中会定时运行reportStats()方法,默认好像是10秒一次,向topic v1/devices/me/telemetry 发送以下数据。

{"ts":1606267309953,"values":{"devicesOnline":111,"attributesUploaded":0,"telemetryUploaded":0}}

设备心跳,完全依赖设备自身上报,无论是属性还是遥测数据,都会认为是心跳

至此,可以完全脱离thingsboard的gateway独立设计运转自己的网关了。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### ThingsBoard GatewayMQTT集成配置指南 #### 配置文件概述 为了实现ThingsBoard GatewayMQTT协议之间的无缝连接,需编辑`tb_gateway.yaml`配置文件。此文件位于安装目录下的`config`文件夹内。 ```yaml mqtt: host: "broker.hivemq.com" port: 1883 qos: 1 client_id: "thingsboard-gateway" username: "" password: "" keepalive: 60 clean_session: true ``` 上述代码展示了如何设置基本的MQTT客户端参数[^3]。 #### 设备连接属性设定 针对每一个通过网关接入平台的设备而言,在同一份YAML文档里还需指定其对应的MQTT主题以及消息格式: ```yaml devices: - name: "Temperature Sensor" telemetry_topic: "v1/devices/me/telemetry" attributes_topic: "v1/devices/me/attributes" commands_topics: - topic: "v1/devices/me/rpc/request/+" method: "RPC_METHOD_NAME" ``` 这里定义了一个名为“Temperature Sensor”的虚拟传感器,并指定了上传遥测数据的主题路径和接收命令请求的方式。 #### 自定义转换器应用实例 当接收到的消息体不是JSON结构化对象而是二进制流或其他特殊编码形式的数据包时,则可通过编写Python脚本来解析这些原始字节数组并将其转化为标准API调用所需的键值对集合。下面给出了一段简单的例子来说明这一过程: ```python def BYTE_TO_JSON(bytes_data): json_result = {} # 假设前两个字节代表温度读数(摄氏度),后面四个字节表示湿度百分比 temp_celsius = int.from_bytes(bytes_data[:2], byteorder='big', signed=False)/10.0 humidity_percent = struct.unpack('>f', bytes_data[-4:])[0] json_result["temperature"] = round(temp_celsius, 1) json_result["humidity"] = round(humidity_percent, 2) return json.dumps(json_result) ``` 该函数接受一个字节数组作为输入参数,经过处理后返回包含环境监测指标在内的合法JSON字符串。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值