news 2026/4/22 16:45:33

esp32,使用esp-idf链接mqtt服务器,消息接收

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
esp32,使用esp-idf链接mqtt服务器,消息接收

本次连接使用的是mqtt的官方公共服务器,前提是要先链接wifi

注意:1.mqtt服务器发给esp32的消息,中间没有/0,使用“%s”这种格式打印的数据会自动往后打印,直到遇见/0,解决方法是

ESP_LOGI(TAG_MQTT,"topic->%.*s",mqtt_data->topic_len,mqtt_data->topic);

定长打印,根据参数里面的长度。

2.消息发送时使用strlen可以获取字符串或者数组的真实大小,不会发送数组的闲杂空位

snprintf(data,sizeof(data),"{data :%d}",a);
esp_mqtt_client_publish(client_handle,MQTT_TOPIC2,data,strlen(data),1,0);

#include <stdio.h> #include "mqtt_client.h" #include "esp_log.h" #include "esp_wifi.h" #include "nvs_flash.h" #include "esp_event.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include <string.h> #define mqtt_url "mqtt://broker-cn.emqx.io" #define mqtt_server_port 1883 #define mqtt_client_id "esp32s3_20260118" #define mqtt_username "esp32s3" #define mqtt_password "esp32s3_password" #define MQTT_TOPIC1 "/topic/esp32_0118" #define MQTT_TOPIC2 "/topic/mqttx_0118" #define TAG_MQTT "TAG_MQTT" #define TAG "STA" #define TAG2 "IP" #define SSID "Redmi" #define PASSWORD "123456789" TaskHandle_t mqtt_task_handel=NULL; //mqtt服务句柄 esp_mqtt_client_handle_t client_handle=NULL; QueueHandle_t esp32_wifi_sem=NULL; //声明mqtt发送消息的任务函数 void mqtt_send_task(); //wifi的事件回调函数 void wifi_cb(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data){ if(event_base==WIFI_EVENT){ switch (event_id) { case WIFI_EVENT_STA_START://开启sta模式成功 esp_wifi_connect();//链接路由器 break; case WIFI_EVENT_STA_CONNECTED://成功连接到路由器 ESP_LOGI(TAG,"esp32s3 connected wifi"); break; case WIFI_EVENT_STA_DISCONNECTED://断开连接 ESP_LOGI(TAG,"esp32s3 disconnected wifi"); esp_wifi_connect(); break; default: break; } } else if (event_base==IP_EVENT) { switch (event_id) { case IP_EVENT_STA_GOT_IP: ESP_LOGI(TAG2,"esp32 got ip,connnecet success"); //释放二进制信号量,开启mqtt服务 xSemaphoreGive(esp32_wifi_sem); break; default: break; } } } //mqtt的事件回调函数 void mqtt_event_cb(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data){ esp_mqtt_event_handle_t mqtt_data=(esp_mqtt_event_handle_t)event_data; switch (event_id) { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG_MQTT,"esp32 connect mqttserver"); //qos 是订阅的服务的级别,0表示无回应,1表示有,2表示一定有回应 esp_mqtt_client_subscribe_single(client_handle,MQTT_TOPIC1,1); break; case MQTT_EVENT_DISCONNECTED: ESP_LOGI(TAG_MQTT,"esp32 disconnect mqttserver"); break; case MQTT_EVENT_PUBLISHED: ESP_LOGI(TAG_MQTT,"esp32 recive mqttserver publish ack"); break; case MQTT_EVENT_SUBSCRIBED: ESP_LOGI(TAG_MQTT,"esp32 recive mqttserver subscribe ack"); break; case MQTT_EVENT_DATA: // ESP_LOGI(TAG_MQTT,"esp32 recive mqttserver data--------"); // ESP_LOGI(TAG_MQTT,"topic->%s",mqtt_data->topic); // ESP_LOGI(TAG_MQTT,"data->%s",mqtt_data->data); ESP_LOGI(TAG_MQTT,"esp32 recive mqttserver data--------"); ESP_LOGI(TAG_MQTT,"topic->%.*s",mqtt_data->topic_len,mqtt_data->topic); ESP_LOGI(TAG_MQTT,"data->%.*s",mqtt_data->data_len,mqtt_data->data); break; default: break; } } //mqtt配置函数 void mqtt_client_start(){ esp_mqtt_client_config_t mqtt_config={ .broker.address.uri=mqtt_url, .broker.address.port=mqtt_server_port, .credentials.client_id=mqtt_client_id, .credentials.username=mqtt_username, .credentials.authentication.password=mqtt_password, }; client_handle=esp_mqtt_client_init(&mqtt_config); esp_mqtt_client_register_event(client_handle,ESP_EVENT_ANY_ID,mqtt_event_cb,NULL); esp_mqtt_client_start(client_handle); } //mqtt发送消息的任务函数 void mqtt_send_task(){ //阻塞等待信号量 xSemaphoreTake(esp32_wifi_sem,portMAX_DELAY); //开启mqtt服务 mqtt_client_start(); char data[32]={0}; uint8_t a=0; while(1){ //strlen是实际大小,sizeof是数组定义的大小 snprintf(data,sizeof(data),"{data :%d}",a); esp_mqtt_client_publish(client_handle,MQTT_TOPIC2,data,strlen(data),1,0); a++; vTaskDelay(pdMS_TO_TICKS(1000)); } } void app_main(void) { //创建二进制信号量 esp32_wifi_sem=xSemaphoreCreateBinary(); //初始化nvs,后续会用来保存wifi的账号密码 nvs_flash_init(); //初始化网络接口(TCP/IP 协议栈相关) esp_netif_init(); //创建创建默认事件循环机制 esp_event_loop_create_default(); //创建默认的 STA(站点)网络接口对象。 esp_netif_create_default_wifi_sta(); //按照默认配置,初始化wifi的操作 wifi_init_config_t cfg=WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); //向事件循环里面加入回调函数,有对应事件发生时会自动调用回调函数 esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,wifi_cb,NULL);//sta,数据链路层· //获取到ip,网络层 esp_event_handler_register(IP_EVENT,IP_EVENT_STA_GOT_IP,wifi_cb,NULL); //初始化 wifi_config_t,设置安全阈值和 PMF 能力。 wifi_config_t conf={ .sta.threshold.authmode=WIFI_AUTH_WPA2_PSK, .sta.pmf_cfg.capable=true, .sta.pmf_cfg.required=false, }; memset(conf.sta.ssid,0,strlen(SSID)); memcpy(conf.sta.ssid,SSID,strlen(SSID)); memset(conf.sta.password,0,strlen(PASSWORD)); memcpy(conf.sta.password,PASSWORD,strlen(PASSWORD)); esp_wifi_set_config(WIFI_IF_STA,&conf); esp_wifi_set_mode(WIFI_MODE_STA); //启动 Wi‑Fi,开始连接流程 esp_wifi_start(); //创建发送消息的任务 xTaskCreatePinnedToCore(mqtt_send_task,"mqtt_send_task",4096,NULL,2,&mqtt_task_handel,1); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 16:45:32

高通CEO安蒙播客访谈:移动DNA也能做好数据中心

作者&#xff1a;周雅 2026年1月12日&#xff0c;HUMAIN出品的首档播客《End of Limits》第一期邀请到了一位特别嘉宾&#xff1a;高通公司总裁兼CEO安蒙&#xff08;Cristiano Amon&#xff09;。这场对话始于当下最炙手可热的AI&#xff0c;一路探向边缘计算、下一代设备革命…

作者头像 李华
网站建设 2026/4/18 23:01:03

当智能体爆发在即,数据库如何成为“发动机”?

作者&#xff1a;金旺就在上周&#xff0c;阿里发布了千问任务助理&#xff0c;打造消费级智能体成了阿里这一年第一项重要战略&#xff0c;AI超级入口之争也在这一年正式拉开序幕。值得注意的是&#xff0c;同样是在这场发布会上&#xff0c;当谈及任务助理背后的能力时&#…

作者头像 李华
网站建设 2026/4/18 7:10:55

Snap联手多所高校突破:静态模型实现动态化动画生成

这项由Snap公司联合伊利诺伊大学厄巴纳-香槟分校、加州大学圣克鲁兹分校、卡内基梅隆大学以及南洋理工大学共同完成的突破性研究&#xff0c;发表于2026年1月的arXiv预印本平台&#xff0c;论文编号为arXiv:2601.06378v1。有兴趣深入了解的读者可以通过该编号查询完整论文。在动…

作者头像 李华
网站建设 2026/4/18 1:54:49

什么是Spring Bean?

任何通过Spring 容器实例化、组装和管理的Java对象都能称之为Spring Bean。 Bean可以看成是Spring应用中的一个普通Java对象&#xff0c;这个对象的创建、属性赋值、初始化、销毁等完整的生命周期是由Spring IOC容器来统一管理的&#xff0c;并非程序员手动控制。 Spring Bean的…

作者头像 李华
网站建设 2026/4/20 20:39:55

多Agent智能协作实战:基于Camel-AI构建高效AI团队,小白也能学会

本文详细介绍了多Agent智能协作的概念与实战应用&#xff0c;通过Camel-AI框架构建专业化AI团队。文章展示了如何定义不同角色Agent&#xff08;意图理解、知识检索、回复生成、质量审核&#xff09;&#xff0c;实现Agent间通信和协作流程&#xff0c;并提供了动态任务分配、性…

作者头像 李华