MQTT实现智能家居------3、源码分析(超详细)

一、连接服务器

1、初始化:

mqtt_log_init();是一个空函数,自己定义宏

client = mqtt_lease();//创建一个client结构体,从此以后client代表客户端

platform_memory_alloc();//是一个分配内存的总函数,可以适用于Linux、FreeRTos等等

mqtt_init();//分配完然后初始化一些信息,就比如说有MQTT的版本、保持心跳间隔等等很多

2、配置一下连接的信息:

mqtt_set_host();//要去链接哪个服务器

mqtt_set_port;//连接服务器端口

.

.

等信息

3、开始连接

mqtt_connect();//开始连接

mqtt_connec_with_results();//成功就调用它

network_init();//网络初始化

network_connect();//进行网络连接

如果不考虑安全性

nettype_tcp_connect();//进行TCP连接

platform_net_socket_connect();//最底层的设计硬件驱动

如果移植到Linux不需要改,如果是FreeRTos则需要大改(AT命令、串口操作)

二、创建线程

图一

接上面

mqtt_connect();//开始连接

mqtt_connec_with_results();//成功就调用它

network_init();//网络初始化

network_connect();//进行网络连接

mqtt_send_packet();//图一中CONNECT请求连接

mqtt_wait_packet();//图一中CONNECT确认请求连接

pthread_create("标题", , name, c);//创建名为name一个线程,这里以mqtt_publish_thread为例:'

三、发布消息

mqtt_publish_thread();//构造一个消息结构体,有数据长度payloadlen 和上报的数据保存在***payload**

1、构造消息

mqtt_message_t msg;

memset(&msg, 0, sizeof(msg));

msg.payload = (void *)buf;

msg.payloadlen = xxx;

mqtt_publish();

2、根据MQTT协议将数据有序化

MQTTSerialize_publish();//排序,将数据序列化

3、根据平台相关的函数发送数据包

mqtt_send_packet();//发送数据包

network_write();

nettype_tcp_write();

platform_net_socket_write_timeout();//最后的底层

四、订阅消息(检测消息来并且接收)

mqtt_subscrib(client, "topic1", QOS0, topic1_handler); //订阅 "topic1 "这个主题的消息,通过topic1_handler这个函数处理消息。

topic1_handler()//控制这个消息目的,比如去干某些事情

大体框架:

线程{

while(1)

{

读网络数据;

if(是发布消息)

{

分辨主题;

调用对应函数;

}

}

}

mqtt_subscrib(client, "topic1", QOS0, topic1_handler);

1、创建一个结构体

topic_filter:指向一个字符串,表示哪个主题。

handler:一个函数指针

2、将数据放入结构体

mqtt_msg_handler_create; //

platform_memory_alloc();//分配一块内存

将数据传给结构体;

3、记录下来,存在链表list中

mqtt_ack_list_record();//放入某个链表

目的是以后在遇到这个主题的消息时候直接调用链表存的函数。

五、核心线程

mqtt_connect();//开始连接

platform_thread_init("mqtt_yield_thread", mqtt_yield_thread, );//连接成功后创建核心线程

mqtt_yield_thread();

mqtt_yield();//1、读包处理包 2、保持心跳(是不是发ping信号)3、处理错误

mqtt_packet_handle;

1)读包处理包

mqtt_read_packet;先读包

switch(){//处理

case0: 没收到包

case x:处理某个包

}

2)保持心跳

3)处理错误,重连

具体如何处理(以PUBLISH为例子):

mqtt_publish_packet_handle();//处理包函数

MQTTDeserialize_publish();//解析包

mqtt_deliver_message();//传送消息

mqtt_get_msg_handler(c, 主题);//根据主题在链表找出handler,调用handler对应处理函数。

六、总结一下

先连接服务器

然后创建发布线程,成功以后创建核心线程,读包处理包;

然后订阅消息,创建每个消息的处理函数,将订阅的消息存在链表;

读包处理包:将包的信息读取出来对比是否订阅,如果订阅就调用对应函数;

相关推荐
电子科技圈1 天前
边缘AI赋能物联网,芯科科技推动智能边缘创新
人工智能·嵌入式硬件·物联网·智能家居·健康医疗·智能硬件·交通物流
三佛科技-134163842121 天前
PL3380 (PL338X系列)输出5V100MA非隔离AC-DC降压恒压输出芯片典型应用电路 与LP2601对比
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
三佛科技-134163842122 天前
AIP8P005B 与FT60E112A(8位I/O型单片机)对比分析,FT60E112A能否兼容替代AIP8P005B?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
星野云联AIoT技术洞察6 天前
在 Home Assistant 里,ZHA、Zigbee2MQTT、Matter 到底该怎么选
智能家居·zigbee·matter·home assistant·zigbee2mqtt·zha·本地控制
LCG元8 天前
ESPHome + HomeAssistant 搭建手机可控制的本地私有智能家居系统
网络·智能手机·智能家居
三佛科技-134163842128 天前
LP2188A,LP2188AL,LP2188BL如何区分?应用电路分析
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
华普微HOPERF9 天前
电视冰箱洗衣机、空调风扇热水器,Matter协议如何塑造全屋智能?
嵌入式硬件·物联网·智能家居·matter协议·全屋智能
三佛科技-134163842129 天前
KP311BHWGA 集成整流桥堆二极管非隔离BUCK降压芯片(负压输出电源IC) 典型应用电路
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
想你依然心痛11 天前
HarmonyOS 6 悬浮导航 + 沉浸光感:打造鸿蒙智能体驱动的沉浸式智能家居控制中枢
华为·ar·智能家居·harmonyos·智能体
振浩微433射频芯片13 天前
告别“遥控失灵”:如何评估国产433芯片在智能家居领域的可靠性?
网络·单片机·嵌入式硬件·物联网·智能家居