嵌入式mqtt移植Openharmony与测试整体过程记录

一、mqtt服务器

# 安装mosquitto
sudo apt-get install mosquitto
# 安装客户端
sudo apt-get install mosquitto-clients
# 安装设备端
sudo apt-get install mosquitto-dev
# mosquitto源码地址 https://github.com/eclipse/mosquitto
# 将源码所在的mosquitto.conf替换ubuntu的/etc/mosquitto/mosquitto.conf
# 该配置文件可以修改用户名、密码等配置信息
# 启动
mosquitto -c /etc/mosquitto/mosquitto.conf
# 其它命令
# 查看运行状态
systemctl status mosquitto
# 开启/关闭
systemctl start/stop mosquitto
# 查看进程
ps -aux | grep mosquitto
# 查看1883端口占用
netstat -apn | grep 1883
# 关闭进程
kill -9 pid

二、嵌入式mqtt开源地址

https://github.com/eclipse/paho.mqtt.embedded-c

三、mqtt移植L2

3.1 C库生成动态库

3.1.1 添加BUILD.gn

# BUILD.gn
import("//build/ohos.gni")
import("//build/ohos_var.gni")
import("//build/lite/config/component/lite_component.gni")
import("//build/test.gni")

pahomqtt_c_sources = [
  "MQTTClient-C/src/MQTTClient.c",
  "MQTTPacket/src/MQTTConnectClient.c",
  "MQTTPacket/src/MQTTConnectServer.c",
  "MQTTPacket/src/MQTTDeserializePublish.c",
  "MQTTPacket/src/MQTTFormat.c",
  "MQTTPacket/src/MQTTPacket.c",
  "MQTTPacket/src/MQTTSerializePublish.c",
  "MQTTPacket/src/MQTTSubscribeClient.c",
  "MQTTPacket/src/MQTTSubscribeServer.c",
  "MQTTPacket/src/MQTTUnsubscribeClient.c",
  "MQTTPacket/src/MQTTUnsubscribeServer.c",
]

ohos_shared_library("pahomqtt_c") {
    
    
  include_dirs = [
    "MQTTPacket/src",
    "MQTTClient/src",
    "MQTTClient-C/src",
  ]
  include_dirs += [ 
    "MQTTClient-C/src/linux",
  ]
  sources = pahomqtt_c_sources
  sources += [ 
    "MQTTClient-C/src/linux/MQTTLinux.c",
  ]

  defines = [
    "LINUX_SO",
    "MQTT_SERVER",
    "MQTT_CLIENT",
    # "MQTT_TASK",  # rtos时使用此宏进行实时响应
    "MAX_MESSAGE_HANDLERS",
  ]

  part_name = "netmanager_base"
  subsystem_name = "communication"
}

3.1.2 修改

// MQTTClient.h添加MQTTLinux.h头文件
#include "MQTTLinux.h"
#include "MQTTPacket.h"

// 修改最大订阅数
#if !defined(MAX_MESSAGE_HANDLERS)
#define MAX_MESSAGE_HANDLERS 50 /* redefinable - how many subscriptions do you want? */
#endif

3.1.3 测试设备上mqtt的订阅与发布测试

import("//build/ohos.gni")
import("//build/ohos_var.gni")
import("//build/lite/config/component/lite_component.gni")
import("//build/test.gni")

ohos_executable("testmqtt_c") {
    
    
  include_dirs = [
    "//third_party/paho-mqtt-embedded-c/MQTTClient-C/src",
    "//third_party/paho-mqtt-embedded-c/MQTTClient-C/src/linux",
    "//third_party/paho-mqtt-embedded-c/MQTTPacket/src"
  ]

  sources = [
    "testmqtt.c"
  ]

  deps = [
    "//third_party/paho-mqtt-embedded-c:pahomqtt_c"
  ]

  defines = [
    "LINUX_SO",
    "MQTT_SERVER",
    "MQTT_CLIENT",
    "MAX_MESSAGE_HANDLERS",
  ]
  
  subsystem_name = "communication"
}
#include <stdio.h>
#include <memory.h>
#include "MQTTClient.h"

#include <stdio.h>
#include <signal.h>

#include <sys/time.h>

volatile int toStop = 0;
MQTTClient c;

void usage()
{
    
    
	printf("MQTT stdout subscriber\n");
	printf("Usage: stdoutsub topicname <options>, where options are:\n");
	printf("  --host <hostname> (default is localhost)\n");
	printf("  --port <port> (default is 1883)\n");
	printf("  --qos <qos> (default is 2)\n");
	printf("  --delimiter <delim> (default is \\n)\n");
	printf("  --clientid <clientid> (default is hostname+timestamp)\n");
	printf("  --username none\n");
	printf("  --password none\n");
	printf("  --showtopics <on or off> (default is on if the topic has a wildcard, else off)\n");
	exit(-1);
}

void cfinish(int sig)
{
    
    
	signal(SIGINT, NULL);
	toStop = 1;
}

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*)"localhost", 1883, 0
};


void getopts(int argc, char** argv)
{
    
    
	int count = 2;
	
	while (count < argc)
	{
    
    
		if (strcmp(argv[count], "--qos") == 0)
		{
    
    
			if (++count < argc)
			{
    
    
				if (strcmp(argv[count], "0") == 0)
					opts.qos = QOS0;
				else if (strcmp(argv[count], "1") == 0)
					opts.qos = QOS1;
				else if (strcmp(argv[count], "2") == 0)
					opts.qos = QOS2;
				else
					usage();
			}
			else
				usage();
		}
		else if (strcmp(argv[count], "--host") == 0)
		{
    
    
			if (++count < argc)
				opts.host = argv[count];
			else
				usage();
		}
		else if (strcmp(argv[count], "--port") == 0)
		{
    
    
			if (++count < argc)
				opts.port = atoi(argv[count]);
			else
				usage();
		}
		else if (strcmp(argv[count], "--clientid") == 0)
		{
    
    
			if (++count < argc)
				opts.clientid = argv[count];
			else
				usage();
		}
		else if (strcmp(argv[count], "--username") == 0)
		{
    
    
			if (++count < argc)
				opts.username = argv[count];
			else
				usage();
		}
		else if (strcmp(argv[count], "--password") == 0)
		{
    
    
			if (++count < argc)
				opts.password = argv[count];
			else
				usage();
		}
		else if (strcmp(argv[count], "--delimiter") == 0)
		{
    
    
			if (++count < argc)
				opts.delimiter = argv[count];
			else
				opts.nodelimiter = 1;
		}
		else if (strcmp(argv[count], "--showtopics") == 0)
		{
    
    
			if (++count < argc)
			{
    
    
				if (strcmp(argv[count], "on") == 0)
					opts.showtopics = 1;
				else if (strcmp(argv[count], "off") == 0)
					opts.showtopics = 0;
				else
					usage();
			}
			else
				usage();
		}
		count++;
	}
	
}

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);
    printf("opts.showtopics:%d opts.nodelimiter:%d payloadlen:%d\t", 
        opts.showtopics, opts.nodelimiter, (int)message->payloadlen);

    MQTTMessage message2;
    message2.qos = QOS1;
    message2.retained = 0;
    message2.payload = (void *)"openharmony22";
    message2.payloadlen = strlen("openharmony22");

    // 发送消息
    if (MQTTPublish(&c, "first_mosquitto", &message2) < 0)
    {
    
    
        return ;
    }
}

int main(int argc, char** argv)
{
    
    
	int rc = 0;
	unsigned char buf[100];
	unsigned char readbuf[100];
	
	if (argc < 2)
		usage();
	
	char* topic = argv[1];

	if (strchr(topic, '#') || strchr(topic, '+'))
		opts.showtopics = 1;
	if (opts.showtopics)
		printf("topic is %s\n", topic);

	getopts(argc, argv);	

	Network n;


	signal(SIGINT, cfinish);
	signal(SIGTERM, cfinish);

	NetworkInit(&n);
	NetworkConnect(&n, opts.host, opts.port);
	MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);
 
	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);

	while (!toStop)
	{
    
    
		MQTTYield(&c, 1000);	
	}
	
	printf("Stopping\n");

	MQTTDisconnect(&c);
	NetworkDisconnect(&n);

	return 0;
}

3.2 测试结果

./testmqtt_c second_mosquitto --host 10.51.11.45 --port 1883
Connecting to 10.51.11.45 1883
Connected 0
Subscribing to second_mosquitto
Subscribed 0
{
    
    
  "msg": "send second"
}
# MQTTX工具订阅了first_mosquitto主题收到如下信息:
# Topic: first_mosquittoQoS: 0
# openharmony22

猜你喜欢

转载自blog.csdn.net/procedurecode/article/details/132042378
今日推荐