01
前言
我可能是最懒的半吊子程序员博主了 ,从过年到现在,将近2个月了,没发过一篇文章,但公众号每天都有新增的兄弟姐妹关注,非常感谢大家的信任,我呢,就做好自己的事情,该干嘛干嘛,文章嘛,偶尔抽空写一下发一发,相对于写文章,我更喜欢看书和写代码呢,我每天都有写代码的,这不,今天给大家带来一份商业级稳定性的代码——mqttclient。
02
关于mqttclient的诞生
谈谈这份代码的诞生缘由吧! 从上一年的5月份左右吧,我花了一个多星期去移植阿里的SDK,想要将它用起来,但是奈何一直没能用成功,归根结底我还是太菜了,10月份分析完了腾讯的SDK中的MQTT协议部分的代码,我就想自己写一个好用的代码,要非常简单API接口,还要有很好的稳定性,然后嘛,也是为开源做贡献,希望有缘人能简单快速用起来,都说程序员有些奇奇怪怪的理想,且不说改变世界吧,像我这种,我是很希望某些产品中能跑着我写的代码,即使我无缘知道甚至遇见它。。。
兜兜转转,从11月份开始设计框架,LwIP的源码与阿里的SDK框架给了我很大的影响,所以整体的设计框架都采用分层设计,此外腾讯的SDK呢让我决定了使用异步处理的思想来设计整个代码,然后设计完整体框架之后就愉快地板砖了,没错,是愉快地!写代码其实是很好玩的事情,特别是当年的想法可以实现的时候,遇到不懂的时候有资料,有人讨论,在此特别感谢几位网上的好基友,在大半夜的还与我讨论,解答我的问题~非常nice。
03
介绍一下mqttclient
这一个基于socket API之上的跨平台MQTT客户端,拥有非常简洁的API接口,以极少的资源实现QOS2的服务质量,并且无缝衔接了mbedtls加密库。
04
谈谈优势
掉线重连
,丢包重发
,都是严格遵循MQTT协议标准
执行,除此之外对大数据量的测试无论是收是发,都是非常稳定(一次发送135K
数据,3秒一次),高频测试也是非常稳定(7个主题同时收发,每秒一次,也就是1秒14个mqtt报文,服务质量QoS0、QoS1、QoS2都有)。因为作者以极少的资源设计了记录机制
,对采用QoS1服务质量的报文必须保证到达一次,当发布的主题(qos1、qos2都适用)没有被服务器收到时会自动重发,而对QoS2服务质量的报文保证有且只有处理一次(如果不相信它稳定性的同学可以自己去修改源码,专门为QoS2服务质量去做测试,故意不回复PUBREC
包,让服务器重发QoS2报文,且看看客户端是否有且只有处理一次),而对于掉线重连的稳定性,这种则是基本操作了,没啥好说的,在自动重连后还会自动重新订阅主题,保证主题不会丢失,因此在测试中稳定性极好。“#”、“+”
。05
mqttclient整体框架
拥有非常明确的分层框架。
06
mqttclient适配的平台
目前已实现了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 |
07
mqttclient测试(Linux平台)
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.user_name = "xxxxxxx"; /* 用户名 */
init_params.connect_params.password = "xxxxxxx"; /* 密码 */
init_params.connect_params.client_id = "xxxxxxx"; /* 客户端id */
3. 编译运行
./build.sh
运行build.sh
脚本后会在 ./build/bin/
目录下生成可执行文件mqtt-client
,直接运行即可。
08
mqttclient的配置
默认不打开mbedtls,当然只需要配置一个宏定义即可打开mbedtls加密。
salof 全称是:Synchronous Asynchronous Log Output Framework
(同步异步日志输出框架),它是一个同步异步日志输出框架,在空闲时候输出对应的日志信息,并且该库与mqttclient无缝衔接。
配置对应的日志输出级别:
#define BASE_LEVEL (0)
#define ASSERT_LEVEL (BASE_LEVEL + 1) /* 日志输出级别:断言级别(非常高优先级) */
#define ERR_LEVEL (ASSERT_LEVEL + 1) /* 日志输出级别:错误级别(高优先级) */
#define WARN_LEVEL (ERR_LEVEL + 1) /* 日志输出级别:警告级别(中优先级) */
#define INFO_LEVEL (WARN_LEVEL + 1) /* 日志输出级别:信息级别(低优先级) */
#define DEBUG_LEVEL (INFO_LEVEL + 1) /* 日志输出级别:调试级别(更低优先级) */
#define LOG_LEVEL WARN_LEVEL /* 日志输出级别 */
日志其他选项:
配置mqtt等待应答列表的最大值,对于qos1 qos2服务质量有要求的可以将其设置大一点,当然也必须资源跟得上,它主要是保证qos1 qos2的mqtt报文能准确到达服务器。
#define MQTT_ACK_HANDLER_NUM_MAX 64
选择MQTT协议的版本,默认为4,表示使用MQTT 3.1.1版本,而3则表示为MQTT 3.1版本。
#define MQTT_VERSION 4 // 4 is mqtt 3.1.1
设置默认的保活时间,它主要是保证MQTT客户端与服务器的保持活性连接,单位为 秒 ,比如MQTT客户端与服务器100S没有发送数据了,有没有接收到数据,此时MQTT客户端会发送一个ping包,确认一下这个会话是否存在,如果收到服务器的应答,那么说明这个会话还是存在的,可以随时收发数据,而如果不存在了,就清除会话。
#define MQTT_KEEP_ALIVE_INTERVAL 100 // unit: second
默认的命令超时,它主要是用于socket读写超时,在MQTT初始化时可以指定:
#define MQTT_DEFAULT_CMD_TIMEOUT 4000
默认主题的长度,主题是支持通配符的,如果主题太长则会被截断:
#define MQTT_TOPIC_LEN_MAX 64
默认的算法数据缓冲区的大小,如果要发送大量数据则修改大一些,在MQTT初始化时可以指定:
#define MQTT_DEFAULT_BUF_SIZE 1024
线程相关的配置,如线程栈,线程优先级,线程时间片等:
在linux环境下可以是不需要理会这些参数的,而在RTOS平台则需要配置,如果不使用mbedtls,线程栈2048字节已足够,而使用mbedtls加密后,需要配置4096字节以上。
#define MQTT_THREAD_STACK_SIZE 2048 // 线程栈
#define MQTT_THREAD_PRIO 5 // 线程优先级
#define MQTT_THREAD_TICK 50 // 线程时间片
默认的重连时间间隔,当发生掉线时,会以这个时间间隔尝试重连:
#define MQTT_RECONNECT_DEFAULT_DURATION 1000
其他不需要怎么配置的东西:
#define MQTT_MAX_PACKET_ID (0xFFFF - 1) // mqtt报文id
#define MQTT_MAX_CMD_TIMEOUT 20000 //最大的命令超时参数
#define MQTT_MIN_CMD_TIMEOUT 1000 //最小的命令超时参数
ps:以上参数基本不需要怎么配置的,直接用即可~
09
mqttclient设计思想
设计思想
[订阅的主题]
与指定[消息的处理函数]
方便大家更容易理解mqttclient的代码与设计思想,让大家能够修改源码与使用,还可以提交pr或者issues,开源的世界期待各位大神的参与,感谢!
除此之外以下代码的记录机制与其超时处理机制是非常好的编程思想,大家有兴趣一定要看源代码!
不是所有人都喜欢看代码的,整个mqttclient的实现在今天的第二篇推文中讲解,此处就不再多说了,源码地址是:https://github.com/jiejieTop/mqttclient。
全部0条评论
快来发表一下你的评论吧 !