物联网通信协议概览
物联网设备需要通过互联网上传数据或接收命令。不同于 Web 应用,IoT 设备的网络条件往往受限:低带宽、高延迟、不可靠连接。选择合适的通信协议是系统设计的关键。
MQTT (Message Queuing Telemetry Transport)
MQTT 是 IoT 领域最广泛使用的协议,基于发布/订阅模式,运行在 TCP 之上。
核心概念:
- Broker — 消息代理服务器,负责转发消息
- Topic — 消息主题,层次化结构如
sensor/temperature/room1 - QoS — 服务质量等级(0: 最多一次,1: 至少一次,2: 恰好一次)
QoS 选择建议:传感器定期上报用 QoS 0;控制指令用 QoS 1;计费/关键数据用 QoS 2。
# MicroPython MQTT 客户端
from umqtt.simple import MQTTClient
import network
import time
# 连接 WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("SSID", "PASSWORD")
while not wlan.isconnected():
time.sleep(1)
# MQTT 发布
def publish_sensor(temperature, humidity):
client = MQTTClient(
client_id=b"esp32_001",
server=b"broker.emqx.io",
port=1883
)
client.connect()
payload = f'{{"temp": {temperature}, "hum": {humidity}}}'
client.publish(b"sensor/env/livingroom", payload, qos=1)
client.disconnect()
// ESP-IDF MQTT 订阅示例
#include "mqtt_client.h"
esp_mqtt_client_handle_t mqtt_client;
void mqtt_app_start(void) {
esp_mqtt_client_config_t cfg = {
.broker.address.uri = "mqtt://broker.emqx.io:1883",
.credentials.client_id = "esp32_light_001",
};
mqtt_client = esp_mqtt_client_init(&cfg);
esp_mqtt_client_register_event(mqtt_client, ESP_EVENT_ANY_ID,
mqtt_event_handler, NULL);
esp_mqtt_client_start(mqtt_client);
}
void mqtt_event_handler(void *args, esp_event_base_t base,
int32_t event_id, void *data) {
esp_mqtt_event_t *event = data;
switch (event_id) {
case MQTT_EVENT_DATA:
char topic[64], payload[256];
snprintf(topic, event->topic_len, "%s", event->topic);
snprintf(payload, event->data_len, "%s", event->data);
printf("收到: %s => %s\n", topic, payload);
break;
}
}
CoAP (Constrained Application Protocol)
CoAP 是为资源严重受限的设备设计的协议,运行在 UDP 之上。
特点:
- UDP 传输,开销极低(Header 仅 4 字节)
- RESTful 风格(GET/POST/PUT/DELETE)
- 支持观察模式(类似 MQTT 订阅)
- 内置资源发现
# MicroPython CoAP 客户端
from coap import CoAPClient
def coap_get_temperature():
client = CoAPClient(("192.168.1.100", 5683))
response = client.get("/temperature")
print(response.payload.decode())
client.stop()
适合场景:电池供电、定期唤醒发送少量数据的传感器节点。
HTTP/HTTPS
HTTP 在 IoT 中主要用于不频繁的数据上报和 REST API 调用。优点是通用、调试方便;缺点是头部开销大、实时性差。
# 使用 requests 库上报 (ESP32 MicroPython)
import urequests
import json
def http_report(data):
url = "https://api.example.com/v1/devices/data"
headers = {"Content-Type": "application/json"}
try:
resp = urequests.post(url,
data=json.dumps(data),
headers=headers)
print("上报状态:", resp.status_code)
resp.close()
except Exception as e:
print("网络错误:", e)
云平台选型
| 平台 | 免费额度 | 特点 | 适用场景 |
|---|---|---|---|
| 阿里云 IoT | 100万条消息/月 | 国内节点多,文档中文 | 量产产品首选 |
| EMQX Cloud | 100设备免费 | 专业 MQTT Broker,可私有部署 | 高并发的 IoT 系统 |
| AWS IoT Core | 50条消息/月/设备 | 全球部署,集成 Lambda/S3 | 全球化产品 |
| 腾讯云 IoT Hub | 5000设备免费 | 与微信小程序集成方便 | 面向C端产品 |
| Blynk | 免费额度较小 | 提供 App 端组件,开发快 | 原型验证 |
选型因素:服务器所在地(国内需 ICP 备案)、API 易用性、售后支持、与已有云服务的集成成本。
数据上云实践
设备注册流程
- 在云平台创建产品(Product)
- 注册设备(Device),获取三元组(ProductKey, DeviceName, DeviceSecret)
- 设备端烧录三元组,连接云平台
- 平台验证设备身份,建立连接
数据格式设计
{
"deviceId": "esp32_001",
"timestamp": 1718612345,
"data": {
"temperature": 25.3,
"humidity": 60.1,
"pressure": 1013.2
},
"battery": 85
}
设计规范:所有设备使用统一数据格式;时间戳使用 UTC 毫秒;关键字段带单位后缀或另传单位字段。
OTA 升级
// OTA 流程伪代码
void check_ota_update(void) {
// 1. 查询最新版本
http_get("https://ota.example.com/check", device_info);
// 2. 如果有更新,下载固件
if (new_version > current_version) {
http_get_binary("https://ota.example.com/firmware.bin",
flash_partition);
}
// 3. 校验固件完整性
if (verify_checksum() == SUCCESS) {
// 4. 设置启动标记,重启
set_boot_partition(NEW_FIRMWARE);
esp_restart();
}
}
安全注意事项
- TLS 加密 — MQTT over TLS (8883),HTTP over HTTPS (443)
- 设备证书 — 使用 X.509 证书比 Token 更安全
- 固件签名 — 防止恶意固件被注入
- 定期轮换密钥 — 设备密钥定期更换
小结
MQTT 是 IoT 数据上云的事实标准,适合绝大多数场景。CoAP 适合极致低功耗场景。HTTP 适合少量、低频的数据上报。选择云平台时,优先考虑与目标市场一致的平台(国内用阿里云/腾讯云,海外用 AWS),同时评估免费额度和技术支持质量。