| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> MQTT协议产品化实现-mosquitto开源产品(1) -> 正文阅读 |
|
[嵌入式]MQTT协议产品化实现-mosquitto开源产品(1) |
? ? ? ? 前面的mqtt协议是从标准协议的视角进行的分析,接下来的这几个小节将从开源项目(mosquitto)、物联网操作系统(鸿蒙、freertos、rt-thread)对mqtt协议的支持、商业化的HiveMQ项目,三类产品和解决方案的视角去审视一下这个协议是如何实现的。 2.2 mqtt协议实现-mosquitto开源产品 ? ? ? ? 为了更加深刻地理解mqtt协议的实现,从本小节开始将以一个开源项目为例,从代码现场去分析协议实现的细节,我们选择的开源项目是mosquitto。 ? ? ? ? mosquitto是eclipse的IOT开源项目,该项目主要是实现了broker的角色,支持mqtt协议5.0、3.1.1和3.1版本,非常适合用在低功耗的设备上,比如低功耗的传感器、移动设备如手机、嵌入式设备。除了支持broker以外,该项目也提供了mqtt的客户端c库,支持客户端的发布和订阅模式,详细的介绍请参看参考文献[7]。另外该项目除了实现协议本身外,还提供了相关的辅助功能模块,如数据库模块,安全模块等,在项目开发和移植时具有很大的参考价值。项目的代码可以从参考[8]中得到,当前最新的版本是2.0.12版,我们将以此版本为蓝本进行解读。 2.2.1 mosquitto系统架构 ? ? ? ? 在进行开源代码解读之前,首先要对代码的框架有个了解,即从宏观方面把握整个项目的结构,这样才不会陷入到代码细节中。为此笔者先去梳理了一下mosquitto的目录结构,并对目录结构的每一项按照其依赖关系做了如下图所示的分层结构。 ? ? ? ? ?从图中可以看出主要包括apps和核心协议栈两大块,其中最重要的是核心协议栈。apps处于顶层,本身依赖于核心协议栈,主要是面对应用界面,对外提供可裁剪的安全的mqtt协议。接下来的核心协议栈,主要是实现了整个的mqtt协议栈,并对外提供产品化服务,其内部又包含了三大块:基础的底层lib,产品化相关的src,客户端有关的client。这三者之间lib是src和client的基础。lib的主要功能是实现mqtt协议栈,跟标准协议实现相对应的,还包括一些基础的系统和网络管理功能,lib可以为broker和client提供业务支撑。src主要是在lib的基础上,对协议栈做了产品化和业务处理,同时也对外提供除协议栈以外的功能,比如数据处理,通信连接等,更加注重端到端的产品化应用,比如bridge产品,更多地承担broker的角色。client主要是对配置做解析,并提供订阅和发布两项基本配置,主要承担客户端角色。 ? ? ? ? 接下来进入到每一层(目录)的模块内部,从上图可以看到涉及更多细粒度的模块,还是一样的思路,分类整合模块,这样就可以简化细节,提取关键模块,对每一个层次的功能有更深刻的理解,如下图所示是笔者进一步整理后的架构图。 ? ? ? ? 上图中自上而下来看,客户端的功能比较简单,主要就是实现生产和消费数据,对应发布和订阅配置,常用在终端设备上。产品化层对应着src,这个模块主要用在broker侧的设备上,如bridge,包含了中间系统层、产品化协议层和产品配置界面,在内部自上而下依赖,在通信的过程中会对主题、链路状态、数据存储、安全做系统的管理,实现较为复杂。上述两个模块依赖于平台层,平台层分为平台协议和平台系统两层。平台系统层屏蔽了通信和系统的管理,并且提供了日志功能,平台协议层对基础的报文进行解析,管理着通信质量、协议栈等功能。通过这样的层次和模块关系可以很方便地对模块进行移植和裁剪。 ? ? ? ? 在上述模块的基础上,我们从发布/订阅的视角看一下数据流向。首先客户端发布主题,该发布信息会被平台层的报文解析模块进行封装,然后通过通信接口发布出去,过程中会对通信质量进行管理。作为broker端,即图中的产品化层在收到发布的主题后,会将topic存在数据库中,等待订阅者过来订阅,broker端还会实时检测链路状态、安全等。最后当另外一个客户端过来订阅主题时,同样由平台层的报文解析模块进行封装,然后发送订阅消息。这样就完成了一次完整的通信过程。 ? ? ? ? 通过这张图可以一目了然地看到数据流向以及所依赖地模块,也能非常清晰地看出在具体的产品实现场景,哪些模块需要移植到客户端,哪些模块需要移植到broker端。 未完待续... 参考文献: [3]商业化的mqtt组织HiveMQ Introduction :: HiveMQ Documentation [5]MQTT Security Fundamentals - How to use MQTT in a secure way (hivemq.com) [6]MQTT协议5.0中文版 | MQTT中文网 (p2hp.com) [8]Download | Eclipse Mosquitto ? ? ? ?? |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 15:39:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |