当前位置: 首页 > article >正文

基于 FreeRTOS + ESP8266(AT 指令)+ MQTT的实现方案

一、整体系统架构┌─────────────────────────────────────────────┐ │ Host MCU (dsPIC33 / STM32) │ │ │ │ ┌────────────┐ UART ┌──────────────┐ │ │ │ FreeRTOS │◀───────▶│ ESP8266 │ │ │ │ App Task │ │ AT Firmware │ │ │ └─────┬──────┘ └──────┬───────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌────────────┐ ┌──────────────┐ │ │ │ MQTT API │ │ WiFi / TCP │ │ │ │ (Publish/ │ │ TLS(可选) │ │ │ │ Subscribe) │ │ │ │ │ └────────────┘ └──────────────┘ │ └─────────────────────────────────────────────┘ESP8266 只做通信业务逻辑全部在 MCU 端FreeRTOS二、FreeRTOS 任务划分任务优先级作用AT_Cmd_TaskHigh发送 AT 指令 解析响应AT_Recv_TaskHigh串口接收 UR 解析MQTT_Client_TaskMediumMQTT 连接 / 保活App_Publish_TaskLow业务数据上报App_Subscribe_TaskLow下行控制三、ESP8266 AT 指令基础ESP8266 固件 ≥ AT v2.2.0 才支持 MQTT常用 AT 指令ATRST ; 复位 ATCWMODE1 ; Station 模式 ATCWJAPSSID,PASSWORD ; 连接 WiFi ATCIPMUX0 ; 单连接 ATCIPSTARTTCP,broker.emqx.io,1883 ATMQTTUSERCFG0,1,client_id,user,password,0,0, ATMQTTCONN0,broker.emqx.io,1883,1 ATMQTTPUB0,topic,payload,1,0 ATMQTTSUB0,topic,1四、AT 驱动层设计FreeRTOS 安全写法1、AT 命令结构体typedefstruct{constchar*cmd;constchar*expect;uint32_ttimeout_ms;}at_cmd_t;2、AT 发送接口线程安全SemaphoreHandle_t at_mutex;boolAT_SendCmd(constat_cmd_t*at){xSemaphoreTake(at_mutex,portMAX_DELAY);HAL_UART_Transmit(huart1,(uint8_t*)at-cmd,strlen(at-cmd),100);HAL_UART_Transmit(huart1,(uint8_t*)\r\n,2,10);bool retAT_WaitResponse(at-expect,at-timeout_ms);xSemaphoreGive(at_mutex);returnret;}五、ESP8266 MQTT 封装1、MQTT 客户端结构体typedefstruct{charbroker[64];uint16_tport;charclient_id[32];charuser[32];charpassword[32];}mqtt_client_t;2、MQTT 连接boolMQTT_Connect(mqtt_client_t*cfg){charcmd[128];sprintf(cmd,ATMQTTUSERCFG0,1,\%s\,\%s\,\%s\,0,0,\\,cfg-client_id,cfg-user,cfg-password);if(!AT_SendCmd((at_cmd_t){cmd,OK,2000}))returnfalse;sprintf(cmd,ATMQTTCONN0,\%s\,%d,1,cfg-broker,cfg-port);returnAT_SendCmd((at_cmd_t){cmd,OK,5000});}3、MQTT 发布带 QoSboolMQTT_Publish(constchar*topic,constchar*payload,intqos){charcmd[256];sprintf(cmd,ATMQTTPUB0,\%s\,\%s\,%d,0,topic,payload,qos);returnAT_SendCmd((at_cmd_t){cmd,OK,3000});}4、MQTT 订阅boolMQTT_Subscribe(constchar*topic,intqos){charcmd[128];sprintf(cmd,ATMQTTSUB0,\%s\,%d,topic,qos);returnAT_SendCmd((at_cmd_t){cmd,OK,3000});}六、FreeRTOS 示例任务MQTT 客户端任务voidMQTT_Client_Task(void*arg){mqtt_client_tmqtt{.brokerbroker.emqx.io,.port1883,.client_idesp8266_freertos,.user,.password};while(1){if(!MQTT_Connect(mqtt)){vTaskDelay(pdMS_TO_TICKS(5000));continue;}MQTT_Subscribe(/device/ctrl,1);while(1){// 心跳MQTT_Publish(/device/ping,online,1);vTaskDelay(pdMS_TO_TICKS(30000));}}}业务发布任务如电源数据voidApp_Publish_Task(void*arg){charpayload[128];while(1){floatvoutRead_Voltage();floatioutRead_Current();snprintf(payload,sizeof(payload),{\v\:%.2f,\i\:%.2f},vout,iout);MQTT_Publish(/device/telemetry,payload,1);vTaskDelay(pdMS_TO_TICKS(1000));}}参考代码 基于Freertos的ESP8266 AT指令实现MQTTwww.youwenfan.com/contentcsv/72586.html七、ESP8266 主动推送URC处理ESP8266 会主动发MQTTSUBRECV:0,/device/ctrl,5,hello必须单独一个高优先级任务解析voidAT_Recv_Task(void*arg){uint8_tch;while(1){if(HAL_UART_Receive(huart1,ch,1,10)HAL_OK){Parse_AT_URC(ch);}}}voidParse_AT_URC(uint8_tch){staticcharbuf[256];staticuint16_tidx0;buf[idx]ch;if(strstr(buf,MQTTSUBRECV)){// 提取 topic / payloadHandle_MQTT_Command(buf);idx0;}}八、常见问题问题原因解决MQTT 断线ESP8266 自动掉线定时ATMQTTCONN?检查数据乱码波特率不匹配115200 8N1卡死AT 阻塞所有 AT 必须超时丢包URC 覆盖环形缓冲区OTA 失败Flash 不够用 ESP-12F九、推荐 AT 固件版本ESP8266 AT v2.2.0关闭回显ATE0

相关文章:

基于 FreeRTOS + ESP8266(AT 指令)+ MQTT的实现方案

一、整体系统架构 ┌─────────────────────────────────────────────┐ │ Host MCU (dsPIC33 / STM32) │ │ │ │ ┌────────────┐ UART ┌…...

西安家谱印刷厂哪家好

你知道吗?我走访了全国20多个宗亲会,发现一个扎心的事实——超过70%的家庭在第一次修谱时,都踩过同样的坑。有位陕西的陈姓宗长,花了整整3年时间收集家族资料,结果找了一家小印刷厂,拿到手的家谱&#xff0…...

MySQL InnoDB引擎八大核心特性详解(高频面试题)

📚 专栏:MySQL底层原理&面试必刷💡 适用人群:后端开发、数据库学习者、面试刷题者🔥 博客简介:InnoDB是MySQL 5.5默认存储引擎,也是企业项目唯一主流引擎。本文通俗易懂图文拆解其核心特性&…...

第一次的博客

我是???计划考研由于是跨考,计划从0开始,先打c语言基础,再学习数据结构每天二~三小时暂无...

Windows 批量解压 TAR 文件脚本:支持文件数量校验、断点续解压和自动跳过

文章目录一、需求说明二、脚本功能三、为什么使用 7-Zip1. 7-Zip 支持命令行调用2. 方便读取 tar 包内部文件列表3. 支持跳过已存在文件,适合断点续解压4. 对 tar 文件支持比较稳定5. 适合处理大量小文件场景四、完整 BAT 脚本五、使用前需要修改的地方六、脚本运行…...

如何用OneNote Markdown插件快速提升笔记效率:终极指南

如何用OneNote Markdown插件快速提升笔记效率:终极指南 【免费下载链接】NoteWidget Markdown add-in for Microsoft Office OneNote 项目地址: https://gitcode.com/gh_mirrors/no/NoteWidget 还在为OneNote复杂的格式调整而烦恼吗?想象一下&…...

2026年杭州靠谱的GEO优化公司,杭州这里通网络科技值得选择吗?

在数字化时代,企业越来越重视线上推广,GEO优化服务能有效提升企业在AI平台上的曝光和流量,因此很多企业关注靠谱的GEO优化公司。杭州这里通网络科技就是一家值得了解的企业。 ### 选择标准 技术能力:靠谱的GEO优化公司应具备强大…...

Win10升级21H2后远程桌面黑屏?一个组策略设置帮你搞定(附gpedit.msc详细路径)

Windows 10 21H2远程桌面黑屏故障深度解析与精准修复方案当你从Windows 10 1909版本升级到21H2后,是否遇到过这样的场景:远程桌面连接看似成功,却在15秒后突然黑屏断开,只留下"您的远程桌面会话已结束"的模糊提示&#…...

胖瘦 AP 网络仿真实验

一.实验概述实验名称:胖瘦 AP 网络仿真实验实验目的:掌握胖 AP(FAT AP)与瘦 AP(FIT AP)两种无线组网模式的工作原理与配置方法,理解两者的核心差异实现指定网络连通性要求:瘦 AP 侧静…...

07-大模型智能体开发工程师:提示词工程(Prompt Engineering)

系列文章导航:AI系列文章导航目录-持续更新中 第07课:提示词工程(Prompt Engineering) 📝 本文摘要:本文系统讲解提示词工程的核心认知和方法论,包括六大设计原则(清晰明确、给出示例…...

办公场景横向测评:GPT-5.5、DeepSeek、Gemini 处理公文优劣对比

进入 2026 年,AI 办公已经从“帮我写一段话”逐渐变成了“帮我完成一整套文档流程”。尤其是在公文、通知、会议纪要、方案初稿、汇报材料等场景里,大模型能不能理解语境、控制语气、保持格式,直接影响实际使用体验。目前常见的办公 AI 模型中…...

Java的背景知识及快速入门

Java的背景知识1.Java的历史知识Java是哪家公司的产品?Java是美国Sun(Stanford University Network,斯坦福大学网络公司)公司在1995年推出的一 门计算机高级编程语言。但是在2009年是Sun公司被Oracle(甲骨文&#xff0…...

告别昂贵定位器!用Python和PyTorch复现DCL-Net,实现无传感器3D超声重建

告别昂贵定位器!用Python和PyTorch复现DCL-Net实现无传感器3D超声重建在医学影像领域,3D超声重建技术正逐步改变传统诊断方式。想象一下,医生只需手持普通超声探头自由扫描,AI系统就能自动将二维切片合成为三维立体图像——这正是…...

Llama3-8B中文微调实战:用‘弱智吧’QA数据让模型学会说人话

Llama3-8B中文微调实战:用趣味问答数据打造会说人话的AI当Meta发布Llama3系列模型时,技术社区最关注的是其70B版本,但8B版本在资源消耗和微调灵活性上的优势不容忽视。本文将展示如何用中文互联网特有的"弱智吧"风格问答数据&#…...

给Llama-3-8B-Instruct加个‘垫片’:手把手教你安全添加Pad Token并微调(附完整代码)

为Llama-3-8B-Instruct安全添加Pad Token的工程实践指南当你在微调Llama-3-8B-Instruct时,是否遇到过这样的困扰:模型没有提供Pad Token,导致数据处理和训练过程中出现各种不便?这个问题看似简单,实则暗藏玄机。本文将…...

Java国密SM2证书Unknown curve异常的三步绕过方案

1. 这不是JDK的bug,是国密算法在Java生态里“没户口”的真实写照你刚把SM2证书集成进Spring Boot服务,调用验签接口时控制台突然炸出一行红字:java.security.InvalidKeyException: Unknown curve。接着堆栈里全是sun.security.ec.ECParameter…...

函数指针调用的两种语法及其在嵌入式C中的应用

1. 函数指针调用:两种语法背后的故事在嵌入式C开发中,函数指针是实现回调机制、插件架构和动态行为的关键技术。最近有工程师发现,通过函数指针调用函数时存在两种看似不同的语法形式:(*ptr)(); // 传统间接调用语法 ptr(); …...

CVE二进制工具:无源码漏洞检测的原理与实战

1. 这不是又一个“扫扫就完事”的漏洞扫描器很多人第一次听说“CVE二进制工具”时,下意识会把它和常见的Web漏洞扫描器(比如Nessus、OpenVAS)划等号——点几下鼠标,跑个任务,出份PDF报告,然后发给安全部门交…...

小学期学习——第二周

一、本周学习视频6-7学习了单电源供电的二阶低通滤波器以及电子计数法,并对仿真进行了改进。二、绘制了PCB原理图学习使用嘉立创EDA,并且绘制了PCB原理图。...

第 12 周 周报

牛 客 :周赛144,DEF C F :(dive2 1097) C D (dive2 1098)B (dive2 1099)BCD...

瑞德克斯在手机端的表现稳不稳?是否适合随时查看行情?

瑞德克斯在手机端的表现稳不稳?是否适合随时查看行情?移动端是当下用户接触金融服务最频繁的入口之一。瑞德克斯在手机端的体验打磨上下了不少功夫,让常用功能可以在小屏幕上同样得到清晰、舒适的呈现。瑞德克斯的移动应用采用了简洁的导航设…...

安全合规:满足行业安全标准和法规要求

安全合规:满足行业安全标准和法规要求 一、安全合规概述 1.1 安全合规的定义 安全合规是指企业在信息安全方面遵守相关法规、标准和行业规范的过程。它涉及数据保护、隐私安全、访问控制等多个方面,确保企业信息系统的安全性和合规性。 1.2 安全合规的价…...

从黑猩猩内战到人类关系:互动是系统的命脉,遗忘是文明的暗礁

从黑猩猩内战到人类关系:互动是系统的命脉,遗忘是文明的暗礁 将黑猩猩Ngogo群体从平和共处走向相互屠戮的演变过程,结合人类关系分型自相似性理论对照分析,一套完整的认知逻辑就此显现。江河支流汇聚、树木枝杈生长,乃…...

Go语言内存泄漏:pprof与监控

Go语言内存泄漏:pprof与监控 1. 内存泄漏检测 go tool pprof http://localhost:6060/debug/pprof/heap2. 总结 定期使用pprof检测内存使用,及时发现泄漏。...

Qt6.5数控加工CAM框架实战:基于工厂模式与分层架构的CamCore完整实现

文章简介 本文基于Qt Creator 14.0.1、Qt6.5 LTS、CMake、C17,搭建一套轻量化数控加工CAM核心框架CamCore。采用工序、算法、UI界面一一映射的分层架构,结合工厂模式、多态继承、枚举参数管控设计,具备参数管理、工艺模板复用能力&#xff0…...

股市学习心得-技术指标学习(布林线+MACD)

技术指标学习(布林线MACD)(所提供内容仅用于学习交流,不作为股市交易依据)首先,技术指标除了量比和换手率,都有滞后和造假的可能,因此不能用单一指标判断,也需要通过多个指标辅助决策。布林线MA…...

用Python和Pandas搞定泰坦尼克号数据集:从数据清洗到特征工程的完整实战

用Python和Pandas征服泰坦尼克号数据集:从数据清洗到特征工程的实战指南当第一次打开泰坦尼克号数据集时,那些密密麻麻的乘客信息就像一艘沉船上的碎片——杂乱无章却又充满故事。作为数据科学领域最经典的入门数据集,它包含了891名乘客的12个…...

避坑指南:处理NOAA海温数据时,关于陆地掩膜、时间解析和面积加权的三个常见错误

NOAA海温数据处理实战:避开陆地掩膜、时间解析与面积加权的三大陷阱当分析NOAA OISST海温数据时,许多研究者会不自觉地掉进几个技术陷阱——这些错误看似微小,却足以让整个分析结果偏离真实。我曾亲眼见过一位同行因为忽略纬度权重校正&#…...

避坑指南:用SARIMA做时间序列预测时,这5个参数调优错误千万别犯(Python实战)

SARIMA模型调优实战:避开时间序列预测中的五大陷阱引言在数据分析领域,时间序列预测一直是个既迷人又充满挑战的课题。每当我看到那些起伏的曲线,总能感受到数据背后隐藏的故事和规律。SARIMA模型作为时间序列分析的重要工具,因其…...

从‘交并比’到损失函数:一文搞懂Dice Loss在图像分割里的前世今生与代码实现

从集合相似度到像素级优化:Dice Loss在图像分割中的数学本质与工程实践当你在显微镜下观察一张病理切片时,那些蜿蜒交错的细胞边界决定了诊断结果;当自动驾驶汽车识别前方障碍物时,每个像素的分类关乎生命安全。图像分割作为计算机…...