From 6a924a29cefbea27a101790343137db819b361be Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Wed, 26 Jun 2019 00:08:35 +0800 Subject: [PATCH] update mqttd to add configure file parser support --- mqttd/etc/conf.h | 66 +++++++++++ mqttd/etc/libetc.a | 0 mqttd/etc/conf.o | 0 mqttd/etc/conf.c | 144 ++++++++++++++++++++++++ mqttd/etc/makefile | 17 ++ mqttd/makefile | 5 mqttd/etc/mqttd.conf | 48 ++++++++ mqttd/main.c | 56 +------- 8 files changed, 288 insertions(+), 48 deletions(-) diff --git a/mqttd/etc/conf.c b/mqttd/etc/conf.c new file mode 100644 index 0000000..b66d22a --- /dev/null +++ b/mqttd/etc/conf.c @@ -0,0 +1,144 @@ +/********************************************************************************* + * Copyright: (C) 2019 LingYun IoT System Studio + * All rights reserved. + * + * Filename: conf.c + * Description: This file is mqttd configure file parser function + * + * Version: 1.0.0(2019年06月25日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2019年06月25日 22时23分55秒" + * + ********************************************************************************/ +#include "conf.h" +#include "lylib/logger.h" +#include "lylib/iniparser.h" + + +int mqttd_parser_conf(const char *conf_file, mqtt_ctx_t *ctx, int debug) +{ + dictionary *ini; + char *str; + int val; + + memset(ctx, 0, sizeof(*ctx)); + + if( !conf_file ) + { + fprintf(stderr, "\nWARNNING: Use default MQTT configure\n"); + + /* logger settings */ + strncpy(ctx->logfile, DBG_LOG_FILE, sizeof(ctx->logfile)); + ctx->loglevel = LOG_LEVEL_DEBUG; + ctx->logsize = 1024; + + /* Broker settings */ + strncpy(ctx->host, DEF_BORKER_HOSTNAME, sizeof(ctx->host)); + ctx->port = DEF_BROKER_PORT; + strncpy(ctx->uid, DEF_BROKER_USERNAME, sizeof(ctx->uid)); + strncpy(ctx->pwd, DEF_BROKER_PASSWD, sizeof(ctx->pwd)); + ctx->keepalive = DEF_BROKER_KEEPALIVE; + + /* Publisher settings */ + strncpy(ctx->pubTopic, DEF_PUBTOPIC, sizeof(ctx->pubTopic)); + ctx->pubQos = DEF_PUBQOS; + ctx->interval = DEF_PUBINTERVAL; + + /* Subscriber settings */ + strncpy(ctx->subTopic, DEF_SUBTOPIC, sizeof(ctx->subTopic)); + ctx->subQos = DEF_SUBQOS; + + return 0; + } + + + ini = iniparser_load(conf_file); + if( !ini ) + { + fprintf(stderr, "ERROR: cannot parse file: '%s'\n", conf_file); + return -1; + } + + /*+------------------------------------------------------+ + *| parser logger settings and start logger system | + *+------------------------------------------------------+*/ + if( !debug ) + { + str = iniparser_getstring(ini, "logger:file", "/tmp/mqttd.log"); + strncpy(ctx->logfile, str, sizeof(ctx->logfile)); + ctx->logsize = iniparser_getint(ini, "logger:size", 1024); + ctx->loglevel = iniparser_getint(ini, "logger:level", LOG_LEVEL_DEBUG); + } + else + { + strncpy(ctx->logfile, DBG_LOG_FILE, sizeof(ctx->logfile)); + ctx->loglevel = LOG_LEVEL_DEBUG; + ctx->logsize = 1024; + } + + if( logger_init(ctx->logfile, ctx->loglevel, ctx->logsize) < 0 ) + { + fprintf(stderr, "Logger system initialise failure\n"); + return -2; + } + + log_nrml("Logger system initialise ok\n"); + + + + /*+------------------------------------------------------+ + *| parser broker settings | + *+------------------------------------------------------+*/ + + if( !(str=iniparser_getstring(ini, "broker:hostname", NULL)) ) + { + log_err("ERROR: Parser broker server hostname failure\n"); + return -2; + } + strncpy(ctx->host, str, sizeof(ctx->host) ); + + if( (val=iniparser_getint(ini, "broker:port", -1)) < 0 ) + { + log_err("ERROR: Parser broker server port failure\n"); + return -2; + } + ctx->port = val; + log_nrml("Parser and get broker server [%s:%d]\n", ctx->host, ctx->port); + + str=iniparser_getstring(ini, "broker:username", DEF_BROKER_USERNAME); + strncpy(ctx->uid, str, sizeof(ctx->uid) ); + + str=iniparser_getstring(ini, "broker:password", DEF_BROKER_PASSWD); + strncpy(ctx->pwd, str, sizeof(ctx->pwd) ); + + log_nrml("Parser and get broker author by [%s:%s]\n", ctx->uid, ctx->pwd); + + ctx->keepalive = iniparser_getint(ini, "broker:keepalive", DEF_BROKER_KEEPALIVE); + log_nrml("Parser and get broker keepalive timeout [%d] seconds\n", ctx->keepalive); + + /*+------------------------------------------------------+ + *| parser publisher settings | + *+------------------------------------------------------+*/ + + str=iniparser_getstring(ini, "publisher:pubTopic", DEF_PUBTOPIC); + strncpy(ctx->pubTopic, str, sizeof(ctx->pubTopic) ); + log_nrml("Parser and get publisher topic \"%s\"\n", ctx->pubTopic); + + ctx->pubQos = iniparser_getint(ini, "publisher:pubQos", DEF_PUBQOS); + ctx->interval = iniparser_getint(ini, "publisher:interval", DEF_PUBINTERVAL); + log_nrml("Parser and get publisher Qos[%d] and interval [%d] seconds\n", ctx->pubQos, ctx->interval); + + /*+------------------------------------------------------+ + *| parser subscriber settings | + *+------------------------------------------------------+*/ + + str=iniparser_getstring(ini, "subsciber:subTopic", DEF_SUBTOPIC); + strncpy(ctx->subTopic, str, sizeof(ctx->subTopic) ); + log_nrml("Parser and get subscriber topic \"%s\"\n", ctx->subTopic); + + ctx->subQos = iniparser_getint(ini, "subsciber:subQos", DEF_SUBQOS); + log_nrml("Parser and get subscriber Qos[%d]\n", ctx->subQos); + + return 0; +} + diff --git a/mqttd/etc/conf.h b/mqttd/etc/conf.h new file mode 100644 index 0000000..8c6fac2 --- /dev/null +++ b/mqttd/etc/conf.h @@ -0,0 +1,66 @@ +/********************************************************************************* + * Copyright: (C) 2019 LingYun IoT System Studio + * All rights reserved. + * + * Filename: conf.h + * Description: This file is mqttd configure file parser function + * + * Version: 1.0.0(2019年06月25日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2019年06月25日 22时23分55秒" + * + ********************************************************************************/ +#ifndef __CONF_H_ +#define __CONF_H_ + +#define DEF_BORKER_HOSTNAME "master.iot-yun.com" +#define DEF_BROKER_PORT 10883 +#define DEF_BROKER_KEEPALIVE 30 +#define DEF_BROKER_USERNAME "lingyun" +#define DEF_BROKER_PASSWD "lingyun-emb" + +#define DEF_PUBQOS 2 +#define DEF_PUBINTERVAL 600 /* 10 minitues */ + +#define DEF_SUBQOS 0 + +#define MQTT_SYS_TOPIC "$Sys/Studio/" +#define DEF_SUBTOPIC MQTT_SYS_TOPIC"Downlink" +#define DEF_PUBTOPIC MQTT_SYS_TOPIC"Uplink" + +enum +{ + Qos0, /* 发送者只发送一次消息,不进行重试,Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息 */ + Qos1, /* 发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息 */ + Qos2, /* Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次 */ +}; + +typedef struct mqtt_ctx_s +{ + /* logger settings */ + char logfile[128]; /* logger record file */ + int loglevel; /* logger level */ + int logsize; /* logger file maxsize, oversize will rollback */ + + /* Broker settings */ + char host[128]; /* MQTT broker server name */ + int port; /* MQTT broker listen port */ + char uid[64]; /* username */ + char pwd[64]; /* password */ + int keepalive; /* MQTT broker send PING message to subsciber/publisher keepalive timeout<seconds> */ + + /* Publisher settings */ + char pubTopic[256]; /* Publisher topic */ + int pubQos; /* Publisher Qos */ + int interval ; /* Publish sensor data interval time, unit seconds */ + + /* Subscriber settings */ + char subTopic[256]; /* Subscriber topic */ + int subQos; /* Subscriber Qos */ +} mqtt_ctx_t; + + +extern int mqttd_parser_conf(const char *conf_file, mqtt_ctx_t *ctx, int debug); + +#endif /* ----- #ifndef _CONF_H_ ----- */ + diff --git a/mqttd/etc/conf.o b/mqttd/etc/conf.o new file mode 100644 index 0000000..2524c5b --- /dev/null +++ b/mqttd/etc/conf.o Binary files differ diff --git a/mqttd/etc/libetc.a b/mqttd/etc/libetc.a new file mode 100644 index 0000000..0d0574c --- /dev/null +++ b/mqttd/etc/libetc.a Binary files differ diff --git a/mqttd/etc/makefile b/mqttd/etc/makefile new file mode 100644 index 0000000..2b5da3b --- /dev/null +++ b/mqttd/etc/makefile @@ -0,0 +1,17 @@ + +PWD=$(shell pwd ) + +LIBNAME=$(shell basename ${PWD} ) +PROJPATH=$(shell dirname ${PWD} ) + +CFLAGS+=-I${PROJPATH} + +all: clean + @rm -f *.o + @${CROSS_COMPILE}gcc ${CFLAGS} -c *.c + ${CROSS_COMPILE}ar -rcs lib${LIBNAME}.a *.o + +clean: + @rm -f *.o + @rm -f *.a + diff --git a/mqttd/etc/mqttd.conf b/mqttd/etc/mqttd.conf new file mode 100644 index 0000000..4365594 --- /dev/null +++ b/mqttd/etc/mqttd.conf @@ -0,0 +1,48 @@ + +[logger] + +# 日志记录文件 +file=/tmp/mqttd.log + +# 日志级别: 0:Disable 1:Fatal 2:ERROR 3:warnning 4:Normal 5:Debug 6:Infor 7:Trace +level=5 + +# 日志回滚大小 +size=1024 + + + +[broker] + +# broker 服务器地址和端口号 +hostname="master.iot-yun.com" +port=10883 + +# broker 认证连接的用户名和密码 +username="lingyun" +password="lingyun-emb" + +# broker给subsciber和publisher发送PING报文保持 keepalive 的时间周期,单位是秒 +keepalive=30 + + +# Qos0: 发送者只发送一次消息,不进行重试,Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息 +# Qos1: 发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息 +# Qos2: Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次 + +[publisher] + +pubTopic="$Sys/Studio/Uplink" +pubQos=2 + +# Publisher上报传感器数据的周期 +interval=60 + + +[subsciber] + +subTopic="$Sys/Studio/Downlink" +subQos=0 + + + diff --git a/mqttd/main.c b/mqttd/main.c index f8868d2..982b34a 100644 --- a/mqttd/main.c +++ b/mqttd/main.c @@ -21,36 +21,9 @@ #include "proc.h" #include "hal.h" +#include "conf.h" + #define DAEMON_PIDFILE "/tmp/.mqtt.pid" - -#define MQTT_SYS_TOPIC "$Sys/Studio/" -#define MQTT_SYS_DLINK_TOPIC MQTT_SYS_TOPIC"Downlink" -#define MQTT_SYS_ULINK_TOPIC MQTT_SYS_TOPIC"Uplink" - -enum -{ - Qos0, /* 发送者只发送一次消息,不进行重试,Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息 */ - Qos1, /* 发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息 */ - Qos2, /* Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次 */ -}; - -typedef struct mqtt_ctx_s -{ - /* Broker settings */ - char host[128]; /* MQTT broker server name */ - int port; /* MQTT broker listen port */ - int keepalive; /* MQTT broker send PING message to subsciber/publisher keepalive timeout<seconds> */ - char uid[64]; /* username */ - char pwd[64]; /* password */ - - /* Publisher settings */ - int pubQos; /* Publisher Qos */ - int interval; /* Publish sensor data interval time, unit seconds */ - - /* Subscriber settings */ - int subQos; /* Subscriber Qos */ - -} mqtt_ctx_t; int check_set_program_running(int daemon); @@ -65,24 +38,14 @@ int daemon = 0; pthread_t tid; mqtt_ctx_t ctx; + char *conf="./etc/mqttd.conf"; + int debug = 1; - strcpy(ctx.host, "127.0.0.1"); - ctx.port = 10883; - ctx.keepalive = 60; - strcpy(ctx.uid, "lingyun"); - strcpy(ctx.pwd, "lingyun-emb"); - - ctx.pubQos = Qos0; - ctx.interval = 300; - ctx.subQos = Qos2; - - //if( logger_init("mqttd.log", LOG_LEVEL_DEBUG, 1024) < 0 ) - if( logger_init(DBG_LOG_FILE, LOG_LEVEL_DEBUG, 1024) < 0 ) + if( mqttd_parser_conf(conf, &ctx, debug)<0 ) { - fprintf(stderr, "Logger system initialise failure\n"); + fprintf(stderr, "Parser mqtted configure file failure\n"); return -2; } - log_dbg("Logger system initialise ok\n"); #if 0 if( hal_init() < 0 ) @@ -167,6 +130,7 @@ float temp = 25.64; float rh = 65.35; char light[] = "on"; + int retain = 0; if( result ) { @@ -179,7 +143,7 @@ memset(msg, 0, sizeof(msg)); snprintf(msg, sizeof(msg), "{ \"temp\":\"%.2f\", \"R&H\":\"%.2f%%\" }", temp, rh); - rv = mosquitto_publish(mosq, NULL, MQTT_SYS_ULINK_TOPIC, strlen(msg)+1, msg, ctx->pubQos, 0); + rv = mosquitto_publish(mosq, NULL, ctx->pubTopic, strlen(msg)+1, msg, ctx->pubQos, retain); if( rv ) { log_err("Publisher broadcast message '%s' failure: %d\n", msg, rv); @@ -192,7 +156,7 @@ memset(msg, 0, sizeof(msg)); snprintf(msg, sizeof(msg), "{ \"light\":\"%s\" }", light); - rv = mosquitto_publish(mosq, NULL, MQTT_SYS_ULINK_TOPIC, strlen(msg)+1, msg, ctx->pubQos, 0); + rv = mosquitto_publish(mosq, NULL, ctx->pubTopic, strlen(msg)+1, msg, ctx->pubQos, retain); if( rv ) { log_err("Publisher broadcast message failure: %d\n", rv); @@ -262,7 +226,7 @@ } log_nrml("Subscriber connect to broker server[%s:%d] successfully\n", ctx->host, ctx->port); - mosquitto_subscribe(mosq, NULL, MQTT_SYS_DLINK_TOPIC, 2); + mosquitto_subscribe(mosq, NULL, ctx->subTopic, ctx->subQos); } void sub_disconnect_callback(struct mosquitto *mosq, void *userdata, int result) diff --git a/mqttd/makefile b/mqttd/makefile index 050907b..932c4c9 100644 --- a/mqttd/makefile +++ b/mqttd/makefile @@ -38,8 +38,8 @@ export LDFLAGS -CFLAGS+=-Ihal -Ilylib -LDFLAGS+=-L hal -lhal -Llylib -llylib +CFLAGS+=-Ihal -Ietc -Ilylib +LDFLAGS+=-L hal -lhal -Letc -letc -Llylib -llylib LDFLAGS+=-lmosquitto -lpthread -lm @@ -56,6 +56,7 @@ modules: make -C hal make -C lylib + make ${CFLAGS} -C etc cd ${MQTT_LIBPATH} && bash build.sh binary: ${SRCFILES} -- Gitblit v1.9.1