Использование программирования MQTT в системе Hongmeng

HarmonyOS

Мы используем программный пакет paho mqtt, вот как использовать программирование протокола mqtt. Что касается портированного программного пакета mqtt системы Hongmeng, соответствующие ссылки на github следующие:

git ee.com/it Heritage/hari…

Вот простой пример программирования:

Здесь мы используем модель программирования MQTTClient, которая поддерживает многозадачность и многопоточность и очень подходит для использования в системе Hongmeng.

  1. инициализация сети

Здесь мы определяем структуру сети, а затем указываем IP-адрес и номер порта нашего сервера MQTT.

номер сети; // инициализируем структуру NetworkInit(&n); //Подключаемся к указанному IP-адресу и номеру порта MQTT-сервера NetworkConnect(&n, "XXX.XXX.XXX.XXX", XXXX);

  1. Настройте кеш MQTT и запустите поток MQTT

Здесь мы используем функцию потока MQTT.

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

  1. Установите параметры, связанные с MQTT

Далее мы устанавливаем соответствующие параметры MQTT, включая номер версии, идентификатор клиента, пароль учетной записи и т. д.

Данные MQTTPacket_connectData = MQTTPacket_connectData_initializer; data.willFlag = 0; // Версия MQTT v3 data.MQTTVersion = 3; //Установить идентификатор клиента 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);

  1. Подписывайтесь на темы и получайте сообщения

Подписка на тему может использовать следующие функции

MQTTSubscribe(&c, тема, opts.qos, messageArrived); Его функциональный прототип выглядит следующим образом:

DLLExport int MQTTSubscribe(MQTTClient* client, const char* TopicFilter, enum QoS, messageHandler); в:

MQTTClient* c : структура MQTTClient, которую мы определили ранее.

const char* themeFilter: подписанная тема

messageHandler messageHandler : Функция обработчика обратного вызова после получения информации о теме.

Например, наша функция обратного вызова выше — messageArrived, и ее прототип выглядит следующим образом:

пустое сообщение прибыло (данные сообщения * md) { MQTTMessage* сообщение = md->сообщение; // Печатаем длину полученного сообщения и содержание сообщения printf("%.s", (int)message->payloadlen, (char)message->payload); }

  1. Отправить сообщение

Отправка сообщения также относительно проста, нам нужно только установить тему и содержание сообщения.

memset(&pubmsg, '\0', sizeof(pubmsg)); //Содержимое сообщения: привет, HarmonOS! pubmsg.payload = (void*)"привет гармонияОС!"; // длина сообщения pubmsg.payloadlen = strlen((char*)pubmsg.payload); pubmsg.qos = QOS0; pubmsg.retained = 0; pubmsg.dup = 0;

//Push-сообщение, тема опубликована 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;

}