3、通信协议基础:MQTT协议原理、JSON数据格式、Wi-Fi与以太网选型

各位同学,咱们今天聊点实在的。做物联网安防,说白了就是让传感器把话说清楚,并且能及时传到该去的地方。这里头有三个东西绕不开:MQTT协议、JSON数据格式,还有通信方式的选择。我一个个讲,你跟着走就行。

3.1 MQTT协议:物联网的“对讲机”

MQTT,全称是Message Queuing Telemetry Transport。名字挺长,但原理很简单——它就是个轻量级的发布/订阅模型。我习惯把它比作一个微信群:传感器是群成员,服务器是群主。传感器往群里发消息,谁需要谁就去取。

为什么物联网安防偏爱MQTT?

  • 极轻量:报文头最小只有2字节。我在一个项目里用4G模块传数据,流量费省了一大截。
  • 支持QoS:三种服务质量等级,从“发完不管”到“确保送达”。安防告警我一般用QoS 1,丢了可不行。
  • 持久连接:长连接+心跳保活,传感器不用反复握手。这对电池供电的设备太重要了。
  • 遗嘱消息:设备突然掉线,服务器能收到“最后遗言”。嗯,这个功能在安防场景里很实用。

核心概念速览

  • Broker:消息代理,就是服务器。我常用Mosquitto或EMQX。
  • Topic:主题,消息的“标签”。比如 home/livingroom/door/sensor
  • Publish:发布者,传感器往Topic发数据。
  • Subscribe:订阅者,告警中心或手机App订阅Topic。

一个简单的MQTT通信示例

假设你有一个门磁传感器,检测到门被打开。它要发一条消息给服务器。伪代码大概是这样的:

// 传感器端(发布者)
client.publish("home/livingroom/door", "{\"status\":\"open\",\"timestamp\":1700000000}", 1);

// 告警中心(订阅者)
client.subscribe("home/+/door", function(topic, payload) {
    // 解析JSON,判断是否需要告警
    console.log("收到门状态:", payload);
});

你看,代码就这么几行。但要注意,Topic里的 + 是通配符,表示匹配任意一级。我刚开始用的时候,经常把 #+ 搞混,后来吃了亏才记住——# 匹配多级,+ 只匹配一级。

我的经验:Topic命名最好用层级结构,比如 设备类型/位置/传感器/动作。这样后期扩展方便,也容易做权限控制。

3.2 JSON数据格式:传感器的“普通话”

MQTT只管把消息传过去,但消息里写什么?我建议用JSON。为什么?因为它人类可读,解析简单,而且几乎所有语言都支持。

一个标准的安防传感器JSON报文

{
  "device_id": "door_sensor_001",
  "type": "door_magnetic",
  "status": "open",
  "timestamp": 1700000000,
  "battery": 85,
  "signal_strength": -65
}

字段说明:

字段 类型 说明
device_id string 设备唯一标识,我习惯用MAC地址后6位+随机数
type string 传感器类型,方便服务器做不同处理
status string 当前状态,open/close, motion/no_motion等
timestamp int Unix时间戳,单位秒。注意时区问题
battery int 电量百分比,0-100。低于20%就该告警了
signal_strength int 信号强度,dBm。这个值我一般用来判断通信质量

避坑指南:我曾经在项目里用浮点数表示电量,结果解析时精度丢失,导致告警逻辑出错。后来统一改成整数百分比,再也没出过问题。记住,JSON里能用整数就别用浮点数。

JSON嵌套与数组

有时候一个传感器会同时上报多个数据。比如一个温湿度传感器:

{
  "device_id": "temp_hum_002",
  "readings": [
    {"type": "temperature", "value": 25.3, "unit": "celsius"},
    {"type": "humidity", "value": 60, "unit": "%"}
  ],
  "timestamp": 1700000000
}

这种结构很灵活。你想想看,如果以后要加个气压传感器,直接在 readings 数组里加一项就行,不用改协议。这就是JSON的好处。

3.3 Wi-Fi与以太网选型:有线还是无线?

这个问题,我几乎在每个项目里都会被问到。我的回答是:看场景,没有绝对的好坏。

Wi-Fi方案

  • 优点:部署灵活,不用布线,适合改造项目。ESP8266/ESP32芯片便宜,生态成熟。
  • 缺点:功耗高,穿墙能力差,受干扰大。我有个项目在工厂里用Wi-Fi,结果机器一开,信号直接掉到-90dBm。
  • 适用场景:家庭安防、办公室、小型商铺。这些地方Wi-Fi覆盖好,设备数量少。

以太网方案

  • 优点:稳定,延迟低,不受无线干扰。PoE供电还能省一根电源线。
  • 缺点:需要布线,施工成本高。后期改位置很麻烦。
  • 适用场景:机房、银行、医院、工厂。这些地方对稳定性要求极高,不能容忍掉线。

我的选型建议

场景 推荐方案 理由
家庭门磁/窗磁 Wi-Fi 部署方便,成本低
工厂设备监控 以太网 抗干扰,稳定可靠
商场烟感 Wi-Fi + 有线备份 主用Wi-Fi,有线做心跳保底
银行金库门禁 以太网 安全第一,不能有无线风险

混合方案

说实话,现在很多项目都是混合的。比如一个智能楼宇,核心设备用有线,边缘传感器用Wi-Fi。中间通过一个网关做协议转换。我做过一个项目,网关用树莓派,一边接以太网连云端,一边用Wi-Fi连十几个传感器。效果还不错。

一个小技巧:如果你用Wi-Fi,记得把传感器放在离路由器近的地方,或者用Mesh组网。我曾经在别墅项目里,门磁离路由器太远,经常掉线。后来加了个中继器,问题就解决了。

3.4 三者如何配合?

好了,现在我们把三个东西串起来。一个典型的安防传感器工作流程是这样的:

  1. 传感器采集数据:比如门磁检测到门开了。
  2. 封装成JSON:把状态、时间、电量等信息写成JSON字符串。
  3. 通过MQTT发布:传感器作为客户端,把JSON发布到指定Topic。
  4. Broker转发:MQTT Broker收到消息,转发给所有订阅者。
  5. 告警中心处理:订阅者(比如手机App)解析JSON,判断是否触发告警。

你想想看,如果不用MQTT,传感器得自己建立TCP连接,自己处理重连,自己管理会话。那代码量至少翻一倍。而JSON让数据格式统一,不管后端用什么语言解析,都不会出错。至于Wi-Fi还是以太网,就看你的设备是固定安装还是灵活部署了。

最后提醒一句:无论选哪种方案,一定要做断线重连和心跳检测。我见过太多项目,设备上线时好好的,过几天就失联了。原因就是没做重连机制。MQTT有内置的Last Will和心跳,一定要用起来。

好了,这一章就到这里。下一章我们聊聊传感器数据采集与边缘计算,到时候我会分享一些我在实际项目中踩过的坑。