在HarmonyOS鸿蒙Next系统上使用MQTT编程

在HarmonyOS鸿蒙Next系统上使用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);
MQTStartTask(&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);

它的函数原型如下:

DLLExport int MQTTSubscribe(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler);

其中:

  • MQTTClient* c:我们前面定义的MQTTClient结构体
  • const char* topicFilter:订阅的主题
  • messageHandler messageHandler:接收到主题信息后的回调处理函数。

例如上面我们的回调函数是 messageArrived ,它的原型如下:

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 <stdio.h>

#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include <unistd.h>
#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;
    int nodelimiter;
    char* delimiter;
    enum QoS qos;
    char* username;
    char* password;
    char* host;
    int port;
    int showtopics;
} 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 char buf[100];
unsigned char readbuf[100];

int mqtt_test(void)
{
    int rc = 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);

    return 0;
}

作者:连志安

想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto.com#hw


更多关于在HarmonyOS鸿蒙Next系统上使用MQTT编程的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next系统上使用MQTT编程,可以通过鸿蒙提供的分布式通信能力实现。鸿蒙Next系统支持MQTT协议,开发者可以使用鸿蒙的@ohos.net.mqtt模块进行MQTT客户端的开发。

首先,需要在config.json文件中添加MQTT模块的依赖:

{
  "module": {
    "name": "entry",
    "deviceTypes": [
      "default"
    ],
    "dependencies": [
      {
        "bundleName": "ohos.net.mqtt",
        "version": "1.0.0"
      }
    ]
  }
}

接下来,可以在代码中引入MQTT模块并创建MQTT客户端:

import mqtt from '@ohos.net.mqtt';

// 创建MQTT客户端
const client = mqtt.createClient({
  host: 'mqtt.example.com',
  port: 1883,
  clientId: 'harmonyos-client',
  username: 'user',
  password: 'password'
});

// 连接MQTT服务器
client.connect().then(() => {
  console.log('Connected to MQTT server');
}).catch((err) => {
  console.error('Failed to connect to MQTT server:', err);
});

// 订阅主题
client.subscribe('topic/test', { qos: 1 }).then(() => {
  console.log('Subscribed to topic/test');
}).catch((err) => {
  console.error('Failed to subscribe to topic:', err);
});

// 发布消息
client.publish('topic/test', 'Hello, HarmonyOS!', { qos: 1 }).then(() => {
  console.log('Message published');
}).catch((err) => {
  console.error('Failed to publish message:', err);
});

// 处理接收到的消息
client.on('message', (topic, message) => {
  console.log(`Received message on topic ${topic}: ${message}`);
});

// 断开连接
client.disconnect().then(() => {
  console.log('Disconnected from MQTT server');
}).catch((err) => {
  console.error('Failed to disconnect:', err);
});

以上代码展示了如何在鸿蒙Next系统上使用MQTT进行基本的连接、订阅、发布和消息处理操作。开发者可以根据实际需求进一步扩展和优化。

更多关于在HarmonyOS鸿蒙Next系统上使用MQTT编程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统上使用MQTT编程,首先需要引入MQTT客户端库,如Eclipse Paho。通过ohpm(OpenHarmony Package Manager)安装MQTT库,然后在代码中配置MQTT客户端,设置服务器地址、端口、客户端ID等参数。使用connect()方法连接到MQTT代理,并通过subscribe()订阅主题,publish()发布消息。确保处理连接状态和消息接收的回调函数,以实现实时通信。最后,使用disconnect()断开连接。

回到顶部