【玩转ESP32】15、esp32 mqtt client

系列文章:

【玩转ESP32】1、开发环境搭建
【玩转ESP32】2、开发参考资料
【玩转ESP32】3、点亮LED,Blink,blink,blink
【玩转ESP32】4、ESP32驱动DHT11
【玩转ESP32】5、i2c-tools访问i2c设备
【玩转ESP32】6、驱动i2c设备—0.96 OLED
【玩转ESP32】7、ESP32连接wifi
【玩转ESP32】8、ESP32 Guru MeditationError报错分析
【玩转ESP32】9、ESP32 作为TCP客户端连接服务器(非阻塞接收)
【玩转ESP32】10、创建用户分区表,数据读写存储
【玩转ESP32】11、编译报错:esp_bt.h:No such file or directory
【玩转ESP32】12、esp32串口使用
【玩转ESP32】13、软件定时器esp_timer使用
【玩转ESP32】14、esp32 mqtt基础

1、前言

ESP-IDF提供了mqtt组件,在components/mqtt,相关的API位于components/mqtt/esp-mqtt目录下,这个组件是基于https://github.com/tuanpmt/esp_mqtt的 。组件支持MQTT over TCP、SSL with mbedtls、MQTT over Websocket、 MQTT over Websocket Secure;支持订阅、发布、身份验证、遗嘱消息、心跳、以及3个消息等级。

2、API说明

2.1、MQTT客户端配置结构体
esp_mqtt_client_config_t

通过这个结构体,可以设置回调函数、服务器地址、用户名、client id、密码、证书等,基本上与mqtt相关的参数都可以设置。

2.2、基于配置创建MQTT Client句柄
esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config);

config:配置结构体变量指针;
esp_mqtt_client_handle_t :创建成功返回的mqtt client句柄。

2.3、启动MQTT Client(客户端)
esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client);

client:mqtt client句柄;
esp_err_t :返回值为ESP_OK标识启动成功。

2.4、订阅主题
int esp_mqtt_client_subscribe(esp_mqtt_client_handle_t client, const char *topic, int qos);

client:mqtt client句柄;
topic :主题;
qos:消息质量。

2.5、发布主题
int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, int len, int qos, int retain);

client:mqtt client句柄;
topic :主题;
data:数据;
len:长度;
qos:消息质量;
retain:保持标识。

2.6、MQTT Client重连
esp_err_t esp_mqtt_client_reconnect(esp_mqtt_client_handle_t client);

client:mqtt client句柄;
esp_err_t :返回值为ESP_OK标识启动成功。

2.7、设置MQTT Client配置,一般用于更新 配置
esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, const esp_mqtt_client_config_t *config);

client:mqtt client句柄;
config:配置结构体变量指针;
esp_err_t :返回值为ESP_OK标识启动成功。

2.8、MQTT Client回调
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)

event:事件结构体变量;
在这个函数中可以通过event_id来处理各种MQTT事件,比如:MQTT_EVENT_CONNECTED(MQTT链接)、MQTT_EVENT_SUBSCRIBED(订阅)、MQTT_EVENT_DATA(MQTT数据)等;订阅主题后,接受MQTT消息,正是通过这个事件来回调的。

3、代码实现

3.1、定义并初始化MQTT Client配置结构体、MQTT Client句柄
static esp_mqtt_client_handle_t mqtt_client; 
//MQTT Client句柄
static char mqtt_msg[512];
//mqtt接收消息缓冲区
static esp_mqtt_client_config_t    mqtt_cfg = {
            .host= IOT_CORE_MQTT_BROKER_URL,
            .event_handle = mqtt_event_handler,//注册回调函数
            .port = 1883,
            .username = mqtt_token,
            .client_id = my_clinet_id
            };
//定义并初始化MQTT Client配置结构体

client_id 默认使用的是ESP32_%CHIPID%的形式;
这里要注意,如果mqtt连接断开了,重连的时候最好变换一个client_id,或者在client_id中加入时间戳,保证每次都不一样
client_idhostusername 需要根据实际情况替换。

3.2、创建客户端并连接服务器
static void mqtt_app_start(void)
{
    mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
    //创建客户端
    ESP_ERROR_CHECK(esp_mqtt_client_start(mqtt_client));
    //启动客户端,连接服务器
    vTaskDelay(1000 / portTICK_PERIOD_MS);
}
3.3、mqtt回调处理
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
    assert(event != NULL);
    switch (event->event_id)
    {
    case MQTT_EVENT_CONNECTED: //mqtt连接事件
        ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
        break;
    case MQTT_EVENT_DISCONNECTED: //mqtt断开事件
        ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
        break;
    case MQTT_EVENT_SUBSCRIBED:  //mqtt订阅事件
        ESP_LOGD(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
        break;
    case MQTT_EVENT_UNSUBSCRIBED:  //mqtt取消订阅事件
        ESP_LOGD(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
        break;
    case MQTT_EVENT_PUBLISHED:  //mqtt发布事件
        ESP_LOGD(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
        break;
    case MQTT_EVENT_DATA: //mqtt接收数据事件
        ESP_LOGD(TAG, "MQTT_EVENT_DATA, msg_id=%d, %s", event->msg_id, event->topic);
        if (event->data_len >= (sizeof(mqtt_msg) - 1))
        {
            ESP_LOGE(TAG, "Received MQTT message size [%d] more than expected [%d]", event->data_len, (sizeof(mqtt_msg) - 1));
            return ESP_FAIL;
        }
        break;
    case MQTT_EVENT_ERROR: //mqtt错误事件
        ESP_LOGD(TAG, "MQTT_EVENT_ERROR");
        break;
    case MQTT_EVENT_BEFORE_CONNECT: //mqtt连接之前,已发生的事件
        ESP_LOGD(TAG, "MQTT_EVENT_BEFORE_CONNECT");
        break;
    default:
        break;    
    }
    return ESP_OK;
}

经过以上几个步骤,esp32就可以通过mqtt连接到服务器了。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freemote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值