MQTT框架和使用

目录

MQTT框架

1. MQTT概述

1.1 形象地理解三个角色

1.2 消息的传递

2. 在Windows上体验MQTT

2.1 安装APP

2.2 启动服务器

2.3 使用MQTTX

2.3.1 建立连接

2.3.2 订阅主题

2.3.3 发布主题

2.4 使用mosquitto

2.4.1 发布消息

2.4.2 订阅消息

3. kawaii-mqtt源码分析

3.1 使用

3.2 kawaii-mqtt内部实现

3.2.1 主要代码

3.2.2 处理函数记录在链表里

3.2.3 流程图


MQTT框架

参考资料:

  • 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概述

1.1 形象地理解三个角色

MQTT通信模型示意图如下:

使用电视台、记者、观众三个角色来类比更容易理解:

  • 电视台:在MQTT里被称为服务器(broker),有如下作用

    • 接受来自客户的网络连接; // 记者/观众连接进电视台

    • 接受客户发布的应用信息; // 接受记者发布的消息

    • 处理来自客户端的订阅和退订请求; // 处理观众的订阅、退订请求

    • 向订阅的客户转发应用程序消息 // 给观众转发记者报道的消息

  • 记者和观众都是客户端,记者也可以当观众,观众也可以当记者,有如下作用:

    • 发布信息; // publish,记者

    • 订阅消息;// Subscribe ,观众

    • 退订或删除消息;

    • 断开与服务器连接

1.2 消息的传递

还是以日常生活为例,提几个问题:

  • 观众:我只关心财经新闻,那么只订阅"财经新闻",不订阅"体育新闻"

  • 记者:我是财经记者,我可以发布"财经新闻",不发布"体育新闻"

这个过程中,引入两个概念:

  • 主题(Topic):是财经类的?还是体育类的?

  • 消息(Message)或负载(Playload):具体的新闻信息

具体的流程是这样的:

  • 观众打电话到电视台:connect

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

  • 记者打电话到电视台:connect

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

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

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

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

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

2. 在Windows上体验MQTT

2.1 安装APP

安装这2个APP:

2.2 启动服务器

使用DOS命令行,进入mosquitto-2.0.14-install-windows-x64的安装目录,执行命令:

cd  "c:\Program Files\mosquitto"
.\mosquitto.exe -v

在下面的实验中,无论是使用MQTTX还是使用mosquitto_pub/mosquitto_sub,都要保持mosquitto.exe在运行。

2.3 使用MQTTX

2.3.1 建立连接

运行MQTTX后,如下图操作:

2.3.2 订阅主题

建立连接后,如下图操作:

2.3.3 发布主题

如下操作:

2.4 使用mosquitto

2.4.1 发布消息

参数说明:

mosquitto_pub 命令参数说明
1. -d  打印debug信息
2. -f  将指定文件的内容作为发送消息的内容
3. -h  指定要连接的域名  默认为localhost
4. -i  指定要给哪个clientId的用户发送消息
5. -I  指定给哪个clientId前缀的用户发送消息
6. -m  消息内容
7. -n  发送一个空(null)消息
8. -p  连接端口号
9. -q  指定QoS的值(0,1,2)
10. -t  指定topic
11. -u  指定broker访问用户
12. -P  指定broker访问密码
13. -V  指定MQTT协议版本
14. --will-payload  指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
15. --will-qos  Will的QoS值。该参数需要与--will-topic一起使用
16. --will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
17. --will-topic  用户发送Will消息的topic

使用DOS命令行,进入mosquitto-2.0.14-install-windows-x64的安装目录,执行命令:

cd  "c:\Program Files\mosquitto"
.\mosquitto_pub.exe -h 127.0.0.1 -p 1883  -t "100ask"
如图:

2.4.2 订阅消息

参数说明:

mosquitto_sub 命令参数说明
1. -c  设定‘clean session’为无效状态,这样一直保持订阅状态,即便是已经失去连接,如果再次连接仍旧能够接收的断开期间发送的消息。
2. -d  打印debug信息
3. -h  指定要连接的域名  默认为localhost
4. -i 指定clientId
5. -I 指定clientId前缀
6. -k keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒。
7. -q 指定希望接收到QoS为什么的消息  默认QoS为0
8. -R 不显示陈旧的消息
9. -t 订阅topic
10. -v 打印消息
11. --will-payload  指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
12. --will-qos  Will的QoS值。该参数需要与--will-topic一起使用
13. --will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
14. --will-topic  用户发送Will消息的topic

使用DOS命令行,进入mosquitto-2.0.14-install-windows-x64的安装目录,执行命令:

3. kawaii-mqtt源码分析

3.1 使用

几条代码使用MQTT:

void my_message_handler_t(void* client, message_data_t* msg)
{
}int main(void)
{int err;mqtt_client_t *client = NULL;err = mqtt_connect(client);err = mqtt_subscribe(client, "100ask-topic", QOS0, my_message_handler_t);while (1);
}

从上述代码中,提2个问题:

答案:

3.2 kawaii-mqtt内部实现

3.2.1 主要代码

kawaii-mqtt内部处理都是使用mqtt_yield_thread线程来处理:

主要函数是mqtt_yield:

mqtt_yield里的核心函数是对数据包的处理:mqtt_packet_handle

3.2.2 处理函数记录在链表里

mqtt_client结构体里有2个链表:

MQTT Client向Broker发出某些数据包时,期待得到回应(ACK):会启动一个定时器。如果定时器超时表示没有收到ACK:

  • 要么重发

  • 要么出错

  • 对于ACK包,一般无需提供处理函数

要订阅某个主题时,MQTT Client会发出SUBCRIBE包,期待得到回应的数据包:SUBACK包。代码如下:

mqtt_subscribemsg_handler = mqtt_msg_handler_create(topic_filter, qos, handler);rc = mqtt_ack_list_record(c, SUBACK, packet_id, len, msg_handler);/* create a ack handler node */ack_handler = mqtt_ack_handler_create(c, type, packet_id, payload_len, handler);platform_timer_cutdown(&ack_handler->timer, c->mqtt_cmd_timeout); mqtt_list_add_tail(&ack_handler->list, &c->mqtt_ack_handler_list);

如果在指定时间里没有收到SUBACK包,那么就会在mqtt_ack_handler_list中删除该handler。

如果收到队列SUBACK包,那么要做两件事:

  • 在mqtt_ack_handler_list中删除该handler

  • 把该handler放到mqtt_msg_handler_list中:以后收到PUBLISH数据包时这个handler被调用

3.2.3 流程图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直面多云困境,聊聊F5分布式云的破局之道

在数字化浪潮的大背景下,我们迎来了一个万物上云的时代。Gartner的调查数据显示,81%的公有云用户选择两个或两个以上的云服务供应商。对企业来说,充分利用多云网络可以实现业务的成功转型和增长。然而机遇与挑战并存,本文从多云网…

使用AWS Glue与AWS Kinesis构建的流式ETL作业(二)——数据处理

大纲 2 数据处理2.1 架构2.2 AWS Glue连接和创建2.2.1 创建AWS RedShift连接2.2.2 创建AWS RDS连接(以PG为例) 2.3 创建AWS Glue Job2.4 编写脚本2.4.1 以AWS RedShift为例2.4.2 以PG为例 2.5 运行脚本 2 数据处理 2.1 架构 2.2 AWS Glue连接和创建 下…

C++基础 -42- STL库之list链表

list链表的格式(需要定义头文件) list<int> data1(4, 100);list<int> data2(4, 500);list链表的合并接口 举例使用合并接口并且验证 data2.merge(data1);list<int>::iterator ccc;for (ccc data2.begin(); ccc ! data2.end(); ccc){cout << *ccc …

算法学习系列(五):N皇后、数独

目录 引言一、N皇后问题代码实现测试 二、数独问题代码实现测试 引言 这个N皇后问题是很典型的一个递归问题&#xff0c;就是还是要掌握&#xff0c;所谓递归其实就是dfs&#xff0c;一层一层深入下去。数独和N皇后的思路是一样的&#xff0c;只不过一些细节不同而已。 一、N…

TFIDF、BM25、编辑距离、倒排索引

TFIDF TF刻画了词语t对某篇文档的重要性&#xff0c;IDF刻画了词语t对整个文档集的重要性

2024年API安全趋势预测

目录 1.API漏洞的渗透性 2.标准框架的局限性 3.防止漏洞 4.不断上升的威胁和战略建议 案例分析 2024年的潜在威胁 驾驭不断演变的API安全格局 在接下来的部分中&#xff0c;我们将更深入地研究这些趋势&#xff0c;探索标准框架在应对这些新出现的威胁方面的局限性…

数据库学习日常案例20231203-Mysql高级 -- 日志管理篇

Mysql高级 -- 日志篇 *日志类型 1.mysql的6类日志&#xff1a; 2.日志的弊端 *慢查询日志(slow query log) *通用查询日志(general query log) 1.作用&#xff1a; 2.问题场景&#xff1a; 3.查看当前状态 &#xff1a; 4.启动日志&#xff1a; 方式1&#xff1a;永久…

云计算在数字营销中的作用是什么?

营销策略和云计算是一个为企业提供多种优势的系统。它使他们能够取得更大的成功&#xff0c;同时提高产量。这样做的原因是&#xff0c;可以从任何位置远程使用云集成工具和应用程序。基本上&#xff0c;该系统增强了存储设备和传播。同时&#xff0c;它减轻了公司 IT 网络的压…

【Kubernetes】可视化UI界面Dashboard

安装和配置k8s可视化UI界面 一、安装Dashboard1.1、上传镜像并解压1.2、安装dashboard组件1.3、修改service1.4、访问dashboard 二、通过Token令牌访问Dashboard2.1、创建clusterrolebinding2.2、获取token2.3、使用token登录 三、通过kubeconfig文件访问Dashboard3.1、创建clu…

21、pytest参数化中标记单独的测试用例

官方实例 # content of test_expectation_xfail import pytestpytest.mark.parametrize("test_input, expected",[("35",8),("24",6),pytest.param("6*9",42,markspytest.mark.xfail)], ) def test_eval(test_input, expected):asser…

基于ssm vue技术的品牌银饰售卖平台源码和论文737

摘 要 本论文主要是针对品牌银饰售卖而开发进行概述&#xff0c;主要包括对研究的背景和研究现状&#xff0c;以及研究目的等的阐述&#xff0c;也对该系统的各种功能要求&#xff0c;对系统结构&#xff0c;数据库的设计等进行讨论。随着科技与技术的发展&#xff0c;利用计…

Qt篇——QChartView实现鼠标滚轮缩放、鼠标拖拽平移、鼠标双击重置缩放平移、曲线点击显示坐标

话不多说。 第一步&#xff1a;自定义QChartView&#xff0c;直接搬 FirtCurveChartView.h #ifndef FITCURVECHARTVIEW_H #define FITCURVECHARTVIEW_H #include <QtCharts>class FitCurveChartView : public QChartView {Q_OBJECTpublic:FitCurveChartView(QWidget *…

MySQL 8.x 自签证书通过keytool和openssl转成JKS文件

一、写在前面 数据库MySQL 8.0 通过自签命令在datadir下生成了所有的证书文件。由于Java的JDK不支持直接加载PEM格式的证书&#xff0c;所以需要将PEM格式证书转换成Java能够直接加载的JKS格式证书。我们需要将根证书ca.pem转换成JKS格式的根证书truststore.jks&#xff0c;将…

把 Windows 11 装进移动硬盘:Windows 11 To Go

本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统&#xff0c;将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。 写在前面 在《开源的全能维护 U 盘工具&#xff1a;Ventoy》这篇文章的最后&#xff0c;我提到了一个关键词 “WinToG…

Mybatis XML 配置文件

我们刚开始就有说Mybatis 的开发有两种方式: 1.注释 2.XML 注解和 XML 的方式是可以共存的 我们前面说的都是注释的方式,接下来是XML方式 XML的方式分为三步 : 1.配置数据库(配在 application.yml 里面) 这个跟注释的配置是一样的,username应该都是一样的,password记得写…

6.Eclipse里下载Subclipse插件

方法一&#xff1a;从Eclipse Marketplace里面下载 具体操作&#xff1a;打开Eclipse --> Help --> Eclipse Marketplace --> 在Find中输入subclipse搜索 --> 找到subclipse点击install 方法二&#xff1a;从Install New Software里下载 具体操作&#xff1a;打开…

OSPF浅析

一、预习&#xff1a; 1、优点&#xff1a; 是一种典型的链路状态路由协议&#xff0c;协议号89&#xff0c;把大型网络分隔为多个较小、可管理的单元&#xff1a;Area a.减少LSA泛洪范围&#xff0c;有效地把拓朴变化 控制在区域内&#xff0c;达到网络优化的目的…

nodejs微信小程序+python+PHP本科生优秀作业交流网站的设计与实现-计算机毕业设计推荐

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将本科生优秀作业交流网站功能模块主要分为管理员模块。管理员添加系统首页、个人中心、用户管理、作业分类管理、作业分享管理、论坛交流、投诉举报、系统管理等操作。 随着信息化社会的形成…

【面试HOT200】二叉树的构建二叉搜索树篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

Leetcode 77 组合

题意理解&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 如&#xff1a;n3,k2,则有&#xff1a;12 13 23 一般&#xff0c;我们使用回溯法来解决组合问题。 组合问题没有顺序要求&#xff0c;所以 12 21 是同一个组合&#xff08;如…