Linux MQTT智能家居(源码使用分析)

举报
yd_274589494 发表于 2023/11/27 22:18:39 2023/11/27
【摘要】 @TOC 前言本篇文章开始我们来分析一下大佬写的MQTT源码,并且来看看怎么样使用MQTT连接到服务器。MQTT源码地址:源码地址这里找到源码中的test.c进行分析: 一、连接服务器 1.初始化客户端首先使用mqtt_lease函数初始化客户端:里面主要使用platform_memory_alloc函数进行客户端的内存分配初始化。platform_memory_alloc函数可以支持不同的...

@TOC


前言

本篇文章开始我们来分析一下大佬写的MQTT源码,并且来看看怎么样使用MQTT连接到服务器。

MQTT源码地址:源码地址

这里找到源码中的test.c进行分析:
在这里插入图片描述

一、连接服务器

1.初始化客户端

首先使用mqtt_lease函数初始化客户端:
在这里插入图片描述
里面主要使用platform_memory_alloc函数进行客户端的内存分配初始化。
platform_memory_alloc函数可以支持不同的操作系统,比如Linux,FreeRTOS,在不同的操作系统下有不同的实现。
在这里插入图片描述

2.设置端口号设置IP地址

使用mqtt_set_port设置端口号,使用mqtt_set_host函数设置要连接的IP地址。
在这里插入图片描述

3.连接服务器

使用mqtt_connect函数进行服务器的连接:
在这里插入图片描述
使用mqtt_connect函数进行服务器的连接时会发生下面一系列的调用关系:

在这里插入图片描述
platform_net_socket_connect函数是各个平台不同的连接方法,在单片机中可以使用esp8266进行网络的连接,在Linux中使用socket套接字进行网络的连接。

在mqtt_connect_with_results中会使用platform_thread_init函数来创建一个订阅线程这个订阅线程我们后面再进行分析:

在这里插入图片描述

二、发布消息

首先先创建一个发布消息的线程:
在这里插入图片描述

使用mqtt_message_t创建一个消息结构体,根据需求填充这个结构体中的内容。

mqtt_message_t结构体:
在这里插入图片描述
使用mqtt_publish函数发布消息。
这个函数内部会根据不同的平台来实现消息发布的函数:
在这里插入图片描述

在这里插入图片描述

三、订阅消息

订阅消息也是里面最复杂的一个了,因为我们不知道消息什么时候到达,所以必须创建一个线程一直等待消息,当消息到达后对消息进行处理。

使用mqtt_subscribe函数将对应的主题和handler处理函数放入链表,以后就可以根据主题找到对应的处理函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

前面我们也看到了在使用mqtt_connect函数进行服务器的连接时就会帮我们创建出一个线程:mqtt_yield_thread。
在这里插入图片描述
在这个线程中又会调用到mqtt_yield函数进行相关的处理。在这里插入图片描述

使用mqtt_packet_handle这个函数对订阅到的消息进行处理。
在这里插入图片描述

使用mqtt_publish_packet_handle对订阅消息进一步处理:
在这里插入图片描述

在mqtt_deliver_message函数中通过使用mqtt_get_msg_handler根据订阅的主题获取到对应的处理函数:

在这里插入图片描述

总结

在最后我再总结一下具体的流程:

1.使用mqtt_lease函数创建客户端。

2.使用mqtt_set_port和mqtt_set_host函数设置端口和IP地址。

3.使用mqtt_connect进行连接,在连接函数内部会创建出一个订阅线程。

4.使用pthread_create函数创建发布线程在线程中构造mqtt_message_t结构体,使用mqtt_publish函数将构造好的数据发布出去。

5.使用mqtt_subscribe函数将主题和处理函数放入结构体中,当接收到对应的主题后根据链表中的对应关系找到处理函数进行订阅消息的处理。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。