Raspberry Pi4安装Thingsboard gateway:Zigbee2MQTT与Thingsboard平台之间的桥梁


前言

以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
到这可以点赞加关注了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值