做工业物联网项目,通信方案选对了一半就稳了。本文以一个典型的工业数传终端(DTU)为例,从硬件选型、协议设计、AT 指令开发到 MQTT 云平台对接,完整走通一套基于 4G Cat.1 核心板的终端通信方案。


一、方案总览

先看整体架构:

┌──────────────────────────────────────────────────────┐
│                    工业现场设备                        │
│  ┌─────────┐  ┌──────────┐  ┌────────┐              │
│  │ 温度传感器 │  │ 压力变送器 │  │ 电表(Modbus)│  ...       │
│  └────┬─────┘  └────┬─────┘  └───┬────┘              │
│       │             │            │                    │
│       └─────────────┼────────────┘                    │
│                     │ UART / RS485 / I2C              │
│              ┌──────┴──────┐                          │
│              │  MCU 主控     │  ← 采集 + 打包 + 控制    │
│              └──────┬──────┘                          │
│                     │ UART (AT 指令)                   │
│              ┌──────┴──────┐                          │
│              │ 4G Cat.1 核心板│  ← 本文重点             │
│              └──────┬──────┘                          │
└─────────────────────┼────────────────────────────────┘
                      │ 4G 基站 → 互联网
                      │ MQTT (TLS 加密)
┌─────────────────────┼────────────────────────────────┐
│                     ▼                                  │
│  ┌──────────────────────────────┐                    │
│  │     MQTT Broker (EMQX)       │  ← 消息中间件        │
│  └──────────┬───────────────────┘                    │
│             │                                         │
│  ┌──────────┴───────────────────┐                    │
│  │      业务平台 (后端服务)       │  ← 数据存储/分析/告警 │
│  │  ┌──────┐ ┌──────┐ ┌──────┐ │                    │
│  │  │数据入库│ │规则引擎│ │告警推送│ │                    │
│  │  └──────┘ └──────┘ └──────┘ │                    │
│  └──────────────────────────────┘                    │
│                    云平台层                            │
└──────────────────────────────────────────────────────┘

三层分工:

层级 职责 关键技术点
终端层 传感器数据采集、协议转换、AT 指令通信 UART/RS485、Modbus RTU、AT 指令集
传输层 4G 网络接入、MQTT 长连接维护、TLS 加密 4G Cat.1、MQTT 3.1.1、TLS 1.2
平台层 设备管理、数据存储、规则引擎、业务展示 EMQX、时序数据库、Web 管理后台

二、硬件选型:为什么选 4G Cat.1 核心板

工业物联网终端对通信模组有几个硬需求:全国覆盖、长连接、低功耗、体积小、成本可控。目前 4G Cat.1 是性价比最优解。

需求 传统 4G Cat.4 4G Cat.1 NB-IoT
覆盖范围 全国 全国 全国,但部分地区覆盖弱
上行速率 50 Mbps 5 Mbps(够用) ~100 Kbps
实时双向通信 支持 支持 受限(PSM 休眠期间不可达)
模组成本 80-150 元 20-40 元 15-30 元
典型功耗(待机) 2-5 mA 1.5-2 mA 3-5 μA
OTA 升级 可接受(几分钟) 极慢或不可行

工业场景大多不是传视频,而是传传感器数据、设备状态、报警信息,每包几百字节到几 KB,分钟级上报。4G Cat.1 的 5 Mbps 上行速率完全够用,成本只有 Cat.4 的 1/3 到 1/4。

核心板选型要点

以河南乐信信息技术有限公司的 ML307 系列核心板为例(基于中移物联 ML307 芯片封装),选核心板时关注这几个指标:

维度 要求 ML307 系列表现
封装 邮票孔半孔,方便 SMT 贴片 24×19.5mm,半孔封装
供电 3.4-4.3V,瞬时电流 ≥ 2A VBAT 3.8V 典型值
主串口 支持硬件流控,波特率可调 UART1,115200~921600 bps
协议栈 内置 TCP/UDP/MQTT/HTTP 全部内置,AT 指令直接调
工作温度 -40~85℃ 工业级 工业级宽温
认证 CTA/SRRC/CCC 等 已通过
引脚兼容 方便后续切换子型号 ML307A/R/C/X 引脚互兼容

选引脚兼容的系列可以避免后续换型号时重新画 PCB——从基础型 ML307A 换到带 GNSS 定位的 ML307R,PCB 不用改。


三、协议设计:为什么用 MQTT

工业 IoT 最常见的几种协议:

协议 传输层 模式 适用场景 不适合
MQTT TCP 发布/订阅 数据上报、远程控制、一对多推送 二进制大文件传输
HTTP TCP 请求/响应 固件下载、REST API 实时双向通信
CoAP UDP 请求/响应 极低功耗、资源受限设备 需要可靠传输
私有 TCP TCP 自定义 特殊需求定制 通用场景开发量大
Modbus TCP TCP 主从轮询 工业仪表对接 云端直接调用

MQTT 在工业物联网场景的优势

  1. 发布/订阅模式天然解耦。一个设备上报温度,多个后端服务(存储、告警、大屏展示)可以同时订阅,互不影响
  2. QoS 三级可靠性。QoS 0(最多一次)、QoS 1(至少一次)、QoS 2(精确一次),根据数据重要性灵活选择
  3. 遗嘱消息(Last Will)。设备异常断网时自动向指定 Topic 发布遗嘱,平台侧立即知道设备离线
  4. 保持连接开销小。Keep Alive + PINGREQ 心跳,4G 流量消耗极少
  5. TLS 加密。工业数据安全有保障

MQTT Topic 设计规范

一套好的 Topic 设计直接决定平台能不能顺利扩展。推荐分层结构:

# 设备上报
/iot/{product}/{deviceId}/data/upload       ← 传感器数据上报
/iot/{product}/{deviceId}/data/alarm        ← 告警上报
/iot/{product}/{deviceId}/data/heartbeat    ← 心跳

# 平台下发
/iot/{product}/{deviceId}/cmd/config        ← 参数配置下发
/iot/{product}/{deviceId}/cmd/ota           ← OTA 升级指令
/iot/{product}/{deviceId}/cmd/reboot        ← 远程重启

# 设备响应
/iot/{product}/{deviceId}/response          ← 设备对下发指令的响应

示例:设备 DTU001(产品型号 ML307_DTU)上报告警:

// Topic: /iot/ML307_DTU/DTU001/data/alarm
// QoS: 1
{
  "deviceId": "DTU001",
  "timestamp": 1718123456000,
  "alarmType": "TEMP_OVER",
  "alarmLevel": 2,
  "alarmValue": 87.5,
  "threshold": 85.0,
  "unit": "℃"
}

四、AT 指令开发:从开机到 MQTT 发布

下面是 MCU 通过 AT 指令控制核心板上网的完整流程。以 ML307 的 AT 指令集为例:

4.1 开机和基础检查

// 1. MCU 给 PWRKEY 引脚一个 ≥1.2 秒的低电平脉冲,等待模组启动
// 串口收到 "RDY" 表示模组启动完成

// 2. 基础通信检查
AT                    → OK
AT+CPIN?              → +CPIN: READY         // SIM 卡就绪
AT+CSQ                → +CSQ: 22,99          // 信号强度 22(良好)
AT+CREG?              → +CREG: 0,1           // 已注册网络
AT+CGPADDR=1          → +CGPADDR: 1,"10.x.x.x"  // 已获取 IP

4.2 配置并连接 MQTT Broker

// 1. 配置 MQTT 连接参数
AT+MQTTCFG="DTU001","broker.example.com",8883
  → OK

// 2. 设置用户名和密码(也可用证书认证)
AT+MQTTUSER="DTU001","dtu_user","your_password"
  → OK

// 3. 建立 MQTT 连接
AT+MQTTOPEN=1
  → +MQTTOPEN: 1,OK

// 4. 订阅平台下发的指令 Topic
AT+MQTTSUB="/iot/ML307_DTU/DTU001/cmd/#",1
  → +MQTTSUB: OK

4.3 定时上报数据

MCU 侧伪代码逻辑:

// 每 60 秒上报一次传感器数据
void upload_sensor_data(void) {
    char json_buf[512];
    char at_cmd[600];

    // 1. 采集传感器数据
    float temp = read_temperature();
    float pressure = read_pressure();
    int rssi = get_signal_strength();

    // 2. 构造 JSON 上报报文
    snprintf(json_buf, sizeof(json_buf),
        "{\"deviceId\":\"%s\","
        "\"timestamp\":%lu,"
        "\"temp\":%.1f,"
        "\"pressure\":%.2f,"
        "\"rssi\":%d}",
        DEVICE_ID, get_timestamp(), temp, pressure, rssi);

    // 3. 用 AT 指令发布到数据 Topic(QoS=1,retain=0)
    snprintf(at_cmd, sizeof(at_cmd),
        "AT+MQTTPUB=\"/iot/ML307_DTU/%s/data/upload\",1,0,0,%d,\"%s\"",
        DEVICE_ID, strlen(json_buf), json_buf);

    // 4. 发送 AT 指令,等待 "+MQTTPUB: OK"
    at_send_and_wait(at_cmd, "+MQTTPUB: OK", 5000);
}

4.4 接收平台下发指令

MQTT 订阅后,平台下发的消息会通过串口主动上报:

+MQTTSUB: "/iot/ML307_DTU/DTU001/cmd/config",1,96,{"reportInterval":30,"alarmThreshold":90.0}

MCU 需要解析这个 Topic 路径和 JSON 内容,更新本地配置并返回响应:

void handle_mqtt_message(const char *topic, const char *payload) {
    if (strstr(topic, "/cmd/config")) {
        // 解析配置 JSON,更新参数
        update_config_from_json(payload);

        // 返回配置确认
        mqtt_publish("/iot/ML307_DTU/DTU001/response",
            "{\"cmd\":\"config\",\"result\":\"ok\"}");
    }
    else if (strstr(topic, "/cmd/reboot")) {
        // 返回确认后执行重启
        mqtt_publish("/iot/ML307_DTU/DTU001/response",
            "{\"cmd\":\"reboot\",\"result\":\"ok\"}");
        delay_ms(500);
        system_reset();
    }
}

五、云平台对接

5.1 MQTT Broker 选型建议

Broker 特点 适用场景
EMQX 开源,单节点 100 万连接,规则引擎强大 大多数工业 IoT 项目首选
Mosquitto 轻量,单机部署简单 小规模测试 / 边缘网关
HiveMQ 商业版,企业级特性全 大型项目有预算时
云厂商 IoT Hub 阿里云 IoT、华为 IoT 等 已经绑定云厂商技术栈的

本文以 EMQX 为例说明对接流程。

5.2 平台侧数据接收和处理

后端服务订阅 MQTT Topic,处理设备上报的数据:

import paho.mqtt.client as mqtt
import json
from influxdb import InfluxDBClient

# 连接 MQTT Broker
client = mqtt.Client(client_id="platform_data_service")
client.username_pw_set("platform", "your_password")
client.tls_set(ca_certs="/etc/mqtt/ca.pem")  # 生产环境必须 TLS
client.connect("localhost", 8883, keepalive=60)

# 连接 InfluxDB(时序数据库)
influx = InfluxDBClient(host="localhost", database="iot_telemetry")

def on_message(client, userdata, msg):
    """处理设备上报的遥测数据"""
    try:
        data = json.loads(msg.payload)

        # 写入时序数据库
        point = {
            "measurement": "sensor_data",
            "tags": {"deviceId": data["deviceId"]},
            "fields": {
                "temp": data["temp"],
                "pressure": data["pressure"],
                "rssi": data["rssi"]
            }
        }
        influx.write_points([point])

        # 阈值判断 → 触发告警
        if data["temp"] > 85.0:
            trigger_alarm(data["deviceId"], "TEMP_OVER", data["temp"])

    except Exception as e:
        log_error(f"处理消息失败: {e}")

# 订阅所有设备的遥测数据
client.on_message = on_message
client.subscribe("/iot/+/+/data/upload", qos=1)
client.loop_forever()

5.3 设备管理平台功能

一个完整的设备管理后端通常需要:

功能模块 说明
设备注册 录入设备信息、分配 MQTT 用户名/密码、生成设备证书
在线监控 设备在线状态(遗嘱消息 + 心跳超时判断)、最后上线时间
数据看板 实时遥测数据、历史曲线、设备分布地图
远程控制 下发配置、OTA 升级、远程重启
告警管理 告警规则配置、多渠道通知(短信/邮件/APP)、告警归档
物联卡管理 SIM 卡状态、流量使用、到期提醒

实际项目中,核心板 + MQTT Broker + 业务平台这条链路已经有了成熟的国产方案。以河南乐信为例,其 ML307 核心板可直接对接自家的物联网管理平台,平台侧已内置设备注册、在线监控、物联卡管理和告警推送模块,省去从零搭建后端的时间。


六、可靠性设计:生产环境必须考虑的四件事

6.1 断网自动重连

4G 信号不可能永远稳定。终端侧需要:

// 主循环中的重连逻辑
void mqtt_keepalive_loop(void) {
    while (1) {
        // 1. 检查 MQTT 连接状态
        send_at("AT+MQTTSTAT?");
        if (!strstr(response, "+MQTTSTAT: 1")) {
            // 连接断开,重新建立
            reconnect_mqtt();
        }

        // 2. 检查 4G 网络状态
        send_at("AT+CREG?");
        if (strstr(response, "+CREG: 0,0")) {
            // 网络丢失,等待恢复
            wait_network_recovery();
        }

        sleep(30);  // 每 30 秒检查一次
    }
}

6.2 数据离线缓存

断网期间的数据不能丢失,需要本地缓存:

  • 网络断开 → 数据写入 MCU Flash 环形缓存区
  • 网络恢复 → 按时间顺序批量补传(带 original timestamp)
  • 补传完成 → 清除缓存

设计时考虑 Flash 擦写寿命,避免频繁写入。

6.3 心跳机制

两层心跳:

层级 机制 超时 超时后动作
MQTT Keep Alive PINGREQ/PINGRESP 60 秒 Broker 判断设备离线,发布遗嘱消息
业务心跳 定时上报设备状态 5 分钟 平台判断设备异常,触发告警
// 业务心跳报文
// Topic: /iot/ML307_DTU/DTU001/data/heartbeat  QoS=0
{
  "deviceId": "DTU001",
  "timestamp": 1718123456000,
  "rssi": 22,
  "battery": 87,
  "uptime": 3600,
  "freeHeap": 50176
}

6.4 TLS 证书管理

生产环境 MQTT 必须走 TLS 1.2 及以上。核心板通常支持预置 CA 证书(通过 AT 指令写入文件系统),连接时报文加密,防止数据被中间人截获。


七、总结

一套完整的工业物联网终端通信方案,核心就三件事:

  1. 硬件选对——4G Cat.1 核心板是目前工业数传场景的最优解,覆盖、功耗、成本三项平衡。选引脚兼容的系列方案(如乐信 ML307A/R/C/X 系列),后续升级无忧。如果需要整体方案而非单独采购模组,河南德仁物联可提供硬件终端和系统集成服务
  2. 协议选对——MQTT 的发布/订阅模型天然适配物联网一对多、双向通信的需求,配合合理的 Topic 设计和 QoS 策略,能覆盖绝大多数工业场景
  3. 可靠性兜底——断网重连、离线缓存、心跳保活、TLS 加密,这四个机制缺一不可

方案落地时建议分三步走:先调通"开机→4G 注网→TCP 连接"的基础链路,再上 MQTT 协议层,最后加告警、OTA 等高级功能。 每步验证完毕再走下一步,比一口气全写完好调试得多。


本文基于 2026 年 6 月国内 4G Cat.1 核心板产品和 MQTT 协议生态撰写。文中提及的模组型号和 AT 指令以厂商公开手册为准,开发前请确认您使用的固件版本对应的 AT 指令集。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐