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

TCP通信与MQTT协议的关系

1. MQTT 处理核心(Mqtt_Pro

void Mqtt_Pro(void) {

    MQTT_Init();       // 初始化MQTT协议栈(连接参数、缓冲区等)

    MQTT_SendPro();    // 处理MQTT发送(封装消息,调用TCP发送)

    MQTT_RecPro();     // 处理MQTT接收(解析TCP接收的数据,提取MQTT消息)

}

作用:作为 MQTT 协议的总控函数,协调初始化、发送和接收流程,与 TCP 层通过 MQTT_SendPro 和 MQTT_RecPro 交互。

2.TCP 收发处理(M26_PROCESS_TCP 状态)

case M26_PROCESS_TCP:

    drv_M26_TcpSend();  // TCP发送:将MQTT封装的数据包通过模块发送

    drv_M26_TcpRec();   // TCP接收:读取模块接收的TCP数据,供MQTT解析

    // (状态检查与重连逻辑,确保TCP连接稳定)

break;

TCP 发送(drv_M26_TcpSend):

输入:MQTT 层生成的数据包(如 PUBLISH 消息,包含主题、载荷)。

处理:通过 AT 指令(如 AT+CIPSEND)将数据发送到 TCP 连接,实现网络层传输。

示例:MQTT 发送 PUBLISH 消息时,调用此函数将字节流发送到服务器。

TCP 接收(drv_M26_TcpRec):

输出:填充 MqttState.Recbuf(MQTT 接收缓冲区),设置 NewRecDataFlag(新数据标志)。

处理:过滤 AT 指令响应头(如 +QIURC: "recv"),提取纯 MQTT 数据包(如 CONNACK、PUBACK),供 MQTT_RecPro 解析。

3. 协议分层交互

MQTT → TCP(发送):

封装:MQTT_SendPro 按 MQTT 协议构建消息(如 CONNECT 的固定头、可变头、载荷)。

传输:调用 drv_M26_TcpSend,将 MQTT 数据包作为 TCP 字节流发送(底层通过模块的 TCP 通道)。

TCP → MQTT(接收):

接收:drv_M26_TcpRec 读取模块数据(TCP 字节流),存入 MqttState.Recbuf。

解析:MQTT_RecPro 按 MQTT 协议解析(提取消息类型、剩余长度、载荷等),处理业务逻辑(如连接确认、参数下发)。

4. 代码协作示例(PUBLISH 流程)

MQTT 封装:

MQTT_SendPro() 构建 PUBLISH 消息(主题 sensor/temp,载荷 25.5),格式为:

0x30(固定头,PUBLISH,QoS0) + 剩余长度(计算主题 + 载荷长度) + 主题长度(2 字节) + 主题 + 载荷。

TCP 发送:

drv_M26_TcpSend() 将上述字节流通过 AT 指令发送到 MQTT 服务器的 TCP 连接(如端口 1883)。

TCP 接收(服务器响应 PUBACK,QoS1 时):

drv_M26_TcpRec() 接收服务器返回的 TCP 数据(PUBACK 消息),存入 MqttState.Recbuf。

MQTT 解析:

MQTT_RecPro() 解析 PUBACK,确认消息已接收(更新状态机,标记发送成功)。

5. 总结

TCP 是传输载体:提供可靠的字节流传输,屏蔽网络硬件细节(如 GPRS 模块的 AT 指令交互)。

MQTT 是应用协议:在 TCP 之上定义消息格式(主题、QoS)和交互规则(如 CONNECT/PUBLISH/PUBACK),实现物联网设备的高效通信。

代码协作:通过函数调用链(MQTT 封装→TCP 发送,TCP 接收→MQTT 解析)实现两层协议的协同,确保数据从应用层(MQTT)到网络层(TCP)的无缝传输,适用于嵌入式设备的远程通信(如传感器数据上报、远程配置下发)。

这种分层设计使代码模块化,便于维护(如更换 TCP 模块时,只需修改 drv_M26_Tcp* 函数,不影响 MQTT 逻辑),是物联网设备网络通信的典型实现。

http://www.lryc.cn/news/2394257.html

相关文章:

  • AWS创建github相关的角色
  • 数据编辑器所具备的数据整理功能​
  • Unity网络开发实践项目
  • Jetson Orin Nano - SONY imx415 camera驱动开发
  • word为跨页表格新加表头和表名
  • 测试用例篇章
  • 2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析
  • Django ToDoWeb 服务
  • 【软件】在 macOS 上安装 Postman
  • 各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?
  • 全志科技携飞凌嵌入式T527核心板亮相OpenHarmony开发者大会
  • AI+微信小程序:智能客服、个性化推荐等场景的落地实践
  • 事件驱动架构入门
  • 基于Web的濒危野生动物保护信息管理系统设计(源码+定制+开发)濒危野生动物监测与保护平台开发 面向公众参与的野生动物保护与预警信息系统
  • 索引的选择与Change Buffer
  • leetcode hot100刷题日记——30.两数之和
  • Fastapi 学习使用
  • Ollama:本地大模型推理与应用的创新平台
  • rtpinsertsound:语音注入攻击!全参数详细教程!Kali Linux教程!
  • django项目开启debug页面操作有数据操作记录
  • 【Vim】高效编辑技巧全解析
  • 基于 Node.js 的 Express 服务是什么?
  • 【C++】入门基础知识(1.5w字详解)
  • Excel数据脱敏利器:自动保留格式的智能脱敏脚本
  • Photoshop2025(PS2025)软件及安装教程
  • AI赋能开源:如何借助MCP快速解锁开源项目并提交你的首个PR
  • 计算机视觉---GT(ground truth)
  • SQL进阶之旅 Day 9:高级索引策略
  • R 语言科研绘图第 52 期 --- 网络图-分组
  • 姜老师的MBTI课程:MBTI是可以转变的