日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

MQTT客户端代码(C语言)

發布時間:2023/12/14 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。