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); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

‌古文明密码测试:用AI破译玛雅历法的漏洞‌

当测试思维遇见千年碑文 在帕伦克遗址斑驳的石碑前&#xff0c;AI算法正在执行一场跨越两千年的特殊测试任务。玛雅历法系统作为人类最早的复杂时间计算体系之一&#xff0c;其长计历&#xff08;Long Count&#xff09;模块曾因2012末日预言引发全球误读。本文将以软件测试工…

从理论到代码:Agentic AI实时响应优化的提示工程实现与调试技巧

Agentic AI实时响应优化&#xff1a;提示工程从理论到代码的实战指南 引言&#xff1a;为什么你的Agent响应总是“慢半拍”&#xff1f; 你有没有遇到过这样的场景&#xff1a; 用Agent做客服&#xff0c;用户问“我的订单什么时候到”&#xff0c;Agent磨磨蹭蹭10秒才回复&…

腾讯云的IP是原生IP吗?

腾讯云的公网IP&#xff08;普通公网IP、EIP&#xff09;均为运营商原生路由IP&#xff0c;具备真实路由属性&#xff0c;归属地清晰&#xff0c;可被正常路由与解析 。内网IP为私有网段&#xff08;如10.0.0.0/8等&#xff09;&#xff0c;不属于原生公网IP范畴 。以下是核心要…

DeploySharp 全面支持 YOLO26 系列,助力开发者快速部署落地应用

DeploySharp是一个专为C#开发者设计的跨平台模型部署框架,全面支持YOLOv26系列模型,包括目标检测、实例分割、姿态估计和旋转框检测。该框架提供多引擎支持(OpenVINO/ONNX Runtime/TensorRT)、两种图像处理库选择(Im…

设备维修班的惊喜发现,CAXA三维球比扳手还好用

我们维修班日常工作中最盼望的&#xff0c;就是设备图纸能够清晰易懂&#xff0c;这样才能快速准确地判断故障、开展维修工作。以前使用二维图纸时&#xff0c;经常会因为视角限制看走眼&#xff0c;导致拆装过程中多拧坏好几个螺栓&#xff0c;不仅增加了维修成本&#xff0c;…

02.01.05.菲力尔FLIR GigE相机 环境搭建篇(CentOS9系统下 areaDetector的aravis安装配置)

本页目录 1、下载安装2、配置3、测试 基础知识&#xff1a;02.01.04.菲力尔FLIR GigE相机 环境搭建篇&#xff08;CentOS9系统下 areaDetector安装配置&#xff09; 下载安装 yum install -y ninja-build meson glib2-devel gtk-doc libxml2-devel gtk3-devel gstreamer1 …

CAXA用一年省下六万外包费

我们是一家只有三个人的小作坊&#xff0c;平时主要承接一些小型设计项目。接大单时最发愁的就是设计能力不足&#xff0c;以前没有合适的软件支持&#xff0c;复杂的设计项目只能外包出去&#xff0c;不仅成本高&#xff0c;而且沟通起来很麻烦&#xff0c;还难以保证最终效果…

工程机械制造国产 CAD技工经验数字化传承应用

作为一名拥有二十年经验的工程机械老技工&#xff0c;带徒弟一直是我工作的重要部分。我最怕的就是徒弟们看不懂二维图纸上的复杂结构&#xff0c;很多时候&#xff0c;图纸上的一条线条、一个标注&#xff0c;背后都蕴含着多年的实践经验&#xff0c;但徒弟们缺乏实际操作经验…

02.01.04.菲力尔FLIR GigE相机 环境搭建篇(CentOS9系统下 areaDetector安装配置)

本页目录 1、下载安装2、配置3、测试基础知识是&#xff1a;02.01.01.菲力尔FLIR GigE相机 环境搭建篇&#xff08;CentOS9系统下 EPICS安装配置&#xff09; 下载安装 注意&#xff1a;synApps需要下载安装到epics-base的目录下 cd /usr/local/software/epics-base wget https…

CAXA让大三学生爱上机械设计

谁懂啊&#xff01;大三刚接触机械设计那会儿&#xff0c;看着一堆专业软件头都大了&#xff0c;生怕学不会拖后腿。实验室老师说的没错&#xff0c;软件门槛高真的会劝退新人。还好我们实验室配了CAXA CAD&#xff0c;双模式直接救大命&#xff01;它的创新模式太友好了&#…

禅道8.2.1升级到12.5.3,浏览器提示“重定向次数过多”

从禅道8.2.1 Windows一键安装版升级&#xff0c;计划升级到12.5.3&#xff0c;一开始下载的是12.5.3一键安装版。解压后&#xff0c;把旧版的zentao数据库导出成.sql文件然后通过mysql命令行工具导入到了新版&#xff0c;启动后浏览器一直提示“重定向次数过多”。以为是版本跨…

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

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

部署qwen14B 实战

目录 启动脚本 #!/usr/bin/env bash set -eexport CUDA_VISIBLE_DEVICES=0python -m vllm.entrypoints.openai.api_server \--model /data/models/Qwen1.5-14B-Chat-AWQ \--quantization awq \--max-model-len 4096 \-…

商旅平台有哪些?2026年主流商旅平台盘点及新趋势报告

2026年1月&#xff0c;中国企业数字化转型研究院联合国内知名费控管理组织&#xff0c;正式发布《2026中国企业商旅数字化管理白皮书》&#xff08;以下简称《白皮书》&#xff09;。《白皮书》基于对5000余家不同规模企业商旅管理实践的深度调研&#xff0c;创新提出“商旅选型…

俄罗斯SALUTEDEV团队VIBE:超轻量AI实现高效图片编辑

近年来&#xff0c;人工智能在图像编辑领域的发展可以说是日新月异。当我们还在为一些大型AI模型动辄需要几十GB显存而头疼时&#xff0c;来自俄罗斯SALUTEDEV公司研发部门的科学家们却给我们带来了一个惊喜——他们开发出了一个名为VIBE&#xff08;Visual Instruction Based …

mdadm 故障处理二

新增磁盘同步导致系统卡死 md126 : active raid10 sdj[4] sdl[2] sdk[1] sdm[3]15627788288 blocks super 1.2 512K chunks 2 near-copies [4/3] [_UUU][=======>…] recovery = 37.4% (2930181248/7813894144) fin…

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

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

[HAL库分析—GPIO] - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

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

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

django计算机毕设之基于大数据+django+网络爬虫的安客居二手房屋信息采集系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…