F FisherHub Docs

物联网平台

物联网通信协议概览

物联网设备需要通过互联网上传数据或接收命令。不同于 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)

云平台选型

平台免费额度特点适用场景
阿里云 IoT100万条消息/月国内节点多,文档中文量产产品首选
EMQX Cloud100设备免费专业 MQTT Broker,可私有部署高并发的 IoT 系统
AWS IoT Core50条消息/月/设备全球部署,集成 Lambda/S3全球化产品
腾讯云 IoT Hub5000设备免费与微信小程序集成方便面向C端产品
Blynk免费额度较小提供 App 端组件,开发快原型验证

选型因素:服务器所在地(国内需 ICP 备案)、API 易用性、售后支持、与已有云服务的集成成本。

数据上云实践

设备注册流程

  1. 在云平台创建产品(Product)
  2. 注册设备(Device),获取三元组(ProductKey, DeviceName, DeviceSecret)
  3. 设备端烧录三元组,连接云平台
  4. 平台验证设备身份,建立连接

数据格式设计

{
    "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),同时评估免费额度和技术支持质量。