前言
通过对ThingsBoard的了解后,结合目前需求:1.我需要连接至少连接315套设备;2.设备类型多、设备协议目前还不清楚。基于上述需求我决定加入网关组件(Gateway)进行数据接收以及发送数据命令的模拟。
刚刚接触物联网项目不久,如果文章能帮到其他小伙伴,那是我的荣幸。文中如有不当的地方欢迎大家友好讨论,对于不妥我会积极修改。(有部分图片和实现方案及操作步骤取自其他博客,作者均会在后面引用说明)
大佬们有更好的解决办法,也希望能够指点指点~~~~
本机环境
JDK:17
Node:22.17.1
Maven:3.9.6
IDEA:2025.2.3
Pycharm: 2024.1.7
ThingsBoard源码:4.3.0-SNAPSHOT
本机系统:Windows 11
ThingsBoard IoT Gateway源码下载地址:https://github.***/thingsboard/thingsboard-gateway
Gateway是什么?
官网链接:什么是 ThingsBoard 物联网网关? |ThingsBoard 物联网网关
我的理解是他用于将传统设备、第三方系统或使用非原生协议的设备,连接到 ThingsBoard 平台上。充当桥梁 / 抽象层,使各种不同通信协议、设备类型的数据能被统一收集、处理、转换,然后发送到 ThingsBoard 做进一步的管理、可视化、规则处理等。
Gateway的安装
参考:从源安装 IoT 网关。|ThingsBoard 物联网网关
我选择的是使用Pycharm从源代码进行安装,我看许多博客都是使用IDEA进行安装的,我感觉他在环境中下载各种包有点混乱,所以新创建了一个虚拟环境在Pycharm中运行。
从 GitHub 下载存储库
git clone --recurse-submodules https://github.***/thingsboard/thingsboard-gateway.git --depth 1
移至下载目录
cd thingsboard-gateway
创建环境
我是使用Anaconda创建Python虚拟环境
conda create -n tb_gateway python=3.11
激活虚拟环境
conda activate tb_gateway
出现如图就是激活成功了
在Pycharm配置虚拟环境
我在Pycharm中配置虚拟环境时遇到了一个问题:无法正确导入只能正常导入base环境。
解决方案:
Conda可执行文件要选择:E:\Anaconda\Library\bin\conda.bat
这时就可以正常导入创建好的环境
安装python需求
在项目终端执行
pip install -r requirements.txt
安装库
python setup.py install
创建“logs”文件夹
mkdir logs
分析框架
一开始我想要使用ThingsBoard IoT Gateway时,我没有想清楚ThingsBoard IoT Gateway是处在什么位置扮演一个什么角色。
(来源:ThingsBoard IoT Gateway 实战(三)- 使用 MQTT Connector 转接灯_thingsboard 第三方mqtt-CSDN博客)
我看了这个博客(ThingsBoard IoT Gateway 实战(三)- 使用 MQTT Connector 转接灯_thingsboard 第三方mqtt-CSDN博客)后有了比较清晰的认知,ThingsBoard本身是MOTT的服务器也就是Broker,无法直接接入。
- 使用ThingsBoard IoT Gateway做MQTT转换
- 使用EMQX模拟三方厂商的MQTT Broker
- 使用MQTTX模拟三方厂商的设备也就是MQTT Client
EMQX、MQTTX安装及配置
我们前面已经安装好了ThingsBoard IoT Gateway,现在再来安装模拟三方厂商MQTT Broker的EMQX和模拟三方厂商的设备也就是MQTT Client的MQTTX。后面操作主要参考:windows10-EMQX与MQTTX的安装及配置使用教程_emqx windows-CSDN博客
EMQX 概览 | EMQX 文档
EMQX下载安装
下载
- 下载链接:emqx官网 - 版本下载
- 选择合适的版本下载:选择windows系统的安装包
推荐下载5.3.2版本比较新的版本没有windows适配的。
安装
- 将下载的
emqx-5.3.2-windows-amd64.zip解压出来,解压目录不能存在中文、空格、特殊字符
2.打开其中的bin文件夹,在地栏复制地址
3.单击开始菜单,输入cmd,选择以管理员身份运行。
4.在命令行里输入cd 并单击鼠标右键,会粘贴刚才复制的EMQX的bin目录,然后回车键,意为跳转目录至 D:\soft\emqx5.3.2\bin
5.安装EMQX服务,执行命令:
.\emqx.cmd install
此命令只需要运行一次,以后再开机就不用执行它了。
卸载EMQX服务执行命令:
.\emqx.cmd uninstall
提示ChangeServiceConfig 成功,则说明服务安装成功
6. 启动 emqx服务,输入命令:
.\emqx.cmd console
提示EMQX 版本号 is running now!,则说明运行成功
运行EMQX遇到的问题
以上是在博客windows10-EMQX与MQTTX的安装及配置使用教程_emqx windows-CSDN博客中的操作,在我执行.\emqx.cmd console后出现了1883端口被占用,这是因为ThingsBoard也监听了1883端口。
1、1883:MQTT TCP 监听端口,用于设备连接
2、8883:MQTT SSL 监听端口,提供加密设备的连接
3、8083:MQTT WebSocket 监听端口,允许通过Web浏览器连接
4、8084:MQTT WebSocket 监听端口,提供加密的Web浏览器连接
5、18083:EMQX Dashboard 管理控制台端口,用于监控贺管理MQTT服务器
解决方案
将EMQX监听端口改为1884,一开始我以为直接可以在文件emqx.conf中直接修改,正常情况路径为:/ect/emqx/emqx.conf或/ect/emqx.conf,结果没有在文件emqx.conf中找到listeners.tcp.default,我还想了一会儿是不是我下载的版本有点不一样。其实可以直接在文件emqx.conf中加:
listeners.tcp.default {
bind = "0.0.0.0:1884"
max_connections = 1024000
}
然后执行.\emqx.cmd console出现EMQX 版本号 is running now!,则说明运行成功。
浏览器输入localhost:18083回车,即可访问EMQX控制台,在登录页面输入初始化账号 :用户名:admin 密码:public
EMQX常用命令
.\emqx.cmd start :启动服务和 Erlang 节点
.\emqx.cmd stop :停止服务和 Erlang 节点
.\emqx.cmd restart :运行停止命令和启动命令
.\emqx.cmd ping : 检查节点是否正在运行
.\emqx.cmd ctl :运行管理命令
.\emqx.cmd console :在Windows shell 中启动 Erlang 版本
.\emqx.cmd attach :连接到正在运行的节点并打开交互式控制台
.\emqx.cmd remote_console :与附加相同
.\emqx.cmd list : 显示已安装的 Erlang 服务的列表
.\emqx.cmd usage :显示可用命令
MQTTX下载安装
以下主要部分参考:windows10-EMQX与MQTTX的安装及配置使用教程_emqx windows-CSDN博客
下载
EMQX的官方网站打开 :EMQ (emqx.***)
安装及配置
- 双击打开下载的
MQTTX-Setup-1.9.7-x64.exe,开始安装MQTT客户端,选择安装目录,点击完成
2.测试连接:
单击连接按钮,单击新建连接按钮,来创建一个新连接
接下来按如下操作步骤来创建连接
(1)名称随便输入,我这里输入的是test
(2)Client ID默认即可
(3)服务器地址为刚才创建的MQTT本地服务器,因为客户端在同一台电脑上,所以地址为127.0.0.1
(4)端口号1884
(5)然后单击右上角的连接按钮
在MQTT控制台,单击监控菜单下的客户端,可以看到客户端已经连接成功。
平台配置
平台编译安装的一些注意事项可以看看我的第一篇博客【ThingsBoard初体验】本地编译踩坑记录_window11 idea编译thingsboard-CSDN博客
使用默认租户登录ThingsBoard配置网关:
进入添加新设备页面:
添加Token,这里可以设为10001,后面连接设备需要使用
网关(Gateway)配置
tb_gateway.json
在网关配置文件夹/thingsboard-gateway/thingsboard_gateway/config/下修改tb_gateway.json,tb_gateway.json文件是用来连接ThingsBoard平台的。
将“thingsboard”部分中“host”和“port”修改为ThingsBoard主机和端口的值,我是在本地编译部署的所以主机是localhost,端口是1883。
将“security”部分中 "a***essToken"修改为访问令牌"10001"(在平台配置中设置的)
将"connectors"部分中 "type"为"mqtt", "name"为"MQTT Connector", "configuration"为"mqtt.json" ,因为我们要使用MQTT客户端订阅消息。
"thingsboard": {
"host": "localhost",
"port": 1883,
"remoteShell": false,
"remoteConfiguration": true,
"latencyDebugMode": false,
"statistics": {
"enable": true,
"enableCustom": true,
"statsSendPeriodInSeconds": 60,
"customStatsSendPeriodInSeconds": 3600,
"configuration": "statistics.json"
}
"security": {
"type": "a***essToken",
"a***essToken": "10001"
}
"connectors": [
{
"type": "mqtt",
"name": "MQTT Connector",
"configuration": "mqtt.json"
}
]
mqtt.json
mqtt.json是主要用来配置mqtt连接器的一些细节,用来与MQTT Broker进行连接。一般会包含了设备上行(数据上传)、连接/断开管理、属性同步、RPC 调用等完整链路。
将"broker"部分的“host”和“port”修改为MQTT Broker(EMQX)主机和端口,我是在本地编译部署的所以主机是localhost或者是127.0.0.1,端口是1884。
将“security”部分中"type"修改为“basic”,"username"为"admin", "password"为"pubilc",这就是使用用户账号进行访问,我们在访问EMQX控制台,登录页面输入的初始化账号就是用户名:admin 密码:public。
"broker": {
"host": "127.0.0.1",
"port": 1884,
"clientId": "ThingsBoard_gateway",
"version": 5,
"maxMessageNumberPerWorker": 10,
"maxNumberOfWorkers": 100,
"sendDataOnlyOnChange": false,
"keepAlive": 60,
"cleanSession": true,
"cleanStart": true,
"sessionExpiryInterval": 0,
"security": {
"type": "basic",
"username": "admin",
"password": "pubilc"
}
}
查看结果
我们运行tb_gateway.py后,出现以下提示信息证明我们网关与ThingsBoard和MQTT Broker均连接成功。
EMQX控制台也出现了两个连接数
MQTTX客户端可以正常发送数据
向Topic /sensor/data 发送MQTT消息
{
"serialNumber": "A001",
"sensorType": "Thermo",
"sensorModel": "T1000",
"temp": 26.4,
"hum": 58
}
ThingsBoard平台网关和设备正常活动
设备遥测数据也在更新,正常显示属性
网关遥测数据也在更新,正常显示属性
下一步
后面我想要使用脚本同时模拟多个真实设备发送数据,并且从平台获取数据进行下一步处理。目前还不清楚设备是否都支持MQTT协议,后面可能还要尝试modbus