1.统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)
2.使用Qt编译Mqtt记录
3.windows下paho.mqtt安装教程(C/C++)
4.Windows QT6 MQTT开发
5.浅谈mqtt源码(二)Client详解
统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)
MQTT协议介绍
MQTT(Message Queuing Telemetry Transport,源码消息队列遥测传输协议)是编译基于发布/订阅模式的轻量级通讯协议,由IBM于年发布。源码其最大优点在于,编译能以极少的源码代码和有限的带宽,为连接远程设备提供实时可靠的编译源码博途消息服务。MQTT广泛应用于物联网、源码小型设备、编译移动应用等领域。源码
MQTT设计原则
MQTT具有以下特点:
1. 使用发布/订阅模式,编译实现一对多的源码消息发布,解除应用程序耦合。编译
2. 提供对负载内容的源码屏蔽,进行消息传输。编译
3. 使用TCP/IP提供网络连接。源码
4. 支持三种消息发布服务质量。
5. 具有小型传输、开销小的特性,协议交换最小化。
6. 为客户端异常中断提供机制。
发布/订阅者模式
MQTT支持发布/订阅模式,使MQTT协议在物联网、机器与机器(M2M)通信、智能家居等领域得到广泛应用。iconfont项目源码
统信UOS系统MQTT编译与环境搭建
统信UOS系统版本:系统版本为统信UOS 。
Qt编译MQTT
Qt5版本开始支持MQTT,但并未集成至安装包,需自行下载编译。Qt提供的qtmqtt库不支持点对点方式,仅支持订阅/发布者模式。
编译步骤
下载并解压MQTT源码至目标系统。
使用QtQCreator打开pro工程编译,切换至release模式。
在解压的源码路径手动创建Qt5Mqtt文件,编译成功。
部署MQTT模块至qt
将MQTT源码融入qt工程中,实现模块化部署。新建mqttClientDemo工程,提取源码中的mqtt模块,将其加入新工程的modules,引入qmqtt.pri文件。
解决编译报错
编译报错时,添加缺失的网络模块(QT += network),并调整私有头文件宏至头文件宏。
源码融入编译成功
源码成功融入,后续无需重新编译即可替换系统或版本。
模块化部署优化
创建mqttClientManager管理模块,centos源码搜寻用于包含MQTT源码,实现模块化部署。
使用Qt编译Mqtt记录
为适应工作需求,我选择使用Qt进行MQTT开发。感谢网络上的分享者,以下内容是对我的开发记录。
我使用的Qt版本为5..,操作平台为Windows 。开发路径设置为D:\qt_install\5..\msvc_,与mingw环境相似。
在GitHub上下载对应Qt版本的MQTT源代码。选择与安装Qt版本相匹配的代码。
执行 "git clone 地址 -b 分支" 命令,例如“git clone github.com/qt/qtmqtt.gi... -b 5..”,完成代码下载到本地。
在生成的影子目录中,如build-qtmqtt-Desktop_Qt_5__MSVC_bit-Release,配置已完成。
新建Qt项目并测试MQTT模块。若仅配置了msvc版本的MQTT,项目中亦只能使用msvc编译套件。在项目pro文件中直接添加MQTT模块。
一个简单的web源码论坛客户端示例可用于验证MQTT配置。
我使用的是EMQX作为broker。下载链接如下:
以下为部分技术文档和端口信息,提供参考:
windows下paho.mqtt安装教程(C/C++)
(1)Github仓库地址:
C库:
C++库:
(2)Visual Studio (社区版即可)
(3)CMake
选择最新版本的Installer即可:
安装过程比较简单,一路next,注意把CMake加到系统路径里即可:
2、编译C库
这里的主要步骤均来自于仓库的readme。
首先clone源码到本地文件夹,例如MQTT\paho.mqtt.c ,它包含几个文件夹:
然后打开CMake客户端,需要依次完成以下步骤:
(1)选择源代码路径,也就是source code:
这个路径就是上面clone的路径。
(2)选择输出路径,CMake会将生成的vs工程保存在这个路径下,这里为了方便,可以直接在源码路径下新建一个文件夹,例如build:
(3)配置configure,点开后如下:
第一个是选择VS的版本,一般选择比较高的即可,这里是。然后选择输出平台,可根据情况选择x或win。这里没有特殊参数,就可以忽略Optional toolset...,诱惑充值+源码然后选择下面的工具链为跨平台:
整体的选择如下:
然后点击Next,选择cmke文件夹下的toolchain:
这里根据前面选择的输出平台选择win或者,然后点击完成。
CMake界面如下,显示配置完成:
然后可以看到一大片红色区域,它是CMake的编译选项,这里主要关注一下PAHO即可,点击展开后,有如下选项:
这些选项都很好理解,可以看仓库的介绍,这里截取一部分如下:
这里注意,选择的PAHO_BUILD_SHARED或者 PAHO_BUILD_STATIC最好是和后面编译C++版本的选项要一致。我这里选择SHARED。
这里要注意一点,记住这个路径,后面编译C++库会用到:
(4)点击生成(Generate),产生VS工程目录,位置在第(2)步选择的那个路径。
然后就可以通过VS编译了,完成后,可以看到
这些是编译C++库需要的一些文件。
最后一步:安装生成的这些库文件,方便后续编译C++库文件。
首先在源码路径打开命令行窗口或者powershell,输入如下命令,并执行:
这一步的意义是把编译出的文件安装到指定的目录,这个目录就是第(3)步末尾提示的那个CMAKE_INSTALL_PREFIX路径,后面编译C++库文件时会用到,当然也可以在CMake中指定别的目录,如果默认的这个目录需要管理员权限才能创建,可以选择一个普通的目录(当然也可以管理员权限运行这条命令)。
这个目录下的文件如图:
后面会用到\lib\cmake\eclipse-paho-mqtt-c路径下的几个文件。
3、编译C++库
同样先把源码clone下来,然后打开CMake,按照上面编译C库的方式设置那些选项,但不需要设置工具链,直接默认即可。
点击完成后会报错:
原因是没找到eclipse-paho-mqtt-c,它就是刚刚要设置的C库安装目录,找到设置这个路径的CMake的选项如下,填上C库的安装目录:
然后重新配置,就成功了。
下一步点击生成,会报新的错误:
原因是CMakeList里行报错:
这里是要编译静态库版本,这与C库生成的不符合,直接把这个if编译选项去掉即可。
再次尝试又会报错:
原因是CMakeList选择的是security版本,这里在git仓库也有描述:
所以,我们看C库的安装目录下是哪个,就把CMakeList里替换掉:
将eclipse-paho-mqtt-c::paho-mqtt3as替换为eclipse-paho-mqtt-c::paho-mqtt3a 就大功告成,点击生成,就全部完成了,打开生成的VS工程,编译。
整个过程要注意的是:C库的编译选项和C++库的编译选项最好保持一致。
Windows QT6 MQTT开发
为了在Windows上使用QT6进行MQTT开发,首先需要了解MQTT Broker,一种广泛应用于物联网和边缘计算领域的消息传输协议。NanoMQ是特别为边缘计算设计的MQTT消息引擎,支持MQTT协议和Nanomsg等边缘计算常用的消息总线协议。
获取NanoMQ,可以访问其官网下载免费试用版本。在使用NanoMQ时,请确保选择与你的QT版本匹配的分支进行编译。
QT提供了基于MQTT的封装库,可通过GitHub访问并选择与你的QT版本相对应的分支进行下载和编译。将编译后的动态库和qtmqtt 6.6.1源码下的h文件放入你的工程目录中指定的位置。
链接动态库,例如在Cmake工程中,CmakeList.txt中应添加相关链接指令。参考qtmqtt 6.6.1源码下的example文件,可以快速上手MQTT库的基础使用。
以上步骤涵盖了从选择合适的MQTT Broker到集成QT进行MQTT开发的关键步骤,通过实践这些步骤,你将能够顺利地在Windows平台上使用QT进行MQTT客户端的开发。
浅谈mqtt源码(二)Client详解
深入探索MQTT源码:客户端剖析
启动MQTT客户端程序时,一般有三个关键模块:Client、Connect、Store。判断程序是否由Node.js直接执行用require.main === module。
在客户端模块中,核心是封装一个MQTT客户端实例。实例底层通过pipe建立管道连接,此管道用于传输数据。
当有数据写入流中,即触发_write方法,消息队列packets中的消息开始被处理。如果队列还有消息,会执行_handlePacket和nextTickWork。nextTickWork通过process.nextTick确保数据不会丢失,使得连接保持活跃。
消息队列的数据不丢失的关键在于process.nextTick机制。
MQTT客户端实例继承了events.EventEmitter方法,所有的异步操作完成后,会发送事件到事件队列,用于后续事件处理。
客户端的基本操作如连接、订阅主题、发送与接收消息,具体如下:
订阅主题时,会调用subscribe方法,该方法先验证topic格式,构造packet并发送至服务器。订阅完成后,会调用回调函数,告知已成功订阅。
发送消息使用publish方法,构造packet,包含主题和消息内容,通过_storePacket或_sendPacket发送。
接收消息时,通过emit和message方法将数据传递给业务代码。数据为buffer数组,需进行序列化处理。
在_sendPacket方法中,使用mqtt-packet生成可传输的buffer,并将packet写入client的stream。stream是初始化MQTT客户端实例时传入的对象,通常包含WebSocket等相关方法。
客户端内部还包含了unsubscribe、resubscribe及end方法,用于取消订阅、重新订阅及断开连接,具体细节不在本文深入讨论。
总体而言,MQTT客户端的实现涉及Node.js的多个知识点,包括异步操作、事件监听、流处理等,构建了一个高效、灵活的消息传输框架。