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

您所在的位置:网站首页 鸿蒙多任务模糊 鸿蒙系统是单任务还是多任务,在鸿蒙系统上使用MQTT编程

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

2023-08-17 22:37| 来源: 网络整理| 查看: 265

409be397745b160731e1da312c112fb0.png

我们使用的是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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3