生活随笔
收集整理的這篇文章主要介紹了
MQTT客户端代码(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建 mqtt 客戶端對象設置回調函數連接 MQTT 服務器?發布上線消息?訂閱主題?發布芯片溫度信息?
/***************************************************************Copyright ? ALIENTEK Co., Ltd. 1998-2021. All rights reserved.文件名 : mqttClient.c作者 : 鄧濤版本 : V1.0描述 : 開發板上的MQTT客戶端應用程序示例代碼其他 : 無論壇 : www.openedv.com日志 : 初版 V1.0 2021/7/20 鄧濤創建***************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "MQTTClient.h" //包含MQTT客戶端庫頭文件/* ########################宏定義##################### */
#define BROKER_ADDRESS "tcp://iot.ranye-iot.net:1883" //然也物聯平臺社區版MQTT服務器地址/* 客戶端id、用戶名、密碼 ** 當您成功申請到然也物聯平臺的社區版MQTT服務后* 然也物聯工作人員會給你發送8組用于連接社區版MQTT服務器* 的客戶端連接認證信息:也就是客戶端id、用戶名和密碼* 注意一共有8組,您選擇其中一組覆蓋下面的示例值* 后續我們使用MQTT.fx或MQTTool的時候 也需要使用一組連接認證信息* 去連接社區版MQTT服務器!* 由于這是屬于個人隱私 筆者不可能將自己的信息寫到下面 */
#define CLIENTID "您的客戶端ID" //客戶端id
#define USERNAME "您的用戶名" //用戶名
#define PASSWORD "您的密碼" //密碼/* 然也物聯社區版MQTT服務為每個申請成功的用戶* 提供了個人專屬主題級別,在官方發給您的微信信息中* 提到了* 以下 dt_mqtt/ 便是筆者的個人主題級別* dt_mqtt其實就是筆者申請社區版MQTT服務時注冊的用戶名* 大家也是一樣,所以你們需要替換下面的dt_mqtt前綴* 換成你們的個人專屬主題級別(也就是您申請時的用戶名)*/
#define WILL_TOPIC "dt_mqtt/will" //遺囑主題
#define LED_TOPIC "dt_mqtt/led" //LED主題
#define TEMP_TOPIC "dt_mqtt/temperature" //溫度主題
/* ################################################# */
//接收消息的回調函數;
static int msgarrvd(void *context, char *topicName, int topicLen,MQTTClient_message *message)
{if (!strcmp(topicName, LED_TOPIC)) {//校驗消息的主題if (!strcmp("2", message->payload)) //如果接收到的消息是"2"則設置LED為呼吸燈模式system("echo heartbeat > /sys/class/leds/sys-led/trigger");if (!strcmp("1", message->payload)) {//如果是"1"則LED常量system("echo none > /sys/class/leds/sys-led/trigger");system("echo 1 > /sys/class/leds/sys-led/brightness");}else if (!strcmp("0", message->payload)) {//如果是"0"則LED熄滅system("echo none > /sys/class/leds/sys-led/trigger");system("echo 0 > /sys/class/leds/sys-led/brightness");}// 接收到其它數據 不做處理}/* 釋放占用的內存空間 */MQTTClient_freeMessage(&message);MQTTClient_free(topicName);/* 退出 */return 1;
}static void connlost(void *context, char *cause)
{printf("\nConnection lost\n");printf(" cause: %s\n", cause);
}int main(int argc, char *argv[])
{MQTTClient client;//用宏初始化連接信息結構體;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;//用宏初始化遺囑結構體MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;//用宏初始化發布消息結構體;MQTTClient_message pubmsg = MQTTClient_message_initializer;int rc;/* 創建mqtt客戶端對象 */if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_create(&client, BROKER_ADDRESS, CLIENTID,MQTTCLIENT_PERSISTENCE_NONE, NULL))) {printf("Failed to create client, return code %d\n", rc);rc = EXIT_FAILURE;goto exit;}/* 設置回調 *///connlost,msgarrvd;最后一個是發布已確認的回調函數,設為NULL表示不檢查是否發送成功;if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_setCallbacks(client, NULL, connlost,msgarrvd, NULL))) {printf("Failed to set callbacks, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}/* 連接MQTT服務器 *///在初始化的基礎上,配置遺囑結構體will_opts.topicName = WILL_TOPIC; //遺囑主題will_opts.message = "Unexpected disconnection";//遺囑消息will_opts.retained = 1; //保留消息will_opts.qos = 0; //QoS0//在初始化后的基礎上,配置連接信息的結構體;conn_opts.will = &will_opts;conn_opts.keepAliveInterval = 30; //心跳包間隔時間conn_opts.cleansession = 0; //cleanSession標志conn_opts.username = USERNAME; //用戶名conn_opts.password = PASSWORD; //密碼if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_connect(client, &conn_opts))) {printf("Failed to connect, return code %d\n", rc);rc = EXIT_FAILURE;goto destroy_exit;}printf("MQTT服務器連接成功!\n");/* 發布上線消息 */pubmsg.payload = "Online"; //消息的內容pubmsg.payloadlen = 6; //內容的長度pubmsg.qos = 0; //QoS等級pubmsg.retained = 1; //保留消息if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_publishMessage(client, WILL_TOPIC, &pubmsg, NULL))) {printf("Failed to publish message, return code %d\n", rc);rc = EXIT_FAILURE;goto disconnect_exit;}/* 訂閱主題 dt_mqtt/led */if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_subscribe(client, LED_TOPIC, 0))) {printf("Failed to subscribe, return code %d\n", rc);rc = EXIT_FAILURE;goto disconnect_exit;}/* 向服務端發布芯片溫度信息 */for ( ; ; ) {MQTTClient_message tempmsg = MQTTClient_message_initializer;char temp_str[10] = {0};int fd;/* 讀取溫度值 */fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);read(fd, temp_str, sizeof(temp_str));//讀取temp屬性文件即可獲取溫度close(fd);/* 發布溫度信息 */tempmsg.payload = temp_str; //消息的內容tempmsg.payloadlen = strlen(temp_str); //內容的長度tempmsg.qos = 0; //QoS等級tempmsg.retained = 1; //保留消息if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_publishMessage(client, TEMP_TOPIC, &tempmsg, NULL))) {printf("Failed to publish message, return code %d\n", rc);rc = EXIT_FAILURE;goto unsubscribe_exit;}sleep(30); //每隔30秒 更新一次數據}unsubscribe_exit:if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_unsubscribe(client, LED_TOPIC))) {printf("Failed to unsubscribe, return code %d\n", rc);rc = EXIT_FAILURE;}
disconnect_exit:if (MQTTCLIENT_SUCCESS !=(rc = MQTTClient_disconnect(client, 10000))) {printf("Failed to disconnect, return code %d\n", rc);rc = EXIT_FAILURE;}
destroy_exit:MQTTClient_destroy(&client);
exit:return rc;
}
總結
以上是生活随笔為你收集整理的MQTT客户端代码(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。