kawaii-mqtt的 v1.1.0版本发布

发布于 2020-06-18 21:12:05
    本帖最后由 杰杰 于 2020-6-18 21:15 编辑



[md]

> 轻轻吐槽一下,本来不想开新帖的,但是居然发现改不了原来的帖子,实在是太难受了。。。。

# kawaii-mqtt

**一个高性能、高稳定性的跨平台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资源。

- **支持拦截器配置**,在某些平台中,客户端会默认自动订阅系统主题,而且每次来自服务器的主题都是变动的,此时需要使用拦截器进行拦截,分离主题与数据信息,并递交给用户,极大提高灵活性。

- **拥有在线代码生成工具**,极其简单配置就可以生成对应的代码,地址:[]()

- **拥有极简的API接口**,总的来说,mqttclient的配置都有默认值,基本无需配置都能使用的,也可以随意配置,对配置都有健壮性检测,这样子设计的API接口也是非常简单。

- **多功能参数可配置可裁剪**,重连时间间隔、心跳周期、最大订阅数量、命令超时、读写缓冲区大小、拦截器处理等等参数功能可裁剪可配置,满足开发者再复杂、简单等各种开发环境下的使用需求。

- **支持自动重新订阅主题**,在自动重连后保证主题不会丢失。

- **支持主题通配符`“#”、“+”`**。

- **订阅的主题与消息处理完全分离**,让编程逻辑更加简单易用,用户无需理会错综复杂的逻辑关系。

- **mqttclient内部已实现保活处理机制**,无需用户过多关心理会,用户只需专心处理应用功能即可。

- **拥有非常好的设计**,以极少的资源设计了**记录机制**,当报文在丢失的时候进行重发操作,确保qos1、qos2服务质量等级的报文保证其服务质量。

- **有非常好的代码风格与思想**:整个代码采用分层式设计,代码实现采用异步处理的思想,降低耦合,提高性能。

- **基于标准BSD socket之上开发**,只要是兼容BSD socket的系统均可使用。

- **无缝衔接salof**:它是一个同步异步日志输出框架,在空闲时候输出对应的日志信息,也可以将信息写入flash中保存,方便调试。

- **使用著名的 paho mqtt 库封包**。

- **无其他依赖**。

## 在线代码生成工具

本项目拥有代码生成工具,只需要在线配置即可生成代码,极其简单易用,代码生成工具地址:[]()

![在线代码生成工具]()

## 占用资源大小

总计占 **10857字节** 的ROM,而RAM的开销则几乎只依赖动态内存,在不使用TLS加密传输的情况下,维持QOS0服务质量等级的通信动态内存大约仅需要**3694**字节,这包括1024读缓冲区 + 1024写缓冲区 + 1024内部线程栈大小,相对于其他MQTT客户端来说,mqttclient需要的RAM资源开销极少。

| Code | RO Data | RW Data | ZI Data | Object Name |
| -- | -- | -- | -- | -- |
| 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 | nettype_tcp.o |
| 62 | 0 | 0 | 0 | network.o |
| 24 | 0 | 0 | 0 | platform_memory.o |
| 40 | 0 | 0 | 0 | platform_mutex.o |
| 344 | 0 | 0 | 0 | platform_net_socket.o |
| 94 | 0 | 0 | 0 | platform_thread.o |
| 70 | 0 | 0 | 0 | platform_timer.o |
| 246 | 0 | 4 | 0 | random.o |
| 62 | 0 | 0 | 0 | mqtt_list.o |
| - | - | - | - | - |
| 10066 | 791 | 8 | 0 | total |

## 整体框架

拥有非常明确的分层框架。

![整体框架]()

- 在框架的最上方是**API**函数接口,实现了客户端的**申请、释放、设置参数、连接服务器、断开连接、订阅主题、取消订阅主题、发布消息**等函数接口。

- 使用了著名的**paho mqtt**库作为MQTT报文封包库。

- 采用异步处理的机制去管理所有的ack,它在发送报文的时候不用等待服务器的应答,只是记录下来,在收到服务器的ack后,取消这个记录,**效率极高**;而在发送mqtt报文(QoS1/QoS2)的时候没有收到服务器的应答时,将**重发**该报文。

- 内部实现了一个**mqtt yield**线程,统一处理所有的内容,比如**超时的处理、ack报文的处理、收到来自服务器的publish报文**,此时会去调用回调函数告知用户收到的数据,**发布释放、发布完成报文的处理、心跳报文(保持活性),当与服务器断开连接时需要尝试重连、重新订阅主题,重新发送报文或者应答**等。

- 报文的处理,如**读写报文、解码mqtt报文、设置报文(dup标记)、销毁报文**等操作。

- **network**是网络组件,它可以**自动选择数据通道**,如果是加密方式则通过**tls加密**进行数据传输,而tls可以选择mbedtls作为加密后端;也可以是**tcp直连**方式,最终都是通过tcp传输的。

- **platform**是平台抽象层,封装了不同系统的东西,比如**socke或者AT,线程、时间、互斥锁、内存管理**,这些是与系统打交道的,也是跨平台必要的封装。

- 最右边的则是通用的内容,**list的处理、日志库、错误处理、软件随机数发生器**等。

## 支持的平台

**目前已实现了Linux、TencentOS tiny、FreeRTOS、RT-Thread平台(已做成软件包,名字为`kawaii-mqtt`),除此之外TencentOS tiny的AT框架亦可以使用,并且稳定性极好!**

| 平台 | 代码位置 |
| -------------- | -------- |
| Linux | [https://github.com/jiejieTop/mqttclient](https://github.com/jiejieTop/mqttclient) |
| TencentOS tiny | [https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429](https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429) |
| TencentOS tiny AT 框架 | [https://github.com/jiejieTop/gokit3-board-mqttclient](https://github.com/jiejieTop/gokit3-board-mqttclient) |
| RT-Thread | [https://github.com/jiejieTop/kawaii-mqtt](https://github.com/jiejieTop/kawaii-mqtt) |
| FreeRTOS | [https://github.com/jiejieTop/freertos-mqttclient](https://github.com/jiejieTop/freertos-mqttclient) |


## 版本

| 发布版本 | 描述 |
| --- | --- |
| [v1.0.0] | 初次发布,完成基本框架及其稳定性验证 |
| [v1.0.1] | 修复主动与服务器断开连接时的逻辑处理 |
| [v1.0.2] | 添加新特性——拦截器,修复一些小bug |
| [v1.0.3] | 避免造成全局污染修改了log、list相关函数的命名 |
| [v1.0.4] | 重新调整了network结构与mbedtls数据通道 |
| [v1.1.0] | 一个较大版本的更新,重构部分代码,优化MQTT处理的逻辑,提升整体的稳定性,支持多客户端,支持设置遗嘱,优化API接口,增加多个云平台的测试代码与说明文档,增加在线代码生成工具、在线裁剪配置工具 |

## 问题

欢迎以 [GitHub Issues](https://github.com/jiejieTop/mqttclient/issues) 的形式提交问题和bug报告

## 版权和许可

mqttclient 遵循 [Apache License v2.0](https://github.com/jiejieTop/mqttclient/blob/master/LICENSE) 开源协议。鼓励代码共享和尊重原作者的著作权,可以自由的使用、修改源代码,也可以将修改后的代码作为开源或闭源软件发布。

### 测试程序

| 测试平台 | 位置 |
| -- | -- |
| emqx(我私人部署的服务器) | [https://github.com/jiejieTop/mqttclient/blob/master//test/emqx/test.c](https://github.com/jiejieTop/mqttclient/blob/master//test/emqx/test.c) |
| 百度天工 | [https://github.com/jiejieTop/mqttclient/blob/master//test/baidu/test.c](https://github.com/jiejieTop/mqttclient/blob/master//test/baidu/test.c) |
| onenet | [https://github.com/jiejieTop/mqttclient/blob/master//test/onenet/test.c](https://github.com/jiejieTop/mqttclient/blob/master//test/onenet/test.c) |
| 阿里云物联 | [https://github.com/jiejieTop/mqttclient/blob/master//test/ali/test.c](https://github.com/jiejieTop/mqttclient/blob/master//test/ali/test.c) |

## 学习更多

请看文档:

- [MQTT协议简介](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-introduction.md)

- [MQTT协议通信过程](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-communication.md)

- [mqttclient代码生成工具](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-tool.md)

- [mqttclient配置及裁剪工具](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-config.md)

- [mqttclient设计与实现方式](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-design.md)

- [mqttclient连接到百度天工物接入](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-baidu.md)

- [mqttclient连接到OneNET云平台](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-onenet.md)

- [mqttclient连接到阿里云物联网平台](https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-aliyun.md)

[/md]

查看更多

关注者
0
被浏览
605
20 个回答
fhqmcu
fhqmcu 认证专家 2020-06-30
目前mqtt协议,已经发现并且解决7处bug, 并且解决完成,初步测试稳定工作。正在进行长时间的稳定性测试,有需要的朋友可以与我联系,提供修改后的代码一起验证测试。待测试稳定后,提交给pr给杰杰。

1、platform_thread.c函数中的创建线程,删除线程的方式存在使用已经释放的内存的问题,修改platform_thread_init函数内部采用rt_thread_creat方式创建 ,线程释放时调用的platform_thread_destroy函数置空线程指针就可以了, 已经修改

2、mqtt_send_packet函数内部已经对timer变量进行了初始化和操作,把timer变量内置为此函数的局部变量,相关外部调用不用初始化, 有一个个例的地方:mqtt_connect_with_results函数的第1005 1008行发送包和接收包函数都会使用同一个connect_timer,这里要求此变量外置。 已经修改

3、platform_timer_init(&timer);
platform_timer_cutdown(&timer, c->mqtt_cmd_timeout);这两个函数都是对同一变量进行赋值,建议去除第一个函数,已经修改,删除第一个函数 已经修改

4、mqtt_connect_with_results,内部申请的发送与接收缓冲区放到mqtt_lease函数中进行。解决多次重新连接导致的内存泄漏
连接失败时,不执行释放platform_memory_free(c->mqtt_network),方便下次接着使用。
1025行启动函数只执行一次就可以,删除下和行的。
增加创建线程失败的打印,位于1031行,同时断开链接 已经修改完成

5、ack list链表的写入访问采用c->mqtt_write_lock信号量来进行保护, mqtt_publish_packet_handle函数中的调用mqtt_ack_list_record未进行保护?已解决

6、mqtt_ack_list_unrecord函数对链表的操作没有被c->mqtt_write_lock进行保护?这是为什么 已解决

7、mqtt连接断开再重连时,出现内存耗用增加64字节-128字节不等的情况。这时由于断开重新连接网络后mqtt_subscribe函数重新订阅,申请的内存导致的,这里的链表的处理导致内存泄漏了。 已解决。
Hubert_Xie
Hubert_Xie 2020-06-18
和 umqtt 对比,优缺点是什么?
jerry4cool
jerry4cool 2020-06-19
感谢分享。。。。
杰杰
杰杰 2020-06-19
Hubert_Xie 发表于 2020-6-18 22:53
和 umqtt 对比,优缺点是什么?


为什么一定要比较勒,喜欢哪个用哪个嘛~rtt最起码是官方维护的,万一我回家开小卖部不在继续维护也是有可能的:lol
springcity
springcity 2020-06-20
杰杰 发表于 2020-6-19 16:10
umqtt牛逼一点哈哈哈


杰神谦虚了,向杰神多多请教:lol
fhqmcu
fhqmcu 认证专家 2020-06-21
赞,最近正在研究你的mqtt,准备商用一把。
杰杰
杰杰 2020-06-21
fhqmcu 发表于 2020-6-21 21:23
赞,最近正在研究你的mqtt,准备商用一把。


:lol是我的荣幸啊哈哈哈哈哈
fhqmcu
fhqmcu 认证专家 2020-06-21
杰杰 发表于 2020-6-21 22:14
是我的荣幸啊哈哈哈哈哈


客气了,向你学习。我一般都是先把整个软件的包的机制代码弄明白再商用。目前刚看了遍MQTT协议,代码目前还没有看完,碰到大神在线直接问一下,软件包提供mqtt连接断开的状态回调函数或接口么?应用层时需要获取连接的状态来控制联网指示灯。
杰杰
杰杰 2020-06-21
fhqmcu 发表于 2020-6-21 22:32
客气了,向你学习。我一般都是先把整个软件的包的机制代码弄明白再商用。目前刚看了遍MQTT协议,代码目前 ...


每个函数都有返回值的,根据返回值做成判断即可,关于代码实现的机制,可以参考:https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-design.md
fhqmcu
fhqmcu 认证专家 2020-06-27
杰杰 发表于 2020-6-21 22:38
每个函数都有返回值的,根据返回值做成判断即可,关于代码实现的机制,可以参考:https://github.com/jie ...


杰杰,你好,这几天测试你的mqtt协议,初步发现2个问题,正在解决中...使用正点的F429,阿波罗开发板,使用网线连接以太网。1、内存耗尽问题:程序连接上onenet平台后,断开网线后,mqtt协议显示连接断开,并且进行重连,由于代码在发现网络断开后,只是进行网络的重新连接,并没有释放申请的内存资源,导致再次连接时还会新申请比如下图
fhqmcu
fhqmcu 认证专家 2020-06-27
2、 mqtt_yield_thread线程在重连网络时或其他异常的情况,不释放CPU时间,导致低优先级的任务没法运行。
目前我正在查看代码解决问题。 如果你有时间的话也看看代码是不是存在此问题?
fhqmcu
fhqmcu 认证专家 2020-06-27
图片上传不了呀,说明一下内存用尽的位置:mqtt_connect_with_results()函数在重连过程会多次调用,函数的952行会申请写读内存区,这样会导致不断的申请内存直接到内存耗尽。目前我正在仔细阅读你的代码逻辑,分析解决办法,我的微信:longtengweixin,如要详细了解情况可以加我微信。
fhqmcu
fhqmcu 认证专家 2020-07-02

新改版的社区,显示出来的帖子内容变少了,丢失了一部分呀。@管理员

fhqmcu
fhqmcu 认证专家 2020-07-02

@ andychen, 改版后,这个帖子中原来的内容显示不全了,少了一部分。

fhqmcu
fhqmcu 认证专家 2020-07-02

kawaii mqtt目前已经经过24小时的连续运行,联网稳定,并且之前发现的内存泄漏问题,没有再出现,内存使用十分稳定。最近正在编写测试软件,测试大数据量发送给mqtt设备的情形。应个别网友想测试mqtt协议的要求,我将近期发布修改后的mqtt软件包 github下载链接,请关注这个帐子或我的GitHub:https://github.com/longtengmcu

cychen
cychen 2020-07-13

连接成功后创建一个内部线程mqtt_yield_thread,并在合适的时候启动它 ?这里有个疑问 上电后假如网线没插上 过大概10S后 会反馈MQTT连接失败 这时候mqtt_yield_thread并不会启动,不启动那么等于重连功能用不上了 必须重新上电 所以mqtt_yield_thread是不是直接放while里面让他一直跑会好点 这样无论你何时接上网线他都还有机会去连接服务器

MIUZ_3615
MIUZ_3615 2020-08-16

刚接触MQTT 想一直到nano版本上,能不能价绍一下各个文件的作用,移植需要更改哪些文件哪些接口呢? 感谢

clarkkevin
clarkkevin 2020-09-07

能否商用呢?目前测试效果如何呢?

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友