thingsboard 网关 tb-gateway

1、背景

thingsboard由于要接入的设备以及设备种类比较多,不同的设备对应不同的产商以及不同的协议,如果全部都由thingsboard来对接的,就回显得tb非常的混乱以及冗肿,所以我们可以使用网关作为tb与设备之间的桥梁,网关对设备,tb对网关,这样,适配设备就在网关了,tb只是接受统一的遥测数据即可。

2、tb-gateway的安装

1、使用docker的方式

docker run -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --name tb-gateway --restart always thingsboard/tb-gateway:3.2
 把网关的log文件以及配置文件都映射到本机的 ~/.tb-gateway 目录里面
2、使用源码打包镜像的方式(针对二次开发)
https://github.com/thingsboard/thingsboard-gateway 去这里下载源码,因为是python写的所以需要安装python,本机安装了python3.10,使用idea打开源码

 配置使用python来编译以及解析源码

 

 这样配置之后再安装python插件就可以使用idea来编辑python了,也可以使用python的专业编辑器,这里就懒得破解了

这里配置启动配置

 上面指定的启动类是这个

然后就是跟编辑Java一样的编辑python即可,可以看到上面有一个docker文件夹,里面有个Dockerfile文件,二次开发完,使用 docker build 命令直接打包成镜像即可

3、网关的简单二次开发对接设备

上面的docker 部署我们说过把log以及配置文件映射了出来,配置文件有两个文件夹config以及extensions,config里面放置的配置通讯协议、通讯地址、要获取遥测数据字段以及设备属性字段,extensions 里面配置的对应的config里面文件的转换器Converter(把从设备获取到的遥测数据,按照config文件里面的格式来转换)以及连接器Connector(连接器决定选择哪一个转换器)

进入 config目录,可以看到tb-gateway.yaml文件

thingsboard:
     host: localhost
     port: 1883

修改这两个地方,为thingsboard的地址以及mqtt通讯端口,接下通过mqtt客户端模拟设备通过网关跟thingsboard通讯,先在tb创建一个网关设备,是否网关选择是,然后复制token

security:
accessToken: 56lUaVDiiUUqpI4XTymF (上面创建网关设备的token)

在config里面新增一个mqtt的通讯配置,可以看到里面已经有一个mqtt.json的模板,我们复制一个改为自己的名字 mqtt_demo.json

 修改这里为相关的mqtt地址以及端口,要注意跟前面tb-gateway.yaml文件的mqtt配置区分开,这里是网关跟设备的连接,上面是网关跟tb的链接

这里填入MQTT相关的用户密码

 这mapping里面填入的映射的信息,

topicFilter  mqtt往这个主题里面发送遥测数据

 ${x}  这个表示使用x作为key,去mqtt过来的数据里面取value

"deviceNameJsonExpression": "${serialNumber}",        serialNumber 这个字段作为设备名称

"deviceTypeJsonExpression": "${sensorType}",     sensorType 这个字段作为设备类型,下面的字段也是同理

attributes:[] 这个属性里面的元素,作为设备的客户端属性

timeseries:[] 这个属性里面的元素,作为设备的遥测数据

mqtt_demo.json完整的文件

{
"broker": {
"name": "Default Local Broker",
"host": "192.168.56.10",
"port": 1883,
"clientId": "ThingsBoard_gatewayxxxxxx",
"version": 5,
"maxMessageNumberPerWorker": 10,
"maxNumberOfWorkers": 100,
"sendDataOnlyOnChange": false,
"security": {
"type": "basic",
"username": "admin",
"password": "public"
}
},
"mapping": [
{
"topicFilter": "/sensor/data",
"converter": {
"type": "json",
"deviceNameJsonExpression": "${serialNumber}",
"deviceTypeJsonExpression": "${sensorType}",
"sendDataOnlyOnChange": false,
"timeout": 60000,
"attributes": [
{
"type": "string",
"key": "model",
"value": "${sensorModel}"
},
{
"type": "string",
"key": "${sensorModel}",
"value": "on"
}
],
"timeseries": [
{
"type": "double",
"key": "temperature",
"value": "${temp}"
},
{
"type": "double",
"key": "humidity",
"value": "${hum}"
},
{
"type": "string",
"key": "combine",
"value": "${hum}:${temp}"
}
]
}
},
{
"topicFilter": "/sensor/+/data",
"converter": {
"type": "json",
"deviceNameTopicExpression": "(?<=sensor\/)(.*?)(?=\/data)",
"deviceTypeTopicExpression": "Thermometer",
"sendDataOnlyOnChange": false,
"timeout": 60000,
"attributes": [
{
"type": "string",
"key": "model",
"value": "${sensorModel}"
}
],
"timeseries": [
{
"type": "double",
"key": "temperature",
"value": "${temp}"
},
{
"type": "double",
"key": "humidity",
"value": "${hum}"
}
]
}
},
{
"topicFilter": "/sensor/raw_data",
"converter": {
"type": "bytes",
"deviceNameExpression": "[0:4]",
"deviceTypeExpression": "default",
"sendDataOnlyOnChange": false,
"timeout": 60000,
"attributes": [
{
"type": "raw",
"key": "rawData",
"value": "[:]"
}
],
"timeseries": [
{
"type": "raw",
"key": "temp",
"value": "[4:]"
}
]
}
},
{
"topicFilter": "/custom/sensors/+",
"converter": {
"type": "custom",
"extension": "CustomMqttUplinkConverter",
"cached": true,
"extension-config": {
"temperatureBytes": 2,
"humidityBytes": 2,
"batteryLevelBytes": 1
}
}
}
],
"connectRequests": [
{
"topicFilter": "sensor/connect",
"deviceNameJsonExpression": "${SerialNumber}"
},
{
"topicFilter": "sensor/+/connect",
"deviceNameTopicExpression": "(?<=sensor\/)(.*?)(?=\/connect)"
}
],
"disconnectRequests": [
{
"topicFilter": "sensor/disconnect",
"deviceNameJsonExpression": "${SerialNumber}"
},
{
"topicFilter": "sensor/+/disconnect",
"deviceNameTopicExpression": "(?<=sensor\/)(.*?)(?=\/disconnect)"
}
],
"attributeRequests": [
{
"retain": false,
"topicFilter": "v1/devices/me/attributes/request",
"deviceNameJsonExpression": "${serialNumber}",
"attributeNameJsonExpression": "${versionAttribute}, ${pduAttribute}",
"topicExpression": "devices/${deviceName}/attrs",
"valueExpression": "${attributeKey}: ${attributeValue}"
}
],
"attributeUpdates": [
{
"retain": true,
"deviceNameFilter": "SmartMeter.*",
"attributeFilter": "uploadFrequency",
"topicExpression": "sensor/${deviceName}/${attributeKey}",
"valueExpression": "{\"${attributeKey}\":\"${attributeValue}\"}"
}
],
"serverSideRpc": [
{
"deviceNameFilter": ".*",
"methodFilter": ".*",
"requestTopicExpression": "sensor/${deviceName}/request/${methodName}/${requestId}",
"responseTopicExpression": "sensor/${deviceName}/response/${methodName}/${requestId}",
"responseTimeout": 10000,
"valueExpression": "${params}"
},
{
"deviceNameFilter": ".*",
"methodFilter": "no-reply",
"requestTopicExpression": "sensor/${deviceName}/request/${methodName}/${requestId}",
"valueExpression": "${params}"
}
]
}
 接下来回到tb-gateway.json文件,找到 connectors: 属性这里配置的是各种协议的连接器 mqtt、http、coap等等

# -
# name: MQTT Broker Connector
# type: mqtt
# configuration: mqtt_demo.json

#class: CustomSerialConnector

这里是一个默认的mqtt链接

name 是连接名称

type 是对应extensions 里面的文件夹,比如上面的mqtt就是对应上面的mqtt文件夹,使用里面的Converter解析从设备上来的遥测数据

configuration 就是填入我们刚刚创建的 mqtt_demo.json文件

class 自定义连接器的类名称,如果要自定义连接器,把他放到对应的extensions 文件夹里面,跟Converter放一起,通过这里的class指定即可

所以上面配置完之后为

接下来我们启动网关和tb,调试一下看下是否成功

 

这个是mqtt的报文,应该是会创建 Device A 设备类型为 Thermometer,我们去刷新一下tb,

 可以看到已经创建了设备 Device A 类型也没错, "temp": 42,"hum": 68 也没有错,

客户端属性也上来了,至此网关已经接入成功了,接入了MQTT协议,config哪里还有很多协议比如 http、coap、mudbus等等,都可以参考他们的模板,自定义我们的其他的协议 ,下一次,我们说说要怎么接入和使用tb的边缘服务 thingsboard-edge

 

posted @   Vayne_Chen  阅读(2857)  评论(7编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示