mqttclient
一个基于socket API之上的跨平台MQTT客户端
基于socket API的MQTT客户端,拥有非常简洁的API接口,以极少的资源实现QOS2的服务质量,并且无缝衔接了mbedtls加密库。
优势:
- 基于标准BSD socket之上开发,只要是兼容BSD socket的系统均可使用。
- 稳定:无论是
掉线重连
,丢包重发
,都是严格遵循MQTT协议标准
执行,除此之外对大数据量的测试无论是收是发,都是非常稳定(一次发送135K
数据,3秒一次),高频测试也是非常稳定(7个主题同时收发,每秒一次,也就是1秒14个mqtt报文,服务质量QoS0、QoS1、QoS2都有)。因为作者以极少的资源设计了记录机制
,对采用QoS1服务质量的报文必须保证到达一次,对QoS2服务质量的报文有且只有收到一次(如果不相信它稳定性的同学可以自己去修改源码,专门为QoS2服务质量去测试,故意不回复PUBREC
,让服务器重发QoS2报文,看看客户端是否有且只有处理一次),而对于掉线重连的稳定性,则是基本操作了,没啥好说的,因此在测试中稳定性极好。 - 轻量级:整个代码工程极其简单,不使用mbedtls情况下,占用资源极少,作者曾使用esp8266模组与云端通信,整个工程代码消耗的RAM不足15k(包括系统占用的开销,对数据的处理开销,而此次还是未优化的情况下,还依旧完美保留了掉线重连的稳定性,但是对应qos1 qos2服务质量的报文则未做测试,因为STM32F103C8T6芯片资源实在是太少了,折腾不起)。
- 无缝衔接mbedtls加密传输,让网络传输更加安全。
- 拥有极简的API接口,随意配置,使用起来非常简单。
- 有非常好的代码风格与思想:整个代码采用分层式设计,代码实现采用异步处理的思想,降低耦合,提高性能。
- MQTT协议支持主题通配符`“#”、“+”`。
- 订阅的主题与消息处理完全分离,让编程逻辑更加简单易用,用户无需理会错综复杂的逻辑关系。
- 不对外产生依赖。
- mqttclient内部已实现保活处理机制,无需用户过多关心理会,用户只需专心处理应用功能即可。
整体框架
拥有非常明确的分层框架。
目前已实现了Linux、TencentOS tiny、RT-Thread平台(已做成软件包),除此之外TencentOS tiny的AT框架亦可以使用,并且稳定性极好!
平台代码位置
Linux: https://github.com/jiejieTop/mqttclient
TencentOS tiny: https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429
RT-Thread: https://github.com/jiejieTop/mqttclient_rtpkgs
linux平台下测试使用
安装cmake:
sudo apt-get install cmake
配置
在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 */
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 /* 日志输出级别 */
日志其他选项:
- 终端带颜色
- 时间戳
- 标签
mqttclient的配置
配置mqtt等待应答列表的最大值,对于qos1 qos2服务质量有要求的可以将其设置大一点,当然也必须资源