本文由逍遥子撰写,转发请标注原址:
http://write.blog.csdn.net/postedit/21465011
一、 Mosquito的辅助功能介绍
Mosquitto代码的辅助功能主要包括:log输出功能、配置参数管理功能和内存封装的功能,这三个功能虽不是mosquitto的核心模块,但是却在其源码实现中经常遇到,它们的实现给mosquitto的代码开发带来了很大的方便。
4.1、log输出功能
Mosquitto日志输出功能的实现代码主要在文件/ mosquitto-1.2/src/logging.c中。Mosquitto的log模块具备以下功能:日志分等级输出、日志的多平台输出、日志对各种参数的格式化输出;
mosquitto的日志模块初始化由函数mqtt3_log_init完成,该函数主要完成对日志输出位置以及日志输出等级两个参数的设置。函数mqtt3_log_close完成日志模块的关闭功能。日志模块的输出由函数_mosquitto_log_printf完成,该函数的声明形式为:
int _mosquitto_log_printf(struct mosquitto *mosq, int priority,const char *fmt, ...)
其中第一个参数struct mosquitto *mosq表示某客户端连接所对应的上下文信息,该参数可以为空;第二个参数int priority表示日志的优先级,在mosquitto的配置文件mosquitto.conf中将会配置日志的输出等级,如果传给函数的日志等级低于配置文件中的等级配置,该条日志将不被输出。另外,该函为一可变参数的函数,在使用过程中可以根据需要将参数进行格式化输出。例如下一条日志输出语句:
_mosquitto_log_printf(NULL,MOSQ_LOG_NOTICE, "Client %s disconnected.", client_id);
在该条日志输出语句中,将保存在client_id中的客户端ID格式化到字符串"Client %s disconnected."中作为本条日志输出的内容,本条日志输出的等级为MOSQ_LOG_NOTICE。
4.2、配置参数管理
Mosquitto参数配置功能的实现代码主要在文件mosquitto-1.2/src/conf.c中,配置文件保存路径为:mosquitto-1.2/ mosquitto.conf,在mosquitto程序中主要由结构体structmqtt3_config保存从配置文件中读取的各参数值。Mosquitto的配置参数管理功能主要包括对配置文件的读取和解析、对用户输入参数的解析以及对配置文件结构体的管理三部分
Mosquitto对外提供的操作接口均以“mqtt3_config_”开头,共有以下四个:
(1) mqtt3_config_init
该函数的声明为:
void mqtt3_config_init(struct mqtt3_config *config)
它主要完成对参数config的各结构体成员的初始化工作。
(2) mqtt3_config_cleanup
该函数的声明为:
void mqtt3_config_cleanup(struct mqtt3_config *config)
它主要完成对参数config的各成员的清除、释放等操作。
(3) mqtt3_config_read
该函数的声明为:
int mqtt3_config_read(struct mqtt3_config *config, bool reload)
它主要完成从配置文件中读取各配置参数到结构体config中,具体的配置文件读取工作由函数_config_read_file完成。
(4) mqtt3_config_parse_args
该函数的声明为:
int mqtt3_config_parse_args(struct mqtt3_config *config, intargc, char *argv[])
它主要完成对用户输出参数的解析工作。
Mosquitto的配置文件内部共提供对整形、布尔类型,字符串三种类型的解析函数,这三个解析函数只共内部调用,分别是:_conf_parse_bool、_conf_parse_int、_conf_parse_string。
4.3、内存操作的封装
Mosquitto对内存操作的封装代码主要在文件mosquitto-1.2/src/memory_mosq.c中实现,共实现了对常用的内存申请与释放相关的系统调用函数,共有:_mosquitto_calloc函数是对系统函数calloc的封装,_mosquitto_malloc函数对系统函数malloc的封装,_mosquitto_realloc函数对系统函数realloc的封装,_mosquitto_free函数对系统函数free的封装,_mosquitto_strdup函数对系统函数strdup的封装。在上述封装函数中如果文件中定义了宏REAL_WITH_MEMORY_TRACKING,则这些封装函数只是对系统函数进行封装,不做任何额外操作。如果定义了REAL_WITH_MEMORY_TRACKING宏,则会在内存申请和释放时分别记录所申请或释放内存的大小。