跳到主要内容

通信协议详解

通信协议是物联网设备之间数据交换的规则和约定。本文将详细介绍物联网常用的通信协议,包括 MQTT、CoAP、HTTP 等。

MQTT 协议

协议概述

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,专为低带宽、高延迟的网络环境设计,是物联网领域最流行的通信协议。

协议特点:

  • 轻量级:协议头最小 2 字节
  • 发布/订阅模式:解耦消息生产者和消费者
  • QoS 支持:三种消息质量保证
  • 遗嘱消息:设备异常断开时通知
  • 保留消息:新订阅者获取最新状态

架构模型

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ Publisher │ │ Broker │ │ Subscriber │
│ (设备/应用) │────▶│ (消息代理) │────▶│ (设备/应用) │
└─────────────┘ └─────────────┘ └─────────────┘


┌─────────────┐
│ Topic │
│ (消息主题) │
└─────────────┘

主题(Topic)

主题是 MQTT 消息路由的核心,采用层级结构:

home/livingroom/temperature
home/livingroom/humidity
home/bedroom/light/status
factory/workshop1/machine1/speed

通配符:

  • +:单级通配符,如 home/+/temperature
  • #:多级通配符,如 home/#

QoS 等级

QoS 等级描述适用场景
QoS 0最多一次,不保证送达传感器数据、可丢失数据
QoS 1至少一次,保证送达重要数据、控制命令
QoS 2恰好一次,保证只送达一次关键数据、计费数据

连接流程

Client                    Broker
│ │
│──── CONNECT ──────────▶│
│◀─── CONNACK ───────────│
│ │
│──── SUBSCRIBE ────────▶│
│◀─── SUBACK ────────────│
│ │
│◀─── PUBLISH ───────────│
│──── PUBACK ───────────▶│
│ │
│──── PINGREQ ──────────▶│
│◀─── PINGRESP ──────────│
│ │
│──── DISCONNECT ───────▶│

代码示例

ESP32 MQTT 客户端:

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";
const char* mqtt_server = "broker.example.com";

WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}

void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
client.subscribe("home/livingroom/command");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}

void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();

// 发布消息
client.publish("home/livingroom/temperature", "25.5");
delay(5000);
}

Python MQTT 客户端:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client.subscribe("home/livingroom/temperature")

def on_message(client, userdata, msg):
print(f"{msg.topic}: {msg.payload.decode()}")

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("broker.example.com", 1883, 60)
client.loop_forever()

MQTT 5.0 新特性

  • 共享订阅:负载均衡
  • 消息过期:自动清理过期消息
  • 主题别名:减少主题名称传输
  • 用户属性:自定义元数据
  • 增强的错误报告

CoAP 协议

协议概述

CoAP(Constrained Application Protocol)是一种专为资源受限设备设计的 Web 传输协议,基于 UDP,支持 REST 架构。

协议特点:

  • 基于 UDP:低开销、支持多播
  • REST 架构:GET/POST/PUT/DELETE
  • 轻量级:头部仅 4 字节
  • 支持观察者模式:服务器推送
  • 支持块传输:大文件传输

消息格式

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver| T | TKL | Code | Message ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Token (if any, TKL bytes) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (if any) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1 1 1 1 1 1 1 1| Payload (if any) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

消息类型

类型缩写说明
ConfirmableCON需要确认
Non-confirmableNON不需要确认
AcknowledgementACK确认消息
ResetRST重置消息

请求方法

方法说明对应 HTTP
GET获取资源HTTP GET
POST创建资源HTTP POST
PUT更新资源HTTP PUT
DELETE删除资源HTTP DELETE

观察者模式

CoAP 支持服务器推送,客户端可以订阅资源变化:

Client                    Server
│ │
│──── GET (Observe=0) ──▶│
│◀─── 2.05 Content ──────│
│ │
│◀─── 2.05 Content ──────│ (资源变化)
│ │
│◀─── 2.05 Content ──────│ (资源变化)

代码示例

Python CoAP 客户端:

from coapthon.client.helperclient import HelperClient

client = HelperClient(server=('coap.example.com', 5683))

# GET 请求
response = client.get('sensors/temperature')
print(f"Temperature: {response.payload}")

# PUT 请求
response = client.put('actuators/led', 'on')

# 观察资源
def observe_callback(response):
print(f"Notification: {response.payload}")

client.observe('sensors/temperature', observe_callback)

HTTP/HTTPS 协议

协议概述

HTTP 是 Web 的基础协议,在物联网中也有广泛应用,特别是设备管理、固件升级等场景。

适用场景:

  • 设备管理 API
  • 固件下载
  • 配置同步
  • 与 Web 服务集成

RESTful API 设计

GET    /api/v1/devices           # 获取设备列表
GET /api/v1/devices/{id} # 获取设备详情
POST /api/v1/devices # 创建设备
PUT /api/v1/devices/{id} # 更新设备
DELETE /api/v1/devices/{id} # 删除设备
POST /api/v1/devices/{id}/data # 上报数据

代码示例

ESP32 HTTP 客户端:

#include <WiFi.h>
#include <HTTPClient.h>

void sendData(float temperature) {
HTTPClient http;
http.begin("https://api.example.com/v1/devices/esp32/data");
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer your_token");

String payload = "{\"temperature\":" + String(temperature) + "}";
int httpCode = http.POST(payload);

if (httpCode > 0) {
String response = http.getString();
Serial.println(response);
}
http.end();
}

AMQP 协议

协议概述

AMQP(Advanced Message Queuing Protocol)是企业级消息队列协议,提供可靠的消息传递保证。

协议特点:

  • 消息确认机制
  • 事务支持
  • 复杂路由
  • 企业级可靠性

适用场景:

  • 金融物联网
  • 医疗物联网
  • 关键业务系统

LwM2M 协议

协议概述

LwM2M(Lightweight Machine-to-Machine)是 OMA 组织定义的物联网设备管理协议,基于 CoAP。

核心功能:

  • 设备注册
  • 设备管理
  • 固件升级
  • 数据上报

对象模型:

  • 设备对象(Object 3):设备信息
  • 连接监控(Object 4):网络状态
  • 固件更新(Object 5):OTA 升级
  • 位置(Object 6):GPS 定位

协议对比

特性MQTTCoAPHTTPAMQP
传输层TCPUDPTCPTCP
模式发布/订阅请求/响应请求/响应发布/订阅
头部大小2 字节4 字节较大较大
QoS3 级2 级多级
功耗极低
适用场景通用物联网资源受限设备设备管理企业级应用

协议选型指南

选型考虑因素

  1. 设备资源:内存、CPU、网络带宽
  2. 网络环境:带宽、延迟、稳定性
  3. 消息模式:发布/订阅 vs 请求/响应
  4. 可靠性要求:消息丢失容忍度
  5. 功耗要求:电池供电 vs 市电供电
  6. 生态支持:库、工具、平台

典型场景推荐

场景推荐协议原因
智能家居MQTT生态完善、支持广泛
工业物联网MQTT可靠性高、支持 QoS
低功耗传感器CoAP基于 UDP、功耗低
设备管理HTTP与现有系统集成方便
金融物联网AMQP企业级可靠性

小结

物联网通信协议各有特点,MQTT 以轻量级和发布/订阅模式成为最流行的选择,CoAP 适合资源受限设备,HTTP 适合设备管理场景,AMQP 适合企业级应用。选择合适的协议需要综合考虑设备资源、网络环境、可靠性要求等因素。

下一步,我们将学习无线通信技术,了解物联网设备如何进行无线连接。