MQTT C Client for Posix and Windows

Eclipse Paho

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,广泛用于物联网(IoT)应用。
Eclipse Paho是Eclipse提供的一个访问MQTT服务器的一种开源客户端库,支持10种语言编写mqtt客户端。

  • Java
  • Python
  • JavaScript
  • GoLang
  • C
  • C++
  • Rust
  • Net (C#)
  • Android Service
  • Embedded C/C++
    在这里插入图片描述

MQTT C Client for Posix and Windows

Paho MQTT C客户端是一个用ANSI标准C编写的完全功能的MQTT客户端,选择C而非C++是为了最大程度地提高可移植性。Paho项目同时也提供了基于此库的C++接口,以满足不同开发者的需要。

实际上,Paho MQTT C客户端提供了两种C语言API:“同步”(Synchronous)和“异步”(Asynchronous)。同步API的函数调用以MQTTClient开头,而异步API的函数则以MQTTAsync开头。同步API设计得更为简单直观,部分调用会阻塞直到操作完成,这简化了编程逻辑,使得代码更容易理解和编写,特别适合那些对响应时间和线程模型要求不高的应用场景。

相比之下,异步API中只有waitForCompletion这一个调用会阻塞,其余操作均通过回调函数(callbacks)通知结果,这意味着开发者需要自己处理消息到达、连接状态变化等事件,这使得异步API非常适合在那些应用程序不是主线程控制的环境中使用,比如需要高性能、高并发处理能力,或者在UI线程中集成MQTT通信而不影响界面响应的应用场景。

总结来说,开发者可以根据自己的具体需求和应用场景,选择使用更加简单直接的同步API,还是更灵活、更适合多任务和高性能需求的异步API。

特性

  • MQTT 3.1 & MQTT 3.1.1: 支持MQTT协议的第3.1版和第3.1.1版,这两个版本是广泛使用的MQTT协议标准,提供了基本的发布/订阅消息模式和QoS保障机制。
  • MQTT 5.0: 支持MQTT协议的最新版本——第5.0版,这一版本引入了许多新特性,包括但不限于消息过期、共享订阅、用户属性、更精细的会话控制和增强的错误报告,提高了协议的灵活性和功能性。
  • LWT (Last Will and Testament): 允许客户端在异常断开连接时自动发布一条消息,常用于通知系统或其他客户端设备的离线状态。
  • SSL / TLS: 支持通过SSL/TLS加密通信,确保数据传输的安全性,防止数据被窃取或篡改。
  • Message Persistence: 支持消息持久化,即使客户端离线,也能确保消息不会丢失,可以在重连后继续接收或发布。
  • Automatic Reconnect: 当客户端与MQTT服务器的连接意外中断时,自动尝试重新建立连接,增强了系统的健壮性和可用性。
  • Offline Buffering: 在离线期间,客户端可以缓存待发送的消息,一旦重新连接,这些消息将自动发送出去。
  • WebSocket Support: 支持通过WebSocket协议进行MQTT通信,使得MQTT可以穿透防火墙,适用于Web浏览器和其他不支持原生MQTT连接的环境。
  • Standard TCP Support: 除了WebSocket,还支持传统的TCP连接,这是MQTT协议最常用的传输方式。
  • Non-Blocking API: 异步API允许程序在等待MQTT操作完成的同时继续执行其他任务,避免了阻塞,提高了程序的响应性和效率。
  • Blocking API: 同步API在某些操作上会阻塞直到操作完成,简化了编程模型,适合简单的应用场景或调试。
  • High Availability: 虽然MQTT C客户端本身不直接提供集群或负载均衡功能,但通过与支持高可用的MQTT代理配合使用,可以构建高度可靠的MQTT消息系统,确保服务的连续性和稳定性。

发布版本的源代码存档可以从Git存储库中获得。

下载

Windows、Linux和Mac的预构建二进制文件可从下载页面获得。
对于Windows平台的二进制文件,它们是使用Visual Studio 2013和2015编译构建的。如果您系统上没有安装相应版本的Visual Studio,您需要安装与之匹配的Visual C++ Redistributable Package以确保程序能够正常运行。这些Redistributable Package包含了运行使用Visual Studio开发的C++应用程序所需的运行时组件,包括库文件和DLLs,无需完整安装Visual Studio即可使依赖这些组件的应用程序正常工作。

  • 对于Visual Studio 2013,您应安装“Microsoft Visual C++ Redistributable for Visual Studio 2013”。
  • 对于Visual Studio 2015,您应安装“Microsoft Visual C++ Redistributable for Visual Studio 2015”。

这些包通常可以从Microsoft官方网站免费下载。确保下载与您的操作系统(32位或64位)相匹配的版本。安装完成后,您的系统就能顺利运行使用这些版本的Visual Studio编译的MQTT C客户端二进制文件了。

编译和安装

从源代码自行编译MQTT C客户端,可以利用持续集成(Continuous Integration, CI)服务提供的构建,这些服务为Linux、Mac和Windows平台提供了现成的构建环境和脚本。

  • 对于Linux和Mac: 您可以在Travis-CI上找到相关的构建配置和历史记录。Travis-CI通常用于GitHub上的开源项目,自动在每次代码推送时运行测试和构建过程。您可以通过查看项目的.travis.yml配置文件了解如何设置编译环境和执行构建命令,然后在您本地的Linux或Mac环境中复现这一过程。
  • 对于Windows: 可以访问AppVeyor平台查找项目的构建情况。AppVeyor专为Windows平台设计,提供了与Visual Studio集成的持续集成服务。项目中的appveyor.yml文件会定义用于Windows构建的环境配置和步骤。通过查看这些配置文件,您可以了解到如何配置本地环境以编译源代码,包括必要的依赖项安装和编译命令。

Linux/Mac

C客户端可以在Linux/Unix/Mac上使用make和gcc编译。编译如下:

git clone https://github.com/eclipse/paho.mqtt.c.git
cd org.eclipse.paho.mqtt.c.git
make

build/output/目录下面有生成的动态库

  • libpaho-mqtt3a.so:异步的paho.mqtt.c库
  • libpaho-mqtt3as.so:异步的、使用了SSL的paho.mqtt.c库
  • libpaho-mqtt3c.so:经典的、同步的paho.mqtt.c库
  • libpaho-mqtt3cs.so:经典的、同步的、使用了SSL的paho.mqtt.c库

也可以使用CMake——详细信息请参见readme文件。
安装

sudo make install

这会默认安装库文件到/usr/local/lib,头文件到/usr/local/include
运行CMake配置
在构建目录中运行CMake命令,并使用-DCMAKE_INSTALL_PREFIX指定您希望的安装路径。例如,如果您想将库安装到/opt/paho-mqtt-c目录下,可以这样做:

   cmake .. -DCMAKE_INSTALL_PREFIX=/opt/paho-mqtt-c

Windows

Windows版本使用Visual Studio或Visual c++和CMake。一个批处理文件cbuild.bat,展示了如何使用CMake来编译:

mkdir build.paho

cd build.paho

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64

cmake -G "NMake Makefiles" -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=TRUE ..

nmake

为了设置编译器的路径,你可以运行名为vcvars32.bat(对于32位编译)或vcvars64.bat(对于64位编译)的实用程序脚本。这个脚本位于Visual Studio安装目录的一个特定子目录中,其路径依据你安装的Visual Studio版本和你的系统架构有所不同。一般情况下,该脚本的位置类似于以下路径之一:

  • 对于Visual Studio 2017及以后版本:
    • 64位编译:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat (将Professional替换为你的实际版本,如Community、Enterprise等)
    • 32位编译:同上,因为VsDevCmd.bat同时支持32位和64位编译环境的设置。
  • 对于Visual Studio 2015及更早版本:
    • 64位编译:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat
    • 32位编译:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat

文档

参考文档在这里

起步

开始使用Paho MQTT C客户端,可以通过其包含的命令行工具paho_c_pubpaho_c_sub来快速体验发布和订阅功能。这些工具简化了与MQTT服务器的交互,便于测试和理解基本的MQTT概念。
启动发布程序并连接到Eclipse IoT sandbox

paho_c_pub -t my_topic --connection mqtt.eclipseprojects.io:1883

然后每输入一行文本就作为一条消息发送。可以使用类似的方法接收消息:

paho_c_sub -t my_topic --connection mqtt.eclipseprojects.io:1883

要查看paho_c_pub或paho_c_sub工具的完整选项列表,只需在命令提示符或终端中键入工具名称而不带任何参数即可:

paho_c_pub

或者

paho_c_sub

示例

提到的C客户端通过TCP/IP连接到代理。它们不能与其他网络API一起使用。如果你需要与其它网络API集成或在嵌入式环境下使用,应该考虑使用嵌入式C客户端。这个客户端设计得更加灵活和便携,能适应包括嵌入式系统在内的多种网络堆栈,其中可能直接管理TCP/IP套接字不太可行或不理想。

下面是一个使用Paho MQTT C客户端同步API发布消息的简单示例代码example.c:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"

#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L

int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;
    int rc;

    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(-1);
    }
    pubmsg.payload = PAYLOAD;
    pubmsg.payloadlen = strlen(PAYLOAD);
    pubmsg.qos = QOS;
    pubmsg.retained = 0;
    MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
    printf("Waiting for up to %d seconds for publication of %s\n"
            "on topic %s for client with ClientID: %s\n",
            (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
    rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
    printf("Message with delivery token %d delivered\n", token);
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}
编译命令
gcc example.c -o example -L/usr/local/lib -lpaho-mqtt3c
  • -o example 指定输出的可执行文件名为example。
  • -L/usr/local/lib 告诉编译器库文件位于/usr/local/lib目录下,这是默认安装位置。如果库安装在其他位置,请相应修改此路径。
  • -lpaho-mqtt3c 链接Paho MQTT C库。如果使用的是SSL版本,请使用-lpaho-mqtt3as。
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yoyo勰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值