LoRa 基站如何发布 MQTT

 LoRa 基站如何发布 MQTT,并且会说明它如何与你已有的 AJAX 架构共存。


一、先搞清楚:LoRa 基站发布 MQTT 是什么意思

在 IoT 架构中,LoRa 基站(Gateway) 通常做两件事:

  1. 接收:从 LoRa 模组收到无线数据(比如 A001,25.3

  2. 转发:把数据通过以太网(WiFi/4G/网线)转换成 MQTT 协议,发给一个 MQTT Broker(服务器上运行的软件,如 Mosquitto/EMQX)

也就是说:LoRa 基站在 MQTT 中扮演“发布者(Publisher)”


二、LoRa 基站发布 MQTT 的具体过程(分 5 步)

第 0 步:前提条件

  • LoRa 基站已连接互联网(通过网线或 4G)

  • 服务器上已经安装并运行了一个 MQTT Broker(比如 Mosquitto)

  • 基站的配置文件中已设置好:

    • Broker 地址:192.168.1.100

    • Broker 端口:1883(默认)

    • 主题格式:例如 lorawan/devices/+/up


第 1 步:LoRa 基站收到 LoRa 无线数据

假设现场有一个 LoRa 温湿度传感器(节点)发送:

设备ID: A001
温度: 25.3°C
湿度: 60%

LoRa 无线包内容(十六进制)例如:A00125.360(简化举例)

LoRa 基站通过天线接收到这个无线包。


第 2 步:基站内部解析并构造 MQTT 消息

基站固件或内部服务(如 Semtech UDP Packet Forwarder 或 ChirpStack Gateway Bridge)做:

  1. 解析 LoRa 载荷 → {"device":"A001","temp":25.3,"hum":60}

  2. 决定 MQTT 主题,常见格式:

    • lorawan/devices/A001/up (上行数据)

    • lorawan/devices/A001/temperature

    • sensors/data

  3. 决定 QoS(通常 0 或 1)

示例构造结果

  • 主题lorawan/devices/A001/up

  • 消息体(Payload){"temp":25.3,"hum":60,"rssi":-75}

  • QoS:1

  • 保留标志(Retain):false(普通数据一般不留)


第 3 步:基站通过以太网发布 MQTT 消息

基站内部有一个 MQTT 客户端库(如 Eclipse Paho),它做:

// 伪代码
mqtt_client.connect("192.168.1.100", 1883);
mqtt_client.publish("lorawan/devices/A001/up", "{\"temp\":25.3,\"hum\":60}", 1, false);
mqtt_client.disconnect();

实际上:

  • 基站与 MQTT Broker 建立一个 TCP 连接

  • 发送 PUBLISH 控制报文(MQTT 协议规定)

  • Broker 回复 PUBACK(如果 QoS=1)

整个过程通过网络(以太网/WiFi/4G)完成。


第 4 步:MQTT Broker 收到并转发

MQTT Broker(服务器上的软件):

  • 收到主题 lorawan/devices/A001/up 的消息

  • 查订阅列表:谁订阅了这个主题?

  • 如果有一个后端服务订阅了 lorawan/#,Broker 会立即把消息推送给它


第 5 步:MQTT 与你的 AJAX 后端结合(重要)

你之前的架构里,浏览器通过 AJAX 从后端拿数据。现在加入 MQTT 后,流程变成:

LoRa 基站(MQTT 发布者)
  ↓ MQTT
MQTT Broker(服务器)
  ↓ 转发给订阅者
后端服务(MQTT 订阅者 + HTTP API)
  ↓ 存入数据库 + 提供 REST API
浏览器(AJAX 轮询)

具体结合方法

后端服务(比如 Node.js):

// 1. 订阅 MQTT
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://localhost:1883');
client.subscribe('lorawan/+/up');
client.on('message', (topic, message) => {
 const data = JSON.parse(message);
 // 2. 存入数据库
 db.insert(data);
 // 3. 可选:触发 WebSocket 通知浏览器(但你要求 AJAX,所以不主动推)
});

// 4. 提供 HTTP API 供浏览器 AJAX 调用
app.get('/api/latest', (req, res) => {
 const latest = db.query('SELECT * FROM sensors ORDER BY time DESC LIMIT 1');
 res.json(latest);
});

浏览器仍然用 AJAX 每隔几秒请求 /api/latest


三、实际产品中如何配置(不用写代码)

大多数商业 LoRa 基站(如 Dragino、RAK、The Things Network)都支持 Web 管理界面配置 MQTT:

配置示例(Web 界面):

MQTT Server Address: 192.168.1.100:1883
MQTT Client ID: gateway_001
MQTT Username: loragw
MQTT Password: ******
Publish Topic Prefix: lorawan/devices
Subscribe Topic Prefix: lorawan/gateways

配置好后,基站自动:

  • 把每个 LoRa 节点数据发布到 lorawan/devices/{device_id}/up

  • 自己也会订阅下行主题(比如发送命令给节点)


四、为什么 LoRa 基站要用 MQTT 发布?(优势)

特性说明
解耦 基站不需要知道后端服务是谁,只管发 MQTT
多订阅者 可以有多个后端服务同时订阅(如实时展示 + 历史存储 + 报警)
轻量 MQTT 协议头很小,适合 LoRa 基站有限的 CPU/内存
断网重连 MQTT 自带自动重连、会话保持
工业标准 几乎所有 IoT 平台(AWS IoT、Azure IoT、ThingsBoard)都支持

五、与你之前架构的对比

之前你描述的(无 MQTT)现在加入 MQTT
基站 → 服务器:HTTP POST 基站 → 服务器:MQTT PUBLISH
后端:接收 HTTP 请求 后端:订阅 MQTT 主题
扩展性一般 扩展性好,可加多个订阅者
实时性靠轮询 实时性靠 MQTT 推送(后端可立即入库)
对浏览器仍为 AJAX 对浏览器仍为 AJAX(不变)

六、一句话总结

LoRa 基站发布 MQTT 就是:基站把从无线收到的 LoRa 数据,通过以太网转换成 MQTT 协议,发送给服务器上的 MQTT Broker,让任何订阅了相关主题的后端服务都能实时收到数据。

如果你想要一个 可在真实 LoRa 基站上运行的配置片段(比如 ChirpStack 或 The Things Stack 的 MQTT 集成),或者想看 后端订阅 MQTT 并同时提供 AJAX API 的完整代码,告诉我具体语言(Python/Node.js/Java),我可以直接给你写出来。

posted @ 2026-05-25 20:57  星火撩原  阅读(4)  评论(0)    收藏  举报