前言
以Thingsboard gateway为桥梁,打通Zigbee2MQTT与Thingsboard平台之间的阻隔,实现将Zigbee2MQTT上的设备数据上传到Thingsboard中,进而实现市面上众多Zigbee设备接入Thingsboard平台。
下面的例子基于Raspberry Pi4安装Thingsboard gateway,我的树莓派安装的是32-bit Raspberry Pi OS Bullseye 11 (oldstable),即32位的系统。
一、Raspberry Pi4安装docker
经过多次尝试,无法通过从仓库拉取docker安装包,所以干脆先下载好docker的.deb包,再进行安装,这样就不用从仓库拉取了。
安装步骤如下:
1.安装docker
(1)进入 https://download.docker.com/linux/raspbian/dists/;
(2)根据你安装的树莓派版本选择列表中相对于的目录。我安装的是bullseye版本,所以进入bullseye/目录;
(3)进入pool/stable/目录,选择合适树莓派系统版本的架构的包。这里32位树莓派系统可以选择armhf版本的安装包;
(4)下载.deb包,需要下载一下几个包:
- containerd.io_1.6.25-1_armhf.deb
- docker-ce_25.0.2-1raspbian.11bullseye_armhf.deb
- docker-ce-cli_25.0.2-1raspbian.11bullseye_armhf.deb
- docker-buildx-plugin_0.15.1-1raspbian.11bullseye_armhf.deb
- docker-compose-plugin_2.25.0-1raspbian.11bullseye_armhf.deb
(5)安装.deb包
将下载好的.deb上传至树莓派的/opt/docker_deb_packages/目录下,还没建这个目录的就先建目录。包都传上了后,进入/opt/docker_deb_packages/目录下,执行安装命令:
sudo dpkg -i ./containerd.io_1.6.25-1_armhf.deb \
./docker-ce_25.0.2-1~raspbian.11~bullseye_armhf.deb \
./docker-ce-cli_25.0.2-1~raspbian.11~bullseye_armhf.deb \
./docker-buildx-plugin_0.15.1-1~raspbian.11~bullseye_armhf.deb \
./docker-compose-plugin_2.25.0-1~raspbian.11~bullseye_armhf.deb
(6)安装成功后,配置docker的仓库源,配置国内的仓库,下载快些,建议还是要配置一下:
执行这个命令:
sudo nano /etc/docker/daemon.json
把下面的内容复制到文件中,然后Ctrl+o保存,Ctrl+x退出:
提示:阿里云仓库的链接"https://xxxx-.mirror.aliyuncs.com"自己去注册一个,可以参考https://blog.csdn.net/Suyiixx/article/details/129891688的注册方法。
{
"registry-mirrors": [
"https://docker.rainbond.cc",
"https://xxxx-.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
添加好镜像链接后,保存退出。执行下面的命令,启动docker,并添加hello-world镜像测试docker安装是否成功:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker run hello-world
到这里,docker安装就完成了。
二、在docker安装ThingsBoard IoT Gateway
1.执行安装指令
首先进入dockerhub查看有什么版本的 ThingsBoard IoT Gateway,链接在这:
https://hub.docker.com/r/thingsboard/tb-gateway/tags?page=&page_size=&name=&ordering=last_updated
目前最新版本是:3.5.1-rpi
安装的指令如下:
sudo 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.5.1-rpi
执行完之后就自动运行tb-gateway镜像了,可以查看docker运行日志,但肯定是有报错了,因为你还没有配置网关。下面给几个常用指令:
- 获取网关的运行日志:
sudo docker attach tb-gateway
- 停止运行网关:
docker stop tb-gateway
- 开始运行网关:
docker start tb-gateway
2.配置网关
首先在用户的默认目录下找到.tb-gateway/文件夹,并执行下面的指令:
cd .tb-gateway/config/
进入config/文件夹后,可以通过ls指令查看里边的文件,主要配置tb_gateway.json和mqtt.json,下面给出示例配置:
(1)执行下面的指令,进入文件:
sudo nano tb_gateway.json
tb_gateway.json代码如下(示例):
{
"thingsboard": {
"host": "192.168.3.201",
"port": 1883,
"remoteShell": false,
"remoteConfiguration": true,
"statistics": {
"enable": true,
"statsSendPeriodInSeconds": 3600
},
"deviceFiltering": {
"enable": false,
"filterFile": "list.json"
},
"maxPayloadSizeBytes": 1024,
"minPackSendDelayMS": 200,
"minPackSizeToSend": 500,
"checkConnectorsConfigurationInSeconds": 60,
"handleDeviceRenaming": true,
"security": {
"type": "accessToken",
"accessToken": "vAtZl7EQHXfgNAeQskjE"
},
"qos": 1,
"checkingDeviceActivity": {
"checkDeviceInactivity": false,
"inactivityTimeoutSeconds": 200,
"inactivityCheckPeriodSeconds": 500
}
},
"storage": {
"type": "memory",
"read_records_count": 100,
"max_records_count": 100000,
"data_folder_path": "./data/",
"max_file_count": 10,
"max_read_records_count": 10,
"max_records_per_file": 10000,
"data_file_path": "./data/data.db",
"messages_ttl_check_in_hours": 1,
"messages_ttl_in_days": 7
},
"grpc": {
"enabled": false,
"serverPort": 9595,
"keepaliveTimeMs": 10000,
"keepaliveTimeoutMs": 5000,
"keepalivePermitWithoutCalls": true,
"maxPingsWithoutData": 0,
"minTimeBetweenPingsMs": 10000,
"minPingIntervalWithoutDataMs": 5000,
"keepAliveTimeMs": 10000,
"keepAliveTimeoutMs": 5000
},
"connectors": [
{
"type": "mqtt",
"name": "MQTT Broker Connector",
"configuration": "mqtt.json"
}
]
}
代码中的有两个地方需要根据你的实际来修改:
- 第一个地方,将"host"的值改成你的Thingsboard平台地址,前提是你已经搭建好Thingsboard平台并运行成功:
"host": "xxxx.xxxx.xxxx.xxxx",
第二个地方,将"accessToken"的值换成你在Thingsboard平台上新建的网关设备,前提是你在Thingsboard中建好网关设备了,复制网关设备的"accessToken"过来放这里就行了:
"accessToken": "xxxxxxxxxxx"
改完之后,然后Ctrl+o保存,Ctrl+x退出。
(2)执行下面的指令,进入文件:
sudo nano mqtt.json
mqtt.json代码如下(示例):
{
"broker": {
"name": "Default Local Broker",
"host": "xxx.xxx.xxx.xxxx",
"port": 1883,
"clientId": "ThingsBoard_gw001",
"version": 5,
"maxMessageNumberPerWorker": 10,
"maxNumberOfWorkers": 100,
"sendDataOnlyOnChange": false,
"security": {
"type": "basic",
"username": "xxxxxx",
"password": "xxxxxx"
}
},
"mapping": [
{
"topicFilter": "zigbee2mqtt/+",
"converter": {
"type": "json",
"deviceNameJsonExpression": "${$.device.friendlyName}",
"deviceTypeJsonExpression": "${sensorType}",
"sendDataOnlyOnChange": false,
"timeout": 60000,
"attributes": [
{
"type": "string",
"key": "action",
"value": "${$.action}"
}
],
"timeseries": [
{
"type": "double",
"key": "device_temperature",
"value": "${$.device_temperature}"
}
]
}
},
{
"topicFilter": "zigbee2mqtt/+",
"converter": {
"type": "json",
"deviceNameJsonExpression": "${$.device.friendlyName}",
"deviceTypeJsonExpression": "${$.device.model}",
"sendDataOnlyOnChange": false,
"timeout": 60000,
"attributes": [
{
"type": "string",
"key": "state",
"value": "${$.state}"
}
],
"timeseries": [
{
"type": "int",
"key": "linkquality",
"value": "${$.linkquality}"
}
]
}
},
{
"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": ".*",
"attributeFilter": "firmwareVersion",
"topicExpression": "sensor/${deviceName}/${attributeKey}",
"valueExpression": "{\"${attributeKey}\":\"${attributeValue}\"}"
}
],
"serverSideRpc": [
{
"deviceNameFilter": ".*",
"methodFilter": "echo",
"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}"
}
],
"id": "d440e11a-df9f-4934-8e24-f98332f3eb18"
}
其中,下面三处需要修改,"host"是要连接的MQTT服务器地址, "username"和"password"分别是MQTT服务器的登录账号和密码,自己根据实际情况填写。
"host": "xxx.xxx.xxx.xxxx",
"username": "xxxxxx",
"password": "xxxxxx"
当然,要想能正常接收数据, "mapping"也是要配置的,这个在Thingsboard官网写得很详细,这里给出连接,自己看看。
配置链接:http://www.ithingsboard.com/docs/iot-gateway/config/mqtt/
总结
提示:前提是Thingsboard和Zigbee2MQTT都安装好,而且都能正常运行了。这篇文字主要讲怎么安装Thingsboard gateway的方法。树莓派安装Zigbee2MQTT可以参考我的另一篇教程:
https://blog.csdn.net/qq_39648832/article/details/140738448
到这可以点赞加关注了。。。