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

2023-07-17 00:00:00


前言

本篇文章开始我们来分析一下大佬写的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函数将主题和处理函数放入结构体中,当接收到对应的主题后根据链表中的对应关系找到处理函数进行订阅消息的处理。

更多推荐

数据通信网络之IPv6以太网多层交换

文章及资源归档至【AIShareLab】,回复通信系统与网络可获取。文章目录一、目的二、环境及网络拓扑三、需求四、步骤一、目的掌握VLAN的基础配置。掌握Trunk的基础配置。掌握VLANIF的基础配置,并理解通过三层交换机实现VLAN之间通信的方案。二、环境及网络拓扑本实验模拟一个典型的简单园区网络,如图1所示,其中

半导体CIM系统中的EAP:提升制造效率的关键

半导体制造是高度复杂和技术密集型的行业,对生产效率和产品质量有着极高的要求。在这个领域,设备自动化编程系统(EquipmentAutomationProgramming,EAP)已经崭露头角,成为提升制造效率的关键要素。本文将深入探讨EAP在半导体CIM系统(制造执行系统)中的作用,以及它如何显著提高制造效率的关键作用

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录如果你很赶时间,那么就直接看我本标题下的内容即可!!一、STL简介1.1什么是STL1.2STL版本1.3STL六大组件1.4STL重要性1.5如何学习STL二、什么是string??(本质上是一个类)三、string的类模板(什么?string居然利用了模板??)三、string的三种构造(拷贝构造也

批处理小程序的制作

一、介绍批处理是一种将一系列计算机任务按照预定义的顺序进行自动化处理的技术。它是通过批处理脚本或命令文件来实现的,可以在不需要人工干预的情况下,批量运行多个命令或程序。批处理脚本的优点1.自动化:批处理可以自动执行重复性任务,无需手动干预,减少人力和时间成本。2.批量处理:批处理可以同时处理多个任务,提高工作效率。3.

Kotlin 中的协程 flow

一、Flow概述Flow具有异步挂起suspend响应式编程,可以使用挂起函数来异步生产和消费事件,Flow的设计灵感也来源于响应式流以及其各种实现。二、Flow的生产和消费suspendfuntest1(){flow<Int>{(0..4).forEach{emit(it)//生产者发送数据}}.collect{pr

群晖linux ——设置短密码、免密码登录、多个群晖免密登录

文章目录概述群晖设置超短密码获取root权限设置新密码/更改密码群晖SSH公钥免密登录开启家目录修改文件夹权限修改配置文件上传公钥高级——多个群晖,不同密钥解决方法概述群晖仅在内网运行,外网无法访问。每次输入长密码不方便。但是群晖WEB端无法设置短密码,一番搜索过后,发现可以通过SSH的方式设计短密码。具体步骤如下。群

勒索病毒最新变种.Elbie勒索病毒来袭,如何恢复受感染的数据?

引言:随着数字化的快速发展,网络安全威胁也变得越来越严重。其中,.Elbie勒索病毒是一种备受恶意分子钟爱的危险工具,它可以加密您的数据文件,然后勒索高额赎金。本文将深入探讨.Elbie勒索病毒的威胁,包括其工作原理、如何恢复被其加密的数据文件,以及有效的预防措施,以保护您的数据免受损失。如果您在面对被勒索病毒攻击导致

Kettle REST Client获取token调用接口解析JSON入文件实战

KettleRESTClient通过GET获取token以POST方式请求接口解析JSON入文件完整实例需求说明通过kettle组件调用接口并解析JSON成结构化数据入文件。完整实例解决方法利用生成记录组件定义URL参数通过RESTClENT组件请求得到TOKEN通过JSONINPUT组件解析接口请求的结果通过JAVA

SOLIDWORKS2024新功能--SOLIDWORKS篇(三)

结构系统和焊件该章节包括以下主题:边角管理在文件属性中显示单位结构系统边角管理您可以手动或自动应用边角处理。要打开边角管理PropertyManager:打开一个零件,然后单击结构系统>主构件。创建主构件并退出结构系统模式。在PropertyManager中,指定一个选项:自动。将相似的边角分组并应用边角处理。手动。允

Tomcat

1常见的客户端/服务器架构模型1.1C/S架构(Client/ServerArchitecture)C/S架构(Client/ServerArchitecture)指的是客户端通过安装在本地的软件(客户端)访问服务器上的应用程序,客户端与服务端之间通过网络进行通信和数据交换。优点:快速响应:由于客户端软件安装在本地,可

干货 | 汽车行业研发效能提升的挑战与实践案例

在9月15日的第七届CSN大会上,思码逸研发效能专家王艳萍受邀分享了《汽车行业研发效能提升的挑战与实践案例》。演讲包含了思码逸对多家汽车企业服务过程中总结出的行业痛点、解决方案,以及实践案例。以下为演讲实录:思码逸与很多知名汽车企业都有合作。我们这次的演讲会先简单介绍一下思码逸,然后重点分享我们与汽车企业在研发效能层面

热文推荐