MQTT源码分析

目录

MQTT源码分析

1. MQTT客户端功能

2. 客户端软件如何实现

3. 程序分层

4. 情景分析

4.1 连接服务器

4.2 创建线程

4.3 发布消息

4.4 最复杂:订阅消息


MQTT源码分析

分析源码:mqttclient\test\emqx\test.c

参考资料:

  • kawaii-mqtt源码:

    • 作者发布源码:GitHub - jiejieTop/mqttclient: A high-performance, high-stability, cross-platform MQTT client, developed based on the socket API, can be used on embedded devices (FreeRTOS / LiteOS / RT-Thread / TencentOS tiny), Linux, Windows, Mac, with a very concise The API interface realizes the quality of service of QOS2 with very few resources, and seamlessly connects the mbedtls encryption library.

    • 大牛维护的:GitHub - longtengmcu/kawaii-mqtt: 基于socket API的MQTT客户端,以极少的资源实现qos2服务质量,并且实现mbedtls支持,此仓库是专门为RT-Thread做的软件包,原始仓库位于:https://github.com/jiejieTop/mqttclient

  • 博客

    • 作者博客:

      • 你不得不看的图文并茂的MQTT协议通信过程!!!

      • MQTT协议简介及协议原理

      • mqttclient设计与实现方式

    • 大牛笔记:

      • 记一次解决MQTT软件包内存泄露的心路历程

  • APP

    • Download | Eclipse Mosquitto

    • MQTTX:全功能 MQTT 客户端工具

1. MQTT客户端功能

MQTT通信模型示意图如下:

以"记者-电视台-观众"的模式来理解,客户端具体的流程是这样的:

  • 客户端1:观众打电话到电视台:connect

  • 客户端1:观众向电视台订阅"财经新闻": Subscribe 某个 Topic

  • 客户端2:记者打电话到电视台:connect

  • 客户端2:记者向电视台发布"财经新闻":Public某个Topic的某个Playload

  • 服务器:电视台向"订阅了财经新闻的观众"发布"某条消息":Public某个Playload给Subscriber

整个过程中,电视台和记者、电视台和观众直接的电话要保存连接状态,还要时不时确认一下:

  • 记者要时不时给电视台喊一声"喂":确保电视台还正常

  • 观众要时不时给电视台喊一声"喂":确保电视台还正常

2. 客户端软件如何实现

  • 连接服务器

  • 订阅:

    • 发布订阅请求,等待回应

    • 循环:读取Publish信息(得到订阅的信息),处理

  • 发布:

    • 发送数据包即可

  • PING

    • 循环:确保自己、对方还活着

    • mqtt_packet_handle > mqtt_keep_alive

需要一个循环!

3. 程序分层

至少可以分为3层:

  • 最上层:APP

  • 中间层:MQTT

  • 平台层:实现多线程、定时器、网卡收发数据

4. 情景分析

4.1 连接服务器

函数调用过程:

main
    client = mqtt_lease();
    mqtt_set_port(client, "1883");
    mqtt_set_host(client, "www.jiejie01.top");
​
    mqtt_connect(client);
        mqtt_connect_with_results(c);
            rc = network_init(c->mqtt_network, c->mqtt_host, c->mqtt_port, NULL);
            rc = network_connect(c->mqtt_network);
                    nettype_tcp_connect(n); 
                        platform_net_socket_connect

4.2 创建线程

调用过程:

main
    mqtt_connect(client);
        mqtt_connect_with_results(c);
            rc = network_init(c->mqtt_network, c->mqtt_host, c->mqtt_port, NULL);
            rc = network_connect(c->mqtt_network);
​
            /* send connect packet */
            if ((rc = mqtt_send_packet(c, len, &connect_timer)) != MQTT_SUCCESS_ERROR)
                goto exit;
​
            if (mqtt_wait_packet(c, CONNACK, &connect_timer) == CONNACK) {
            }
​
            /* connect success, and need init mqtt thread */
            c->mqtt_thread= platform_thread_init("mqtt_yield_thread", mqtt_yield_thread,c, ...);
 

4.3 发布消息

调用过程:

main
    res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
                mqtt_publish_thread
                    mqtt_publish(client, "topic1", &msg);
​
// 1. 构造消息
mqtt_message_t msg;
​
memset(&msg, 0, sizeof(msg));
msg.payload = (void *) buf;
msg.payloadlen = xxx;
​
mqtt_publish(client, "topic1", &msg);
    // 1.1 根据MQTT协议构造数据包
​
    // 1.2 根据平台相关的函数发送数据包
    mqtt_send_packet
        network_write
            nettype_tcp_write
                platform_net_socket_write_timeout

4.4 最复杂:订阅消息

消息何时到来?不知道!

所以,必定是某个内核线程不断查询网卡:

  • 读网卡数据

    • 得到数据的话就判断、处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于Vue.js的二手车交易系统

文末获取源码,项目编号: S 084 。 \color{red}{文末获取源码,项目编号:S084。} 文末获取源码,项目编号:S084。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块…

RabbitMQ 常见面试题

目录 1.前置知识1.1.什么是 MQ?它有什么作用?1.2.什么是消费者生产者模型?1.3.AMQP 是什么? 2.RabbitMQ 入门2.1.什么是 RabbitMQ?有什么特点?2.2.RabbitMQ 的核心概念有哪些?2.2.1.生产者 (Pro…

720度vr虚拟家居展厅提升客户的参观兴致

VR虚拟展厅线上3D交互展示的优势有以下几点: 打破了场馆的展示限制,可展示危险性制品、珍贵稀有物品、超大型设备等,同时提供了更大的展示空间和更丰富的展示内容。 可提供企业真实环境的实时VR全景参观,提升潜在客户信任度。 提供…

go的两大测试方法- 官网推荐

go的两大测试方法- 官网推荐 go的两大测试方法- 官网推荐常见的不正规测试方法main方法个例测试验证 - 不正规1. 提供一个函数:Reverse(input string)进行测试2. 直接在函数下创建main函数下进行个例测试3. 测试发现,Reverse方法不支持某些汉字&#xff…

AZURE==SQL managed instances

创建资源 创建DB 创建完成后,拿着刚才的账号密码依然连接不上 远程连接 需要开启公网访问和开放相关端口 参考Configure public endpoint - Azure SQL Managed Instance | Microsoft Learn 连接成功

微信小程序 跳转界面,选择货物之后,返回上一页带参数并判断参数是否存在

需求 当刚进来时选择货物,跳转到选择货物界面进行货物选择,如果货物重复,不再新增货物,如果不存在,则新增 prevPage.setData()用于在页面之间传递数据。它将数据设置到上一个页面(即prevPage)的…

生成式AI赋能千行百业加速创新,2023亚马逊云科技re:Invent行业盘点

2023亚马逊云科技re:Invent全球大会已于上周圆满闭幕,在本次大会中,亚马逊云科技又为大家带来了很多功能/项目迭代更新,也重磅发布了很多全新的功能。今天从行业视角来盘点回顾哪些重磅发布适用于垂直行业客户,以及面向汽车、制造…

python可视化plotly 图例(legend)设置大全,值得收藏!

文章目录 一、图例(legend)二、update\_layout(legend{}) 相关参数及示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python…

听GPT 讲Rust源代码--src/tools(8)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/add_missing_match_arms.rs 在Rust源代码中,rust-analyzer是一个Rust编程语言的语言服务器。它提供了代码补全、代码重构和代码导航等功能来帮助开发者提高编码效率。 在rust-analyzer的代码目…

轻松掌握ArkTS!鸿蒙新作《鸿蒙HarmonyOS应用开发入门》简介

《鸿蒙HarmonyOS应用开发入门》由清华大学出版社出版,已于近期上市。该书基于HarmonyOS 3.1 ArkTS编写,所有示例采用了比较新的API 9,可谓是目前市面上最新的鸿蒙力作。 本文对《鸿蒙HarmonyOS应用开发入门》一书做个大致的介绍。 封面部分…

Vulnhub项目:EMPIRE: BREAKOUT

一、靶机地址 靶机地址:Empire: Breakout ~ VulnHub 靶机介绍: 该靶机被定义为简单,但是如果没有找到,那就难度成中等了! 二、渗透过程 老三样,发现目标,这里用 arp-scan 确定靶机 ip&#…

17:00面试,17:06就出来了,问的问题有点变态。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,…

【web开发网页制作】Html+Css网页制作关于明星介绍王嘉尔(5页面)【附源码下载】

htmlcss网页制作目录 写在前面涉及知识效果展示1、网页构思2、网页实现2.1 首页2.2 关于我2.3 成长经历2.4 朋友2.5 爱好 3、源码分享 写在前面 接着分享哈,还是学生时代的库存,当时是为了不同风格的素材,所以自己选择了多个方向的主题来练习…

计算机操作系统4

1.什么是进程同步 2.什么是进程互斥 3.进程互斥的实现方法(软件) 4.进程互斥的实现方法(硬件) 5.遵循原则 6.总结: 线程是一个基本的cpu执行单元,也是程序执行流的最小单位。 调度算法:先来先服务FCFS、短作业优先、高响应比优先、时间片…

人工智能_机器学习061_KKT条件公式理解_原理深度解析_松弛变量_不等式约束---人工智能工作笔记0101

然后我们再来看,前面我们,拉格朗日乘子法,把带有条件的,问题,优化成了等式问题,从而, 构建拉格朗日乘子公式,进行实现了求解,但是在现实生活中,往往也有,很多不等式问题. 比如上面的这个,就是要求是h(x)<=0的情况下,函数f(x)的最小值. 可以看到,这个带有一个不等式的条件,…

『亚马逊云科技产品测评』活动征文|AWS云服务器EC2实例实现ByConity快速部署

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在…

四、分代垃圾回收机制及垃圾回收算法

学习垃圾回收的意义 Java 与 C等语言最大的技术区别&#xff1a;自动化的垃圾回收机制&#xff08;GC&#xff09; 为什么要了解 GC 和内存分配策略 1、面试需要 2、GC 对应用的性能是有影响的&#xff1b; 3、写代码有好处 栈&#xff1a;栈中的生命周期是跟随线程&…

公司文档防泄密新招!上海迅软DSE揭秘电脑文档加密绝技!

面对频频案发的企业文档泄露事件&#xff0c;各企业该如好保护好文档安全呢&#xff1f; 1、进行文档加密&#xff0c;防止机密外泄 现在勒索病毒组织经常以公开机密信息威胁企业支付赎金&#xff0c;如果事先对重要文档加密保护&#xff0c;可以很好防止重要文档被公开。 迅软…

Python中的并发编程(2)线程的实现

Python中线程的实现 1. 线程 在Python中&#xff0c;threading 库提供了线程的接口。我们通过threading 中提供的接口创建、启动、同步线程。 例1. 使用线程旋转指针 想象一个场景&#xff1a;程序执行了一个耗时较长的操作&#xff0c;如复制一个大文件&#xff0c;我们希…

Ngnix和Apache配置SSL证书

本文主要介绍Ngnix和Apache配置SSL证书的方法 目录 SSL证书SSL证书的作用Ngnix简介Ngnix配置SSL证书Apache简介Apache配置SSL证书 SSL证书 SSL证书是一种数字证书&#xff0c;用于加密在网络上发送的数据并保护敏感信息的安全性。SSL代表“安全套接字层”&#xff0c;它是一种…