LoRa 基站如何发布 MQTT
一、先搞清楚:LoRa 基站发布 MQTT 是什么意思
在 IoT 架构中,LoRa 基站(Gateway) 通常做两件事:
-
接收:从 LoRa 模组收到无线数据(比如
A001,25.3) -
转发:把数据通过以太网(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)做:
-
解析 LoRa 载荷 →
{"device":"A001","temp":25.3,"hum":60} -
决定 MQTT 主题,常见格式:
-
lorawan/devices/A001/up(上行数据) -
lorawan/devices/A001/temperature -
sensors/data
-
-
决定 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 的完整代码

浙公网安备 33010602011771号