中文说明
高性能、高稳定性、跨平台的MQTT客户端
一款高性能、高稳定性、跨平台的MQTT客户端,基于socket API开发,可用于嵌入式设备(FreeRTOS/LiteOS/RT-Thread/TencentOS tiny)、Linux、Windows、Mac,具有非常简洁的API接口用很少的资源实现了QOS2的服务质量,并且无缝连接mbedtls加密库。
极高的稳定性:无论是掉线重连、丢包重传,都严格遵守MQTT协议标准,此外大数据量的测试无论是接收还是发送都非常稳定,高频测试也很稳定。
轻量级:整个代码项目极其简单。没有mbedtls,占用的资源很少。作者使用esp8266模块与云端通信。整个项目代码消耗的 RAM 不到 15k。
支持mbedtls加密传输,让网络传输更加安全,而且接口层不需要用户关心,无论是否加密,mqttclient都是固定为用户提供的API接口,非常兼容一套代表应用层的代码可以加密或不加密地传输。
支持多客户端,兼容多个客户端同时运行,一台设备连接多台服务器。
支持同步和异步处理,应用程序无需阻塞等待浪费CPU资源。
支持拦截器配置,在某些平台上,客户端默认会自动订阅系统主题,每次来自服务端的主题都会发生变化。这种情况下就需要使用拦截器来拦截分离主题和数据信息并传递给用户,大大提高灵活性。
使用在线代码生成工具,只需极其简单的配置即可生成代码,地址:https://jiejietop.gitee.io/mqtt/index.html
拥有非常简单的API接口,一般来说,mqttclient配置都有默认值,基本上不用配置就可以使用,也可以任意配置,配置有鲁棒性检测,所以设计的API接口也非常简单。
多功能参数可配置定制,重连时间间隔、心跳周期、最大订阅数、命令超时、读写缓冲区大小、拦截器处理等。参数可定制可配置,满足开发者复杂又简单的需求在各种开发环境中使用。
支持自动重新订阅主题,自动重连后保证主题不会丢失。
支持主题通配符 ""#", "+"` 。
订阅主题与消息处理完全分离,使得编程逻辑更加简单易用,用户不必处理错综复杂的逻辑关系。
mqttclient 中已经实现了保活处理机制,无需用户处理心理体验,用户只需专注于应用功能。
有非常好的设计,设计了占用很少资源的记录机制,在报文丢失时进行重传,保证qos1和qos2服务质量等级保证其服务质量。
有非常好的代码风格和思想:整个代码采用分层设计,代码实现采用异步处理的思想,减少耦合,提高性能。
在标准BSD套接字之上开发,只要兼容BSD套接字系统即可。
salof的无缝连接:是一个同步异步日志输出框架。空闲时输出相应的日志信息,也可以将信息写入flash保存,方便调试。
使用著名的paho mqtt库包。
没有其他依赖性。
本项目有一个代码生成工具,只需要在线配置即可生成代码,极其简单易用。代码生成工具地址为:https://jiejietop.gitee.io/mqtt/index.html
ROM总共10857字节,而RAM的开销几乎只依赖于动态内存。在不使用TLS加密传输的情况下,维持QOS0服务质量级别的通信动态内存仅需要约3694字节。包括1024个读缓冲区+1024个写缓冲区+1024个内部线程堆栈大小,与其他MQTT客户端相比,mqttclient需要很少的RAM资源开销。
代码 | 反渗透数据 | 读写数据 | ZI数据 | 对象名称 |
---|---|---|---|---|
7118 | 第791章 | 0 | 0 | mqttclient.o |
第546章 | 0 | 0 | 0 | mqttconnectclient.o |
212 | 0 | 0 | 0 | mqttdeserializepublish.o |
第476章 | 0 | 4 | 0 | mqttpacket.o |
236 | 0 | 0 | 0 | mqttserializepublish.o |
310 | 0 | 0 | 0 | mqttsubscribeclient.o |
38 | 0 | 0 | 0 | mqttunsubscribeclient.o |
56 | 0 | 0 | 0 | 网络类型_tcp.o |
62 | 0 | 0 | 0 | 网络.o |
24 | 0 | 0 | 0 | 平台内存.o |
40 | 0 | 0 | 0 | platform_mutex.o |
第344章 | 0 | 0 | 0 | platform_net_socket.o |
94 | 0 | 0 | 0 | 平台线程.o |
70 | 0 | 0 | 0 | platform_timer.o |
246 | 0 | 4 | 0 | 随机.o |
62 | 0 | 0 | 0 | mqtt_list.o |
- | - | - | - | - |
10066 | 第791章 | 8 | 0 | 全部的 |
具有非常清晰的层次框架。
框架最顶层是API函数接口,实现了客户端的申请、发布、设置参数、连接服务器、断开连接、订阅主题、取消订阅主题、发布消息等功能接口。
MQTT消息包库采用著名的paho mqtt库。
使用异步处理机制来管理所有的ack。它发送消息时不需要等待服务器的响应,而只是记录下来。收到服务器的ack后,取消这条记录,效率很高;而当发送mqtt消息(QoS1/QoS2)后没有收到服务器的响应时,消息将会重传。
内部实现了一个mqtt的yield线程,统一处理所有的内容,比如超时处理、ack消息处理、接收服务器发来的publish消息,这时候会调用回调函数通知用户收到的数据, *发布后、完成后消息处理、心跳消息(保活)、与服务器断开连接时,需要尝试重新连接、重新订阅主题、重新发送消息或回复* 等。
消息处理,如读写消息、解码mqtt消息、设置消息(dup flag)、销毁消息等操作。
network是网络组件,可以自动选择数据通道,如果是加密方式,则采用tls加密进行数据传输,tls可以选择mbedtls作为加密后端;也可以是tcp直连方式,最终通过tcp传输。
platform是平台抽象层,封装了来自不同系统的东西,比如socke或者AT、线程、时间、互斥、内存管理**,这些都是和系统打交道的,也是跨平台所必需的封装。
最右边是一般内容,列表处理、日志库、错误处理、软件随机数生成器等。
目前已经实现了Linux、TencentOStiny、FreeRTOS、RT-Thread平台(软件包名为kawaii-mqtt`),另外也可以使用TencentOStinyAT框架,稳定性极佳!
平台 | 代码位置 |
---|---|
Linux | https://github.com/jiejieTop/mqttclient |
腾讯OS小 | https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429 |
TangenOS Tiny AT 框架 | https://github.com/jiejieTop/gokit3-board-mqttclient |
RT-线程 | https://github.com/jiejieTop/kawaii-mqtt |
自由实时操作系统 | https://github.com/jiejieTop/freertos-mqttclient |
发布版本 | 描述 |
---|---|
[v1.0.0] | 首次发布,完成基础框架及稳定性验证 |
[v1.0.1] | 修复主动断开服务器连接时的逻辑处理 |
[v1.0.2] | 添加新功能拦截器,修复一些小bug |
[v1.0.3] | 避免全局污染,修改log和list相关函数的命名 |
[v1.0.4] | 网络结构和mbedtls数据通道重新调整 |
[v1.1.0] | 较大版本更新,重构部分代码,优化MQTT处理逻辑,提高整体稳定性,支持多客户端,支持设置遗嘱,优化API接口,添加多个云平台测试代码和文档,添加在线代码生成工具、在线切割配置工具 |
欢迎以 GitHub Issues 的形式提交问题和 bug 报告
mqttclient遵循Apache License v2.0开源协议。鼓励代码共享,尊重原作者的版权。您可以自由使用和修改源代码,也可以将修改后的代码发布为开源或闭源软件。
sudo apt-get install cmake g++
测试平台 | 地点 |
---|---|
emqx(我的私人部署的服务器) | ./test/emqx/test.c |
百度天工 | ./test/baidu/test.c |
统一网 | ./test/onenet/test.c |
阿里云物联网 | ./test/ali/test.c |
./build.sh
运行build.sh脚本后,会在./build/bin/目录下生成emqx 、 baidu 、 onenet等平台的可执行文件,可直接运行可执行程序。
./build/bin/emqx
./make-libmqttclient.sh
运行make-libmqttclient.sh
脚本后,会在./libmqttclient/lib
目录下生成动态库文件libmqttclient.so
,并安装到系统的/usr/lib
目录下,相关头文件已拷贝到./libmqttclient.so目录下./libmqttclient/include
目录并将其复制到您的项目。您只需在编译应用程序时链接动态库即可。 -lmqttclient -lpthread
,动态库的配置文件基于./test/mqtt_config.h
配置。
如果使用交叉编译器,则应根据所使用的编译器导出相应的环境变量(这里使用的交叉编译器为arm-linux-gnueabihf-gcc),同时还必须设置动态库文件libmqttclient .so
被复制到嵌入式系统的/usr/lib
目录:
export CROSS_COMPILE=arm-linux-gnueabihf-
如果需要卸载libmqttclient.so ,执行以下命令:
./make-libmqttclient.sh remove
请参阅文档:
MQTT协议介绍
MQTT协议通信流程
mqtt客户端代码生成工具
mqttclient配置及切割工具
mqtt客户端设计与实现
mqttclient连接百度天工五访问
mqttclient连接OneNET云平台
mqttclient连接阿里云IoT平台