Skip to content

MQTT数据中转

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,专门为物联网(IoT)设备设计,具有低带宽、低功耗、高可靠性的特点。

基本架构:

  • 发布者(Publisher):发送消息的设备或应用
  • 订阅者(Subscriber):接收消息的设备或应用
  • 代理(Broker):消息中转服务器(如ThingsBoard)
  • 主题(Topic):消息的分类标识符(如v1/devices/me/telemetry)

整体流程

设备 <--ModbusTCP --> TDS <--脚本转换 --> thingsBoard

MO结构

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平台通信
  • 单一协议:通常只使用一种通信协议
  • 数据采集:负责采集环境参数、设备状态等信息
  • 远程控制:接收平台下发的控制指令
  1. 子设备自动注册

网关通过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}"

网关非活动状态排查步骤

  1. 检查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/tcp
  1. ThingsBoard容器状态: Up 33 minutes (unhealthy) ✅ 容器正在运行(Up 33 minutes) ⚠️ 但健康检查失败(unhealthy)

  2. 网关容器状态: 没有显示​ ❌ 说明网关容器根本没有启动 原因:依赖的ThingsBoard健康检查失败

原因:ThinksBoard 和 ThinksBoard Gateway 要在一个 docker 容器中部署,负责存在网络隔离,无法通信

# 查看ThingsBoard日志,确认服务完全启动
docker-compose logs --tail 50 thingsboard | findstr "Started|started"