第 5 篇:MQTT 协议------物联网的普通话
1. MQTT 核心概念
scss
发布/订阅模式(不是请求/响应!):
设备 → publish("home/livingroom/temp", "25.5") → Broker
↓
手机 ← subscribe("home/livingroom/temp") ←──────────────┘
| 特性 | 说明 |
|---|---|
| QoS 0 | 最多一次(发完不管,可能丢) |
| QoS 1 | 至少一次(重发直到确认------推荐) |
| QoS 2 | 恰好一次(开销大,一般不用) |
| 遗嘱消息 | 设备异常断线时 Broker 自动发布一条消息 |
2. ESP-MQTT 客户端
c
#include "mqtt_client.h"
esp_mqtt_client_handle_t mqtt_client;
void mqtt_app_start(void) {
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = "mqtt://192.168.1.100:1883",
.credentials.client_id = "esp32_sensor_001",
};
mqtt_client = esp_mqtt_client_init(&mqtt_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 *arg, esp_event_base_t base, int32_t id, void *data) {
if (id == MQTT_EVENT_CONNECTED) {
// 订阅控制指令
esp_mqtt_client_subscribe(mqtt_client, "device/relay/cmd", 1);
}
if (id == MQTT_EVENT_DATA) {
esp_mqtt_event_handle_t event = data;
printf("Topic: %.*s, Data: %.*s\n",
event->topic_len, event->topic,
event->data_len, event->data);
// 收到 "ON" → 开继电器
if (strncmp(event->data, "ON", event->data_len) == 0) {
gpio_set_level(RELAY_PIN, 1);
}
}
}
// 发布传感器数据
void publish_sensor_data(float temp, float humi) {
char payload[64];
snprintf(payload, sizeof(payload), "{\"temp\":%.1f,\"humi\":%.1f}", temp, humi);
esp_mqtt_client_publish(mqtt_client, "sensor/livingroom", payload, 0, 1, 0);
}
下一篇:数据上云------从 MQTT 到数据库