ESP32+idf开发之WIFI通信入门(4)MQTT通信

ESP32+idf开发之WIFI通信入门(4)MQTT通信

一、实现功能:

1、esp32作为MQTT客户端定时每隔2秒向MQTT服务端发布消息:

​ topic:heartbeat

​ payload:client1 is online!

2、esp32作为MQTT客户端订阅主题为“/control”,接收该主题的消息payload并打印。

二、MQTT概述:

​ MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级协议,该协议构建于TCP/IP协议之上,MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。MQTT协议是一个基于客户端-服务器的消息发布/订阅传输协议。它是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

image-20230325221648666

MQTT有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。

“至少一次”,确保消息到达,但消息重复可能会发生。

​ “只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

(1)topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

MQTT服务器可用免费共享的,也可自行搭建,本测试采用的在云服务器上自行搭建EMQX服务器(https://www.emqx.io/zh/downloads)

三、步骤:

1、复制wifi连接的组件代码到工程的自定义组件(components)中,进入vscode创建示例空项目,打开命令终端:

mkdir components

cp -r D:\Espressif\frameworks\esp-idf-v4.4.1\examples\common_components\protocol_examples_common .\components

2、配置wifi连接设置,打开终端命令界面输入idf.py menuconfig,进入到Example Connection Configuration界面对热点信息的ssid和password等配置。

image-20230321221245559

3、在main.c中编写实现以上功能的代码:

#include <esp_log.h>
#include <esp_system.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#include <nvs_flash.h>
#include <esp_netif.h>
#include <esp_event.h>
#include <protocol_examples_common.h>
#include <mqtt_client.h>

static char *TAG = "mqtt_client";

static esp_mqtt_client_handle_t mqttclient;
static bool connect_flag = false; // 定义一个连接上mqtt服务器的flag

// mqtt的状态机事件处理函数
static void mqtt_event_handler(void *args, esp_event_base_t base, int32_t id, void *event_data)
{
    esp_mqtt_event_t *client_event = event_data;
    esp_mqtt_event_id_t client_id = id;

    switch (client_id)
    {
    case MQTT_EVENT_CONNECTED:
        ESP_LOGI(TAG, "connected to mqtt_server");
        connect_flag = true;
        esp_mqtt_client_subscribe(mqttclient, "control", 2); // 订阅一个/control的topic
        break;
    case MQTT_EVENT_DISCONNECTED:
        ESP_LOGI(TAG, "disconnected");
        connect_flag = false;
        break;
    case MQTT_EVENT_DATA:
    {
        char topic[128] = {};
        char data[512] = {};
        memcpy(topic, client_event->topic, client_event->topic_len);
        memcpy(data, client_event->data, client_event->data_len);
        printf("topic:%s\n", topic);
        printf("data:%s\n", data);
    }
    break;
    case MQTT_EVENT_ERROR:
        ESP_LOGI(TAG, "error");
        connect_flag = false;
        break;

    default:
        break;
    }
}
void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    ESP_ERROR_CHECK(example_connect());

    // mqtt服务器的配置信息(根据实际情况填写)
    esp_mqtt_client_config_t cfg = {
        .uri = "mqtt://XX.XX.XX.XX",
        .port = XX,
        .username = "XX",
        .password = "XX",
    };

    mqttclient = esp_mqtt_client_init(&cfg);

    //注册MQTT状态机事件处理回调函数
    esp_mqtt_client_register_event(mqttclient, MQTT_EVENT_ANY, mqtt_event_handler, NULL);

    esp_mqtt_client_start(mqttclient);

    while (1)
    {
        if (connect_flag == true)
        {
            char buff[512] = "client1 is online!";
            // 向mqtt服务器发布主题为/heartbeat/1,payload为buff的数据
            esp_mqtt_client_publish(mqttclient, "heartbeat", buff, strlen(buff), 2, 0); 
        }

        vTaskDelay(pdMS_TO_TICKS(2000));
    }
}

四、测试:

编译、烧写、监控esp32,用另一个MQTT客户端(如通信猫)来进行订阅/发布测试,在通信猫上可每两秒接收到esp32发布的消息,在esp32上可打印出通信猫发布的消息。

image-20230325224441659

image-20230325224609860

<think>好的,我现在需要帮助用户比较ESP32IDF和PlatformIO之间的差异。首先,我得确认自己对这些工具的理解是否正确,然后根据用户提供的引用资料来组织答案。 首先,ESP-IDF是乐鑫官方推出的开发框架,专为ESP32系列芯片设计。它提供了底层的API和工具链,适合需要深度控制硬件或进行低层开发的场景。而PlatformIO是一个跨平台的物联网开发平台,支持多种微控制器和开发板,包括ESP32。它集成了不同的框架,比如ESP-IDF和Arduino,提供了更友好的开发环境,特别是对于多平台项目的开发者来说更方便。 接下来,用户提供的引用资料中有几个关键点需要注意: - 引用[1]和[3]提到了ESP-IDF在VSCode中的快速入门和环境搭建步骤,说明官方推荐使用ESP-IDF进行开发。 - 引用[3]和[4]讨论了PlatformIO的安装过程以及其作为跨平台工具的优势,支持自动化编译和上传。 - 引用[2]指出ESP32的灵活性,允许开发者根据用例优化性能,这可能涉及到选择不同的开发环境。 接下来需要对比两者的主要差异,可能包括以下几个方面: 1. **定位与适用场景**:ESP-IDF更适合专业、底层的开发,而PlatformIO适合快速开发和跨平台项目。 2. **开发环境配置**:ESP-IDF需要手动安装工具链,可能复杂一些;PlatformIO通过插件自动配置,简化流程。 3. **框架支持**:PlatformIO支持多种框架,而ESP-IDF是专一的。 4. **依赖管理**:PlatformIO有集成的库管理,ESP-IDF可能需要手动处理。 5. **调试与工具集成**:两者在调试工具上的差异,比如ESP-IDF可能更全面,而PlatformIO依赖插件。 6. **社区与文档**:ESP-IDF有官方支持,文档全面;PlatformIO社区资源丰富,但可能分散。 需要确保回答结构清晰,分点对比,并引用用户提供的资料来支持观点。例如,在提到PlatformIO的自动化编译时引用[4],在讨论环境搭建时引用[3]。同时,根据用户要求,生成相关问题,比如开发环境选择、性能优化等。 最后,检查是否符合所有系统级指令:使用正确的中文,数学公式格式(虽然这里可能用不到),引用标识正确,问题部分独立且相关。确保没有使用Markdown格式,段落之间用空行分隔,代码块正确标注。</think>ESP32开发中,**ESP-IDF**与**PlatformIO**是两种主流开发方式,主要差异体现在定位、工具链集成和适用场景上。以下是详细对比: --- ### 一、核心定位差异 1. **ESP-IDF** 乐鑫官方原生开发框架,专为ESP32设计,提供底层硬件控制API,如GPIO、WiFi/BLE协议栈的直接操作[^1]。 适用于:需要深度优化性能、开发RTOS多任务系统或定制化硬件驱动的场景。 2. **PlatformIO** 跨平台开发工具链,支持ESP32在内的多种微控制器,集成ESP-IDF、Arduino等框架[^4]。 适用于:快速原型开发、多平台兼容项目或依赖丰富第三方库的场景。 --- ### 二、开发流程对比 #### 1. 环境配置 - **ESP-IDF** 需手动安装工具链(如编译器、OpenOCD调试器),并通过`idf.py`命令行编译烧录[^1][^3]。 示例命令: ```bash idf.py menuconfig # 配置参数 idf.py build # 编译 idf.py flash # 烧录 ``` - **PlatformIO** 通过VSCode插件自动安装工具链,图形化界面操作编译/烧录。 配置文件`platformio.ini`示例: ```ini [env:esp32dev] platform = espressif32 board = esp32dev framework = espidf # 或选择arduino ``` #### 2. 依赖管理 - **ESP-IDF** 使用`components`目录管理自定义组件,第三方库需手动下载或通过`idf.py add-dependency`添加。 - **PlatformIO** 通过`lib_deps`自动从PlatformIO库仓库安装依赖,例如: ```ini lib_deps = adafruit/Adafruit SSD1306@^2.5.7 ``` --- ### 三、调试与工具链 | 功能 | ESP-IDF | PlatformIO | |-------------------|----------------------------------|-----------------------------------| | **调试支持** | 原生支持OpenOCD+GDB,可单步调试 | 依赖插件配置,需手动关联调试器 | | **性能分析** | 内置`idf.py monitor`查看实时日志 | 通过串口监视器或第三方工具 | | **硬件兼容性** | 仅支持ESP32系列 | 支持ESP32/ESP8266/Arduino等多平台 | --- ### 四、典型应用场景 - **选择ESP-IDF** - 需要直接操作硬件寄存器(如优化SPI通信速率)[^2] - 开发低功耗固件或安全加密功能 - 官方例程丰富,适合学习ESP32底层机制 - **选择PlatformIO** - 同时开发ESP32和STM32等不同芯片的项目 - 快速集成传感器库(如MQTT、图形显示库) - 依赖跨平台构建和CI/CD自动化 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值