当前位置: 首页 > 科技观察

在鸿蒙系统上使用MQTT编程

时间:2023-03-17 11:36:21 科技观察

更多内容请访问:与华为官方共同建立的鸿蒙技术社区https://harmonyos.51cto.com/#zz我们使用的是pahomqtt软件包,这里介绍一下如何使用mqtt协议进行编程。关于鸿蒙系统mqtt的移植软件包,相关的github链接如下:https://gitee.com/qidiyun/harmony_mqtt下面是一个简单的编程例子:这里使用MQTTClient编程模型,支持多任务而且多线程,非常适合在鸿蒙系统上使用。1.网络初始化在这里定义一个Network结构,然后指定我们的MQTT服务器的IP和端口号。Networkn;//初始化结构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_connectDatadata=MQTTPacket_connectData_initializer;data.willFlag=0;//MQTT版本为v3data.MQTTVersion=3;//设置客户端IDdata.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,enumQoS,messageHandler);where:voidmessageArrived(MessageData*md){MQTTMessage*message=md->message;//打印收到消息的长度和内容printf("%.*s",(int)message->payloadlen,(char*)消息->有效载荷);}5。发送消息发送消息也比较简单,我们只需要设置我们的主题和消息内容memset(&pubmsg,'\0',sizeof(pubmsg));//消息内容为helloharmonyOS!pubmsg.payload=(void*)"helloharmonyOS!";//长消息度pubmsg.payloadlen=strlen((char*)pubmsg.payload);pubmsg.qos=QOS0;pubmsg.retained=0;pubmsg.dup=0;//推送消息,主题为pubtestMQTPublish(&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"/***MQTTURIfarmat:*domainmode*tcp://iot.eclipse.org:1883**ipv4mode*tcp://192.168.10.1:1883*ssl://192.168.10.1:1884**ipv6mode*tcp://[fe80::20c:29ff:fe9a:a07e]:1883*ssl://[fe80::20c:29ff:fe9a:a07e]:1884*/#defineMQTT_URI"tcp://106.13.62.194:1883"structopts_struct{char*clientid;intnodelimiter;char*分隔符;enumQoSqos;char*用户名;char*密码;char*host;intport;intshowtopics;}opts={(char*)“stdout-subscriber”,0,(char*)“\n”,QOS2,NULL,NULL,(char*)"106.13.62.194",1883,1};voidmessageArrived(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);elseprintf("%.*s%s",(int)message->payloadlen,(char*)message->payload,opts.delimiter);//fflush(stdout);}unsignedcharbuf[100];unsignedcharreadbuf[100];intmqtt_test(void){intrc=0;MQTTMessagepubmsg;char*topic="test";if(strchr(topic,'#')||strchr(topic,'+'))opts.showtopics=1;if(opts.showtopics)printf("topicis%s\n",topic);Networkn;MQTTClientc;NetworkInit(&n);NetworkConnect(&n,opts.host,opts.port);MQTTClientInit(&c,&n,1000,buf,100,readbuf,100);MQTTStartTask(&c);MQTTPacket_connectDatadata=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("正在连接%s%d\n",opts.host,opts.port);rc=MQTTConnect(&c,&data);printf("已连接%d\n",rc);printf("订阅%s\n",topic);rc=MQTTSubscribe(&c,topic,opts.qos,messageArrived);printf("订阅%d\n",rc);memset(&pubmsg,'\0',sizeof(pubmsg));pubmsg.payload=(void*)"helloharmonyOS!";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;}更多内容请访问:与华为共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz