一、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 <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) ;
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"
}