通信协议详解
通信协议是物联网设备之间数据交换的规则和约定。本文将详细介绍物联网常用的通信协议,包括 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) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
消息类型
| 类型 | 缩写 | 说明 |
|---|---|---|
| Confirmable | CON | 需要确认 |
| Non-confirmable | NON | 不需要确认 |
| Acknowledgement | ACK | 确认消息 |
| Reset | RST | 重置消息 |
请求方法
| 方法 | 说明 | 对应 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 定位
协议对比
| 特性 | MQTT | CoAP | HTTP | AMQP |
|---|---|---|---|---|
| 传输层 | TCP | UDP | TCP | TCP |
| 模式 | 发布/订阅 | 请求/响应 | 请求/响应 | 发布/订阅 |
| 头部大小 | 2 字节 | 4 字节 | 较大 | 较大 |
| QoS | 3 级 | 2 级 | 无 | 多级 |
| 功耗 | 低 | 极低 | 高 | 高 |
| 适用场景 | 通用物联网 | 资源受限设备 | 设备管理 | 企业级应用 |
协议选型指南
选型考虑因素
- 设备资源:内存、CPU、网络带宽
- 网络环境:带宽、延迟、稳定性
- 消息模式:发布/订阅 vs 请求/响应
- 可靠性要求:消息丢失容忍度
- 功耗要求:电池供电 vs 市电供电
- 生态支持:库、工具、平台
典型场景推荐
| 场景 | 推荐协议 | 原因 |
|---|---|---|
| 智能家居 | MQTT | 生态完善、支持广泛 |
| 工业物联网 | MQTT | 可靠性高、支持 QoS |
| 低功耗传感器 | CoAP | 基于 UDP、功耗低 |
| 设备管理 | HTTP | 与现有系统集成方便 |
| 金融物联网 | AMQP | 企业级可靠性 |
小结
物联网通信协议各有特点,MQTT 以轻量级和发布/订阅模式成为最流行的选择,CoAP 适合资源受限设备,HTTP 适合设备管理场景,AMQP 适合企业级应用。选择合适的协议需要综合考虑设备资源、网络环境、可靠性要求等因素。
下一步,我们将学习无线通信技术,了解物联网设备如何进行无线连接。