1、通用依賴準備
-
安裝編譯工具?
Linux/macOS 需安裝:sudo apt update && sudo apt install build-essential cmake git # Ubuntu/Debian:ml-citation{ref="6" data="citationList"} brew install cmake # macOS
Windows 需安裝?CMake?和?MinGW。
-
?可選 SSL/TLS 支持?
如需加密通信,安裝 OpenSSL 開發庫:sudo apt install libssl-dev # Linux:ml-citation{ref="4" data="citationList"}
?? 源碼編譯安裝(跨平臺)
# 克隆倉庫
git clone https://github.com/eclipse/paho.mqtt.c.git:ml-citation{ref="1,6" data="citationList"} # 創建構建目錄
cd paho.mqtt.c mkdir build && cd build # 配置編譯選項
cmake .. -DPAHO_WITH_SSL=ON # 啟用SSL加密:ml-citation{ref="4,6" data="citationList"}
# Windows/macOS 省略 sudo # 編譯并安裝
make sudo make install # Linux/macOS:ml-citation{ref="1,4" data="citationList"}
🐧 Linux 快捷安裝(APT)
sudo apt update sudo apt install libpaho-mqtt-dev # Ubuntu/Debian:ml-citation{ref="4,6" data="citationList"}
? 驗證安裝
創建測試程序?test.c
:
#include <stdio.h>
#include <MQTTClient.h> // 關鍵頭文件:ml-citation{ref="4" data="citationList"}int main() {MQTTClient client;MQTTClient_create(&client, "tcp://broker.hivemq.com:1883", "test-client", MQTTCLIENT_PERSISTENCE_NONE, NULL);printf("Library loaded successfully!\n");MQTTClient_destroy(&client);return 0;
}
編譯運行:
gcc test.c -o test -lpaho-mqtt3c # 鏈接動態庫:ml-citation{ref="4" data="citationList"} ./test
2、示例代碼實現
🔧 ?核心步驟概述?
- ?初始化MQTT客戶端?
- 創建客戶端實例并配置連接參數
- ?設置回調函數?
- 處理消息接收、連接丟失等事件
- ?連接MQTT代理?
- 建立與MQTT服務器的TCP連接
- ?訂閱目標主題?
- 指定主題名
test/topic
及QoS級別
- 指定主題名
- ?發布消息到主題?
- 向
test/topic
發送消息內容
- 向
? ?C語言代碼實現
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>#define ADDRESS "tcp://broker.hivemq.com:1883" // 公共MQTT代理:ml-citation{ref="6" data="citationList"}
#define CLIENTID "C_Client_Example"
#define TOPIC "test/topic" // 目標主題名:ml-citation{ref="6" data="citationList"}
#define QOS 1 // 服務質量級別:ml-citation{ref="5" data="citationList"}
#define TIMEOUT 10000L // 超時時間(毫秒)/* 消息到達回調函數 */
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) {printf("? 收到消息!\n");printf(" 主題: %s\n", topicName);printf(" 內容: %.*s\n\n", message->payloadlen, (char*)message->payload);MQTTClient_freeMessage(&message);MQTTClient_free(topicName);return 1;
}/* 連接丟失回調 */
void connlost(void *context, char *cause) {printf("? 連接斷開:%s\n", cause);
}int main() {MQTTClient client;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;int rc;// 1. 初始化客戶端if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) {fprintf(stderr, "創建客戶端失敗:錯誤碼 %d\n", rc);exit(EXIT_FAILURE);}// 2. 配置回調函數if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, NULL)) != MQTTCLIENT_SUCCESS) {fprintf(stderr, "設置回調失敗:錯誤碼 %d\n", rc);exit(EXIT_FAILURE);}// 3. 連接代理conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {fprintf(stderr, "連接失敗:錯誤碼 %d\n", rc);exit(EXIT_FAILURE);}printf("🔗 已連接至MQTT代理\n");// 4. 訂閱主題if ((rc = MQTTClient_subscribe(client, TOPIC, QOS)) != MQTTCLIENT_SUCCESS) {fprintf(stderr, "訂閱失敗:錯誤碼 %d\n", rc);exit(EXIT_FAILURE);}printf("📥 已訂閱主題: %s\n", TOPIC);// 5. 發布消息char* payload = "Hello from C MQTT Publisher";MQTTClient_message pubmsg = MQTTClient_message_initializer;pubmsg.payload = payload;pubmsg.payloadlen = strlen(payload);pubmsg.qos = QOS;pubmsg.retained = 0;MQTTClient_deliveryToken token;if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) {fprintf(stderr, "發布失敗:錯誤碼 %d\n", rc);exit(EXIT_FAILURE);}printf("📤 已發布消息到 %s\n", TOPIC);// 保持運行以接收消息printf("\n? 等待接收消息 (按Enter退出)...\n");getchar();// 清理資源MQTTClient_unsubscribe(client, TOPIC);MQTTClient_disconnect(client, TIMEOUT);MQTTClient_destroy(&client);return 0;
}
🔧 ?編譯與運行
# 編譯(需已安裝Paho MQTT C庫)
gcc mqtt_example.c -o mqtt_demo -lpaho-mqtt3c# 運行
./mqtt_demo
📜 ?運行結果示例
🔗 已連接至MQTT代理
📥 已訂閱主題: test/topic
📤 已發布消息到 test/topic? 等待接收消息 (按Enter退出)...
? 收到消息!主題: test/topic內容: Hello from C MQTT Publisher