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

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

前言

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


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
336 2
|
24天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
44 7
|
27天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
2月前
|
消息中间件 存储 监控
深度写作:深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(Message Queue, MQ)扮演着至关重要的角色。MQ不仅实现了应用间的解耦,还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中,长轮询(Long Polling)机制因其能有效提升消息处理的实时性和效率,备受关注。
87 12
|
2月前
|
消息中间件 存储 Java
深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(MQ)作为一种重要的中间件,广泛应用于解耦、异步处理、流量削峰等场景。其中,延时消息和定时消息作为MQ的高级功能,能够进一步满足复杂的业务需求。为了实现这些功能,MQ系统需要进行一系列优化,长轮询机制便是其中的关键一环。本文将深入探讨MQ如何设计延时消息和定时消息的优化机制,特别是长轮询机制的实现原理及其在Java中的模拟实现。
48 2
|
2月前
|
缓存 算法 Linux
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
|
4月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
5月前
|
存储 IDE Unix
Linux 内核源代码情景分析(四)(上)
Linux 内核源代码情景分析(四)
48 1
Linux 内核源代码情景分析(四)(上)
|
3月前
|
传感器 数据可视化 网络协议
DIY可视化整合MQTT生成UniApp源码
DIY可视化整合MQTT生成UniApp源码
63 0
|
5月前
|
存储 Linux 块存储
Linux 内核源代码情景分析(三)(下)
Linux 内核源代码情景分析(三)
52 4