一、mqtt服务器
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients
sudo apt-get install mosquitto-dev
mosquitto -c /etc/mosquitto/mosquitto.conf
systemctl status mosquitto
systemctl start/stop mosquitto
ps -aux | grep mosquitto
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
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",
"MAX_MESSAGE_HANDLERS",
]
part_name = "netmanager_base"
subsystem_name = "communication"
}
3.1.2 修改
#include "MQTTLinux.h"
#include "MQTTPacket.h"
#if !defined(MAX_MESSAGE_HANDLERS)
#define MAX_MESSAGE_HANDLERS 50
#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
#include
#include "MQTTClient.h"
#include
#include
#include
volatile int toStop = 0;
MQTTClient c;
void usage()
{
printf("MQTT stdout subscriber\n");
printf("Usage: stdoutsub topicname , where options are:\n");
printf(" --host (default is localhost)\n");
printf(" --port (default is 1883)\n");
printf(" --qos (default is 2)\n");
printf(" --delimiter (default is \\n)\n");
printf(" --clientid (default is hostname+timestamp)\n");
printf(" --username none\n");
printf(" --password none\n");
printf(" --showtopics (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);
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"
}