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位编译环境的设置。
- 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
- 64位编译:
文档
参考文档在这里。
起步
开始使用Paho MQTT C客户端,可以通过其包含的命令行工具paho_c_pub
和paho_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。