生活随笔
收集整理的這篇文章主要介紹了
MQTT客户端代码(C语言)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
創(chuàng)建 mqtt 客戶端對象設(shè)置回調(diào)函數(shù)連接 MQTT 服務(wù)器?發(fā)布上線消息?訂閱主題?發(fā)布芯片溫度信息?
/***************************************************************Copyright ? ALIENTEK Co., Ltd. 1998-2021. All rights reserved.文件名 : mqttClient.c作者 : 鄧濤版本 : V1.0描述 : 開發(fā)板上的MQTT客戶端應(yīng)用程序示例代碼其他 : 無論壇 : www.openedv.com日志 : 初版 V1.0 2021/7/20 鄧濤創(chuàng)建***************************************************************/#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" //然也物聯(lián)平臺社區(qū)版MQTT服務(wù)器地址/* 客戶端id、用戶名、密碼 ** 當(dāng)您成功申請到然也物聯(lián)平臺的社區(qū)版MQTT服務(wù)后* 然也物聯(lián)工作人員會給你發(fā)送8組用于連接社區(qū)版MQTT服務(wù)器* 的客戶端連接認(rèn)證信息:也就是客戶端id、用戶名和密碼* 注意一共有8組,您選擇其中一組覆蓋下面的示例值* 后續(xù)我們使用MQTT.fx或MQTTool的時(shí)候 也需要使用一組連接認(rèn)證信息* 去連接社區(qū)版MQTT服務(wù)器!* 由于這是屬于個(gè)人隱私 筆者不可能將自己的信息寫到下面 */
#define CLIENTID "您的客戶端ID" //客戶端id
#define USERNAME "您的用戶名" //用戶名
#define PASSWORD "您的密碼" //密碼/* 然也物聯(lián)社區(qū)版MQTT服務(wù)為每個(gè)申請成功的用戶* 提供了個(gè)人專屬主題級別,在官方發(fā)給您的微信信息中* 提到了* 以下 dt_mqtt/ 便是筆者的個(gè)人主題級別* dt_mqtt其實(shí)就是筆者申請社區(qū)版MQTT服務(wù)時(shí)注冊的用戶名* 大家也是一樣,所以你們需要替換下面的dt_mqtt前綴* 換成你們的個(gè)人專屬主題級別(也就是您申請時(shí)的用戶名)*/
#define WILL_TOPIC "dt_mqtt/will" //遺囑主題
#define LED_TOPIC "dt_mqtt/led" //LED主題
#define TEMP_TOPIC "dt_mqtt/temperature" //溫度主題
/* ################################################# */
//接收消息的回調(diào)函數(shù);
static int msgarrvd(void *context, char *topicName, int topicLen,MQTTClient_message *message)
{if (!strcmp(topicName, LED_TOPIC)) {//校驗(yàn)消息的主題if (!strcmp("2", message->payload)) //如果接收到的消息是"2"則設(shè)置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");}// 接收到其它數(shù)據(jù) 不做處理}/* 釋放占用的內(nèi)存空間 */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;//用宏初始化連接信息結(jié)構(gòu)體;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;//用宏初始化遺囑結(jié)構(gòu)體MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;//用宏初始化發(fā)布消息結(jié)構(gòu)體;MQTTClient_message pubmsg = MQTTClient_message_initializer;int rc;/* 創(chuàng)建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;}/* 設(shè)置回調(diào) *///connlost,msgarrvd;最后一個(gè)是發(fā)布已確認(rèn)的回調(diào)函數(shù),設(shè)為NULL表示不檢查是否發(fā)送成功;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服務(wù)器 *///在初始化的基礎(chǔ)上,配置遺囑結(jié)構(gòu)體will_opts.topicName = WILL_TOPIC; //遺囑主題will_opts.message = "Unexpected disconnection";//遺囑消息will_opts.retained = 1; //保留消息will_opts.qos = 0; //QoS0//在初始化后的基礎(chǔ)上,配置連接信息的結(jié)構(gòu)體;conn_opts.will = &will_opts;conn_opts.keepAliveInterval = 30; //心跳包間隔時(shí)間conn_opts.cleansession = 0; //cleanSession標(biāo)志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服務(wù)器連接成功!\n");/* 發(fā)布上線消息 */pubmsg.payload = "Online"; //消息的內(nèi)容pubmsg.payloadlen = 6; //內(nèi)容的長度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;}/* 向服務(wù)端發(fā)布芯片溫度信息 */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);/* 發(fā)布溫度信息 */tempmsg.payload = temp_str; //消息的內(nèi)容tempmsg.payloadlen = strlen(temp_str); //內(nèi)容的長度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秒 更新一次數(shù)據(jù)}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;
}
總結(jié)
以上是生活随笔為你收集整理的MQTT客户端代码(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。