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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

鸿蒙系统是单任务还是多任务,在鸿蒙系统上使用MQTT编程

發布時間:2024/9/27 windows 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸿蒙系统是单任务还是多任务,在鸿蒙系统上使用MQTT编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們使用的是paho mqtt軟件包,這里介紹一下怎么使用mqtt協議編程。關于鴻蒙系統的mqtt移植好的軟件包,相關github鏈接如下:

https://gitee.com/qidiyun/harmony_mqtt

這里提供一個簡單的編程示例:

這里我們使用MQTTClient編程模型,他支持多任務多線程,非常適合用在鴻蒙系統上。

1. 網絡初始化

這里定義一個 Network 結構體,然后指定我們的MQTT服務器的IP和端口號。

Network?n;

//初始化結構體

NetworkInit(&n);

//連接到指定的MQTT服務器IP、端口號

NetworkConnect(&n,?“XXX.XXX.XXX.XXX”,?XXXX);

2. 設置MQTT緩存和啟動MQTT線程

我們這里使用的是MQTT線程功能。

MQTTClientInit(&c,?&n,?1000,?buf,?100,?readbuf,?100);

MQTTStartTask(&c);

3. 設置MQTT相關參數

接下來我們設置MQTT的相關參數,包括版本號、客戶端ID、賬戶密碼等

MQTTPacket_connectData?data?=?MQTTPacket_connectData_initializer;

data.willFlag?=?0;

//MQTT版本為?v3

data.MQTTVersion?=?3;

//設置客戶端ID

data.clientID.cstring?=?opts.clientid;

//設置客戶端賬戶

data.username.cstring?=?opts.username;

//設置客戶端密碼

data.password.cstring?=?opts.password;

data.keepAliveInterval?=?10;

data.cleansession?=?1;

//連接到MQTT服務器

rc?=?MQTTConnect(&c,?&data);

4. 訂閱主題和接收消息

訂閱主題可以使用如下函數

MQTTSubscribe(&c,?topic,?opts.qos,?messageArrived);

它的函數原型如下:

DLLExportintMQTTSubscribe(MQTTClient*?client,?constchar*?topicFilter,?enum?QoS,?messageHandler);

其中:

void?messageArrived(MessageData*?md)

{

MQTTMessage*?message?=?md->message;

//打印接收到的消息的長度、和消息內容

printf("%.*s",?(int)message->payloadlen,?(char*)message->payload);

}

5. 發送消息

發送消息也比較簡單,我們只需要設置好我們的主題和消息內容即可

memset(&pubmsg,'\0',?sizeof(pubmsg));

//消息內容為?hello?harmonyOS?!

pubmsg.payload?=?(void*)"hello?harmonyOS?!";

//消息長度

pubmsg.payloadlen?=?strlen((char*)pubmsg.payload);

pubmsg.qos?=?QOS0;

pubmsg.retained?=?0;

pubmsg.dup?=?0;

//推送消息,主題為?pubtest

MQTTPublish(&c,?"pubtest",?&pubmsg);

完整源碼如下:

#include?

#include?

#include?"ohos_init.h"

#include?"cmsis_os2.h"

#include?

#include?"hi_wifi_api.h"

//#include?"wifi_sta.h"

#include?"lwip/ip_addr.h"

#include?"lwip/netifapi.h"

#include?"lwip/sockets.h"

#include?"MQTTClient.h"

/**

*?MQTT?URI?farmat:

*?domain?mode

*?tcp://iot.eclipse.org:1883

*

*?ipv4?mode

*?tcp://192.168.10.1:1883

*?ssl://192.168.10.1:1884

*

*?ipv6?mode

*?tcp://[fe80::20c:29ff:fe9a:a07e]:1883

*?ssl://[fe80::20c:29ff:fe9a:a07e]:1884

*/

#define?MQTT_URI????????????????"tcp://106.13.62.194:1883"

struct?opts_struct

{

char*?clientid;

intnodelimiter;

char*?delimiter;

enum?QoS?qos;

char*?username;

char*password;

char*?host;

intport;

intshowtopics;

}?opts?=

{

(char*)"stdout-subscriber",?0,?(char*)"\n",?QOS2,NULL,NULL,?(char*)"106.13.62.194",?1883,?1

};

void?messageArrived(MessageData*?md)

{

MQTTMessage*?message?=?md->message;

if?(opts.showtopics)

printf("%.*s\t",?md->topicName->lenstring.len,?md->topicName->lenstring.data);

if?(opts.nodelimiter)

printf("%.*s",?(int)message->payloadlen,?(char*)message->payload);

else

printf("%.*s%s",?(int)message->payloadlen,?(char*)message->payload,?opts.delimiter);

//fflush(stdout);

}

unsigned?charbuf[100];

unsigned?charreadbuf[100];

intmqtt_test(void)

{

intrc?=?0;

MQTTMessage?pubmsg;

char*?topic?="test";

if?(strchr(topic,?'#')?||?strchr(topic,'+'))

opts.showtopics?=?1;

if?(opts.showtopics)

printf("topic?is?%s\n",?topic);

Network?n;

MQTTClient?c;

NetworkInit(&n);

NetworkConnect(&n,?opts.host,?opts.port);

MQTTClientInit(&c,?&n,?1000,?buf,?100,?readbuf,?100);

MQTTStartTask(&c);

MQTTPacket_connectData?data?=?MQTTPacket_connectData_initializer;

data.willFlag?=?0;

data.MQTTVersion?=?3;

data.clientID.cstring?=?opts.clientid;

data.username.cstring?=?opts.username;

data.password.cstring?=?opts.password;

data.keepAliveInterval?=?10;

data.cleansession?=?1;

printf("Connecting?to?%s?%d\n",?opts.host,?opts.port);

rc?=?MQTTConnect(&c,?&data);

printf("Connected?%d\n",?rc);

printf("Subscribing?to?%s\n",?topic);

rc?=?MQTTSubscribe(&c,?topic,?opts.qos,?messageArrived);

printf("Subscribed?%d\n",?rc);

memset(&pubmsg,?'\0',?sizeof(pubmsg));

pubmsg.payload?=?(void*)"hello?harmonyOS?!";

pubmsg.payloadlen?=?strlen((char*)pubmsg.payload);

pubmsg.qos?=?QOS0;

pubmsg.retained?=?0;

pubmsg.dup?=?0;

while?(1)

{

MQTTPublish(&c,?"pubtest",?&pubmsg);

sleep(1);

}

printf("Stopping\n");

MQTTDisconnect(&c);

NetworkDisconnect(&n);

return0;

}

【編輯推薦】

【責任編輯:jianghua TEL:(010)68476606】

點贊 0

總結

以上是生活随笔為你收集整理的鸿蒙系统是单任务还是多任务,在鸿蒙系统上使用MQTT编程的全部內容,希望文章能夠幫你解決所遇到的問題。

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