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
配置使用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}"
}
]
}
# -
# 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结