
Zephyr RTOS网络协议栈基础:MQTT客户端上周调试产线上的一个温湿度采集节点,MQTT客户端连上Broker后,每隔十几秒就断线重连一次。抓包看了半天,发现是KeepAlive报文发送时机出了问题——Zephyr的MQTT库默认心跳间隔是60秒,而我设置的Publish频率是30秒,结果Broker以为客户端死了。这个坑让我重新翻了一遍Zephyr的MQTT协议栈实现,索性把笔记整理出来。协议栈的层次感Zephyr的网络协议栈不是一坨糊在一起的代码。从应用层到底层,MQTT走的是这样一条路:App - MQTT Client API - TCP Socket - IP Stack - Network DeviceMQTT库本身不处理TCP连接,它依赖Zephyr原生的socket接口。这意味着你可以在同一个网络接口上同时跑MQTT和CoAP,底层复用同一个IP栈。我见过有人把MQTT和HTTP的socket混在一起用,结果端口冲突——别这样写,每个协议的服务端口要规划清楚。MQTT客户端的核心数据结构是struct mqtt_client,里面藏着连接参数、回调函数、缓冲区指针。初始化时最容易被忽略的是client_id字段,Zephyr不会自动生成,你必须自己填一个唯一标识。之前有个同事直接写死"test_client",结果两个设备同时上线,Broker直接踢掉一个。连接建立的细节