我可能是最懒的半吊子程序员博主了,从过年到现在,将近2个月了,没发过一篇文章,但公众号每天都有新增的兄弟姐妹关注,非常感谢大家的信任,我呢,就做好自己的事情,该干嘛干嘛,文章嘛,偶尔抽空写一下发一发,相对于写文章,我更喜欢看书和写代码呢,我每天都有写代码的,这不,今天给大家带来一份商业级稳定性的代码——mqttclient。
02关于mqttclient的诞生谈谈这份代码的诞生缘由吧!从上一年的5月份左右吧,我花了一个多星期去移植阿里的SDK,想要将它用起来,但是奈何一直没能用成功,归根结底我还是太菜了,10月份分析完了腾讯的SDK中的MQTT协议部分的代码,我就想自己写一个好用的代码,要非常简单API接口,还要有很好的稳定性,然后嘛,也是为开源做贡献,希望有缘人能简单快速用起来,都说程序员有些奇奇怪怪的理想,且不说改变世界吧,像我这种,我是很希望某些产品中能跑着我写的代码,即使我无缘知道甚至遇见它。。。
兜兜转转,从11月份开始设计框架,LwIP的源码与阿里的SDK框架给了我很大的影响,所以整体的设计框架都采用分层设计,此外腾讯的SDK呢让我决定了使用异步处理的思想来设计整个代码,然后设计完整体框架之后就愉快地板砖了,没错,是愉快地!写代码其实是很好玩的事情,特别是当年的想法可以实现的时候,遇到不懂的时候有资料,有人讨论,在此特别感谢几位网上的好基友,在大半夜的还与我讨论,解答我的问题~非常nice。
03介绍一下mqttclient这一个基于socket API之上的跨平台MQTT客户端,拥有非常简洁的API接口,以极少的资源实现QOS2的服务质量,并且无缝衔接了mbedtls加密库。
04谈谈优势基于标准BSD socket之上开发,只要是兼容BSD socket的系统均可使用。
稳定:无论是
掉线重连
,丢包重发
,都是严格遵循MQTT协议标准
执行,除此之外对大数据量的测试无论是收是发,都是非常稳定(一次发送135K
数据,3秒一次),高频测试也是非常稳定(7个主题同时收发,每秒一次,也就是1秒14个mqtt报文,服务质量QoS0、QoS1、QoS2都有)。因为作者以极少的资源设计了记录机制
,对采用QoS1服务质量的报文必须保证到达一次,当发布的主题(qos1、qos2都适用)没有被服务器收到时会自动重发,而对QoS2服务质量的报文保证有且只有处理一次(如果不相信它稳定性的同学可以自己去修改源码,专门为QoS2服务质量去做测试,故意不回复PUBREC
包,让服务器重发QoS2报文,且看看客户端是否有且只有处理一次),而对于掉线重连的稳定性,这种则是基本操作了,没啥好说的,在自动重连后还会自动重新订阅主题,保证主题不会丢失,因此在测试中稳定性极好。轻量级:整个代码工程极其简单,不使用mbedtls情况下,占用资源极少,作者曾使用esp8266模组与云端通信,整个工程代码消耗的RAM不足15k(包括系统占用的开销,对数据的处理开销,而此次还是未优化的情况下,还依旧完美保留了掉线重连的稳定性,但是对应qos1、qos2服务质量的报文则未做测试,因为STM32F103C8T6芯片资源实在是太少了,折腾不起)。
无缝衔接mbedtls加密传输,让网络传输更加安全,而且接口层完全不需要用户理会,无论是否加密,mqttclient对用户提供的API接口是没有变化的,这就很好的兼容了一套代应用层的码可以加密传输也可以不加密传输。
拥有极简的API接口,总的来说,mqttclient的配置都有默认值,基本无需配置都能使用的,也可以随意配置,对配置都有健壮性检测,这样子设计的API接口也是非常简单。
有非常好的代码风格与思想:整个代码采用分层式设计,代码实现采用异步处理的思想,降低耦合,提高性能,具体体现在什么地方呢?很简单,目前市面上很多MQTT客户端发布主题都是要阻塞等待ack,这是非常暴力的行为,阻塞当前线程等待服务器的应答,那如果我想要发送数据怎么办,或者我要重复检测数据怎么办,你可能会说,指定阻塞时间等待,那如果网络延迟,ack迟迟不来,我就白等了吗,对于qos1、qos2的服务质量怎么办,所以说这种还是要异步处理的思想,我发布主题,那我发布出去就好了,不需要等待,对于qos1、qos2服务质量的MQTT报文,如果服务器没收到,那我重发就可以,这种重发也是异步的处理,完全不会阻塞当前线程。
MQTT协议支持主题通配符
“#”、“+”
。订阅的主题与消息处理完全分离,让编程逻辑更加简单易用,用户无需理会错综复杂的逻辑关系。
mqttclient内部已实现保活处理机制,无需用户过多关心理会,用户只需专心处理应用功能即可。
无缝衔接salof:它是一个同步异步日志输出框架,在空闲时候输出对应的日志信息,也可以将信息写入flash中保存,方便调试。
不对外产生依赖。
拥有非常明确的分层框架。
06mqttclient适配的平台目前已实现了Linux、TencentOS tiny、RT-Thread平台(已做成软件包,这个名字比较骚气,叫kawaii-mqtt(卡哇伊ღ( ´・ᴗ・` ))),除此之外TencentOS tiny的AT框架亦可以使用(RAM消耗不足15K),并且稳定性极好!欢迎下载并且测试。
平台 | 代码位置 |
Linux | https://github.com/jiejieTop/mqttclient |
TencentOS tiny | https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429 |
TencentOS tiny AT 框架 | https://github.com/jiejieTop/gokit3-board-mqttclient |
RT-Thread | https://github.com/jiejieTop/kawaii-mqtt |
1. 安装cmake
sudo apt-get install cmake
2. 配置连接参数
在mqttclient/test/test.c
文件中修改以下内容:
init_params.connect_params.network_params.network_ssl_params.ca_crt = test_ca_get(); /* CA证书 */
init_params.connect_params.network_params.addr = "xxxxxxx"; /* 服务器域名 */
init_params.connect_params.network_params.port = "8883"; /* 服务器端口号 */
init_params.connect_params