0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MQTT客户端介绍

汽车电子技术 来源:物联网IoT开发 作者:杰杰mcu 2023-02-28 16:14 次阅读

mqttclient

一个高性能、高稳定性的跨平台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 socket之上开发 ,只要是兼容BSD socket的系统均可使用。
  • 无缝衔接salof :它是一个同步异步日志输出框架,在空闲时候输出对应的日志信息,也可以将信息写入flash中保存,方便调试。
  • 使用著名的 paho mqtt 库封包
  • 无其他依赖

在线代码生成工具

本项目拥有代码生成工具,只需要在线配置即可生成代码,极其简单易用,代码生成工具地址:https://jiejietop.gitee.io/mqtt/index.html

图片

在线代码生成工具

占用资源大小

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

图片

整体框架

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

图片

整体架构

  • 在框架的最上方是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框架亦可以使用,并且稳定性极好!

图片

版本

图片

问题

欢迎以 GitHub Issues 的形式提交问题和bug报告

版权和许可

mqttclient 遵循 Apache License v2.0 开源协议。鼓励代码共享和尊重原作者的著作权,可以自由的使用、修改源代码,也可以将修改后的代码作为开源或闭源软件发布。

linux平台下测试使用

安装cmake:

sudo apt-get install cmake g++

测试程序

图片

编译 & 运行

./build.sh

运行build.sh脚本后会在 ./build/bin/ 目录下生成可执行文件 emqxbaiduonenet等多个平台的可执行程序,直接运行即可。

./build/bin/emqx

编译成动态库libmqttclient.so

./make-libmqttclient.sh

运行make-libmqttclient.sh脚本后会在 ./libmqttclient/lib目录下生成一个动态库文件libmqttclient.so,并安装到系统的/usr/lib目录下,相关头文件已经拷贝到./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
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4982

    文章

    18285

    浏览量

    288476
  • API
    API
    +关注

    关注

    2

    文章

    1382

    浏览量

    60992
  • MQTT
    +关注

    关注

    5

    文章

    538

    浏览量

    21976
收藏 人收藏

    评论

    相关推荐

    什么是MQTTMQTT功能介绍

    RT-ThreadMQTT客户端功能特点MQTT简述MQTT功能介绍MQTT客户端
    发表于 03-30 07:06

    支持10种语言编写mqtt客户端

    ,提升自己的代码水平,和其它专栏相比,本专栏的优势在于:不会单纯的介绍分享项目,还会包含作者亲自实践的过程分享,甚至还会有对它背后的设计思想解读。目前本专栏包含的开源项目有:cJSON | 一个轻量级C语言JSON解析器paho | 支持10种语言编写mqtt
    发表于 01-25 06:14

    基于Eclipse paho-mqtt源码包的MQTT客户端设计(上)

    MQTT 软件包介绍Paho MQTT 是 Eclipse 实现的 MQTT 协议的客户端,本软件包是在 Eclipse paho-
    发表于 08-04 16:28

    基于Eclipse paho-mqtt源码包的MQTT客户端设计(下)

    的 Topic#define MQTT_WILLMSG "Goodbye!" //设置断开通知消息配置 MQTT 客户端结构体接下来需要初始化 MQTT 软件包
    发表于 08-04 16:33

    通讯猫MQTT服务器在线客户端的问题

    我在网上找一个通讯猫MQTT服务器在线客户端。我有点糊涂,到底是服务器,还是客户端。可以连上,也可以发数据,就是不知道跟谁连。我从上面下了个WIN32客户端,打开,怎么设置都连不上。用
    发表于 11-19 12:17

    RyanMqtt实现MQTT3.1.1协议的客户端

    还没有同步到packages库列表,暂时还无法在软件包列表搜索到。提pr应该3天了…….介绍RyanMqtt 实现了 MQTT3.1.1 协议的客户端。此库针对资源受限的嵌入式设备进行了优化。初衷:在
    发表于 12-01 15:19

    MQTT客户端发送消息出错是什么原因造成的呢?

    mqtt 客户端发送消息时候 会有下面的错误请问怎么回事啊[D/mqtt.sample] inter mqtt_online_callback![D/
    发表于 01-10 15:20

    请教一下大神mqtt客户端发送消息出错咋办?

    mqtt 客户端发送消息时候 会有下面的错误请问怎么回事啊[D/mqtt.sample] inter mqtt_online_callback![D/
    发表于 04-20 14:43

    MQTT客户端内存泄漏问题如何解决?

    嗨, 我是 nodeMCU 的新手,所以这可能是我 我在 NodeMCU 0.9.6 build 20150704 的 MQTT 客户端中看到内存泄漏 这 是我的代码,下面 所以它连接并断开与由触发
    发表于 05-09 06:10

    如何在rtos mqtt示例中获取客户端句柄?

    中,我调用 代码:全选esp_mqtt_client_publish() 但我没有客户端句柄,它只在回调中设置。我尝试使用客户端句柄的全局副本,但它没有用,除了是个坏主意: 代码:全选
    发表于 05-15 08:13

    AT32基于FreeRTOS的AWS MQTT客户端

    AT32基于FreeRTOS的AWS MQTT客户端建立一个MQTT客户端与 AWS IoT Core进行通讯,用户可以基于这个范例去开发属于自己的应用。
    发表于 10-26 06:03

    如何使用ESP8266搭建MQTT客户端

    手头有一块ESP8266的板子,想搭建一个MQTT客户端,该如何实现呢?
    发表于 11-07 06:36

    MQTT客户端快速入门指南 按键按下

    MQTT客户端快速入门指南 按键按下
    发表于 01-12 18:43 1次下载
    <b class='flag-5'>MQTT</b><b class='flag-5'>客户端</b>快速入门指南 按键按下

    MQTT客户端快速入门指南 按键按下

    MQTT客户端快速入门指南 按键按下
    发表于 07-03 18:34 0次下载
    <b class='flag-5'>MQTT</b><b class='flag-5'>客户端</b>快速入门指南 按键按下

    MQTT中服务端和客户端

    MQTT 是一种基于客户端-服务端架构(C/S)的消息传输协议,所以在 MQTT 协议通信中,有两个最为重要的角色,它们便是服务端和客户端。 1)服务端
    的头像 发表于 07-30 14:55 1622次阅读