MQTT数据中转
MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,专门为物联网(IoT)设备设计,具有低带宽、低功耗、高可靠性的特点。
基本架构:
- 发布者(Publisher):发送消息的设备或应用
- 订阅者(Subscriber):接收消息的设备或应用
- 代理(Broker):消息中转服务器(如ThingsBoard)
- 主题(Topic):消息的分类标识符(如v1/devices/me/telemetry)
整体流程
设备 <--ModbusTCP --> TDS <--脚本转换 --> thingsBoardMO结构
VP-HZ-XH-001
- Main
-- telemetry 遥测
--- 字段1
--- 字段2
-- attributes 属性
--- 字段1
--- 字段2
- Device1
-- telemetry 遥测
-- attributes 属性ThingsBoard
中文网:http://www.ithingsboard.com/
Docker 部署
在任意目录(如 D:\thingsboard)创建 docker-compose.yml文件,内容如下:
version: '3.8'
services:
# ThingsBoard主服务
thingsboard:
image: thingsboard/tb-postgres:latest
container_name: thingsboard-server
restart: always
ports:
- "8080:9090" # Web UI端口
- "1883:1883" # MQTT端口
- "7070:7070" # Edge RPC端口
- "5683-5688:5683-5688/udp" # CoAP端口
environment:
TB_QUEUE_TYPE: in-memory
volumes:
- thingsboard-data:/data
- thingsboard-logs:/var/log/thingsboard
networks:
- tb-network
healthcheck:
test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:9090"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# ThingsBoard网关
tb-gateway:
image: thingsboard/tb-gateway:latest
container_name: tb-gateway
restart: always
depends_on:
thingsboard:
condition: service_healthy
ports:
- "60000-61000:60000-61000" # 网关端口范围
environment:
- TB_GW_HOST=thingsboard
- TB_GW_PORT=1883
- TB_GW_ACCESS_TOKEN=${TB_GW_ACCESS_TOKEN}
volumes:
- ./gateway/config:/thingsboard_gateway/config
- ./gateway/logs:/thingsboard_gateway/logs
- ./gateway/extensions:/thingsboard_gateway/extensions
networks:
- tb-network
networks:
tb-network:
driver: bridge
volumes:
thingsboard-data:
thingsboard-logs:创建目录
mkdir gateway\config gateway\logs gateway\extensions创建 .env文件,包含网关的访问令牌
TB_GW_ACCESS_TOKEN=YOUR_GATEWAY_ACCESS_TOKEN_HERE创建网关配置文件
thingsboard:
host: thingsboard
port: 1883
remoteShell: false
remoteConfiguration: false
security:
accessToken: "${TB_GW_ACCESS_TOKEN}"
storage:
type: memory
read_records_count: 100
max_records_count: 100000
connectors:
- name: MQTT Connector
type: mqtt
configuration: mqtt.json创建 gateway/config/mqtt.json(基本配置)
{
"broker": {
"name": "Local MQTT Broker",
"host": "localhost",
"port": 1883,
"clientId": "ThingsBoardGateway"
},
"mapping": [
{
"topicFilter": "sensor/+/data",
"converter": {
"type": "json",
"deviceNameJsonExpression": "${serialNumber}",
"deviceTypeJsonExpression": "default",
"timeout": 60000,
"attributes": [],
"timeseries": []
}
}
]
}启动 ThingsBoard 服务 在 docker-compose.yml文件所在目录执行
# 拉取镜像并启动服务
docker-compose up -d
# 查看启动日志
docker-compose logs -f mytb访问地址:http://localhost:8080
默认账号:
系统管理员:sysadmin@thingsboard.org/ sysadmin
租户管理员:tenant@thingsboard.org/ tenant 这个账号才能看到设备
客户用户:customer@thingsboard.org/ customer首次启动可能需要几分钟时间完成数据库初始化
网关配置
创建设置,勾选网关选项
打开设备详情页,点击"复制访问令牌"获取访问令牌(Access Token)
设备凭据中设置连接配置

和TDS 上级服务配置 对应

设备配置
在ThingsBoard中,网关设备本身不直接管理子设备的字段,而是通过设备配置文件和规则链来统一管理所有子设备的字段配置。
在设备配置界面中新建设备,填写配置名称,选择默认规则链,配置传输类型为MQTT

实体 - 设备
定义属性映射和遥测数据映射
属性配置:
- 服务器端属性:由平台管理的设备基本信息
- 客户端属性:由设备上报的属性
- 共享属性:跨设备共享的属性
遥测数据配置:
- 定义数据键名(如temperature、humidity)
- 设置数据类型(double、integer、string等)
- 配置数据持久化策略
网关与子设备的数据流转
网关作为中间件,主要承担以下职责:
- 协议转换:将不同工业协议(如Modbus、OPC-UA)转换为ThingsBoard支持的MQTT协议
- 数据聚合:从多个设备采集数据,统一转发到平台,减少网络连接数
- 边缘计算:在本地进行数据预处理、过滤和缓存,减轻云端压力
- 离线存储:网络中断时缓存数据,恢复后自动补传
设备是物联网系统的数据源,主要特点包括:
- 直接连接:通过MQTT、HTTP或CoAP协议直接与ThingsBoard平台通信
- 单一协议:通常只使用一种通信协议
- 数据采集:负责采集环境参数、设备状态等信息
- 远程控制:接收平台下发的控制指令
- 子设备自动注册
网关通过MQTT主题 v1/gateway/connect向平台注册子设备:
{
"device": "子设备名称"
}平台会自动创建或查找该设备,并将其关联到网关
检查连通性
docker run --rm -it --add-host=host.docker.internal:host-gateway thingsboard/mosquitto-clients mosquitto_pub -d -q 1 -h host.docker.internal -p 1883 -t v1/devices/me/telemetry -i "VP-HZ-XH-001" -u "test" -P "test" -m "{temperature:25}"网关非活动状态排查步骤
- 检查ThingsBoard服务状态
# 确认ThingsBoard容器正常运行
docker-compose ps返回
time="2026-01-05T15:58:30+08:00"
level=warning
msg="D:\\thingsboard\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
thingsboard-server thingsboard/tb-postgres:latest "start-tb.sh" thingsboard 33 minutes ago Up 33 minutes (unhealthy) 0.0.0.0:1883->1883/tcp, [::]:1883->1883/tcp, 0.0.0.0:7070->7070/tcp, [::]:7070->7070/tcp, 0.0.0.0:5683-5688->5683-5688/udp, [::]:5683-5688->5683-5688/udp, 0.0.0.0:8081->9090/tcp, [::]:8081->9090/tcpThingsBoard容器状态: Up 33 minutes (unhealthy) ✅ 容器正在运行(Up 33 minutes) ⚠️ 但健康检查失败(unhealthy)
网关容器状态: 没有显示 ❌ 说明网关容器根本没有启动 原因:依赖的ThingsBoard健康检查失败
原因:ThinksBoard 和 ThinksBoard Gateway 要在一个 docker 容器中部署,负责存在网络隔离,无法通信
# 查看ThingsBoard日志,确认服务完全启动
docker-compose logs --tail 50 thingsboard | findstr "Started|started"