最近用MQTT的mosquitto库连接多个云平台(阿里云、华为云、腾讯云),但是它们三个平台的连接配置信息都不一样,所以使用起来很不便。最后了解到有iniparser这个库,最后用一个ini文件就可以配置不同云平台的信息了,而且如果要某云平台的配置信息,我也不用改源码,直接改ini配置文件即可。
一、概述
iniparser是针对ini文件的解析器,可对init文件进行解析、设置、删除等操作。ini文件则是一些系统或软件的配置文件。
下载安装:
git clone https://github.com/ndevilla/iniparser
使用:进入下载的文件src目录下,即可看到四个文件,我们把这四个文件放到自己的对应的目录下即可。
二、语法
ini文件的最基本单元是key,每个key都有一个名称(name)和对应的值(value),下面是一个key:
name:value
另外,我们可以将不同的key组成一个组,即section。组名要独立一行,并用中括号括起来:
[section]
name:value
一个section的作用域会在下一个section声明的地方结束,如果没有下一个section的声明,那么该section的结束地方就是该文件末尾。如果某个section的某个key对应的值,可用section:key来获取,所以不同的section下可有相同的key名。
iniparser的section和key名称不区分大小写。
注释用分号:
;注释语句
所以如果我们key值里面如果用到分号“;”或者其他符号时,那需要用给key值加双引号,避免出现错误:
[client_id]
id = "a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548|"
三、API
iniparser.h的API
//获取dictionary对象的section个数
int iniparser_getnsec(dictionary * d);
//获取dictionary对象的第n个section的名字
char * iniparser_getsecname(dictionary * d, int n);
//保存dictionary对象到file
void iniparser_dump_ini(dictionary * d, FILE * f);
//保存dictionary对象一个section到file
void iniparser_dumpsection_ini(dictionary * d, char * s, FILE * f);
//保存dictionary对象到file
void iniparser_dump(dictionary * d, FILE * f);
//获取dictionary对象某个section下的key个数
int iniparser_getsecnkeys(dictionary * d, char * s);
//获取dictionary对象某个section下所有的key
char ** iniparser_getseckeys(dictionary * d, char * s);
//返回dictionary对象的section:key对应的字串值
char * iniparser_getstring(dictionary * d, const char * key, char * def);
//返回idictionary对象的section:key对应的整形值
int iniparser_getint(dictionary * d, const char * key, int notfound);
//返回dictionary对象的section:key对应的双浮点值
double iniparser_getdouble(dictionary * d, const char * key, double notfound);
//返回dictionary对象的section:key对应的布尔值
int iniparser_getboolean(dictionary * d, const char * key, int notfound);
//设置dictionary对象的某个section:key的值
int iniparser_set(dictionary * ini, const char * entry, const char * val);
//删除dictionary对象中某个section:key
void iniparser_unset(dictionary * ini, const char * entry);
//判断dictionary对象中是否存在某个section:key
int iniparser_find_entry(dictionary * ini, const char * entry) ;
//解析dictionary对象并返回(分配内存)dictionary对象
dictionary * iniparser_load(const char * ininame);
//释放dictionary对象(内存)
void iniparser_freedict(dictionary * d);
//计算关键词的hash值
unsigned dictionary_hash(const char * key);
//创建dictionary对象
dictionary * dictionary_new(int size);
//删除dictionary对象
void dictionary_del(dictionary * vd);
//获取dictionary对象的key值
char * dictionary_get(dictionary * d, const char * key, char * def);
//设置dictionary对象的key值
int dictionary_set(dictionary * vd, const char * key, const char * val);
//删除dictionary对象的key值
void dictionary_unset(dictionary * d, const char * key);
//保存dictionary对象
void dictionary_dump(dictionary * d, FILE * out);
dictionary.h的API
//计算关键词的hash值
unsigned dictionary_hash(const char * key);
//创建dictionary对象
dictionary * dictionary_new(int size);
//删除dictionary对象
void dictionary_del(dictionary * vd);
//获取dictionary对象的key值
char * dictionary_get(dictionary * d, const char * key, char * def);
//设置dictionary对象的key值
int dictionary_set(dictionary * vd, const char * key, const char * val);
//删除dictionary对象的key值
void dictionary_unset(dictionary * d, const char * key);
//保存dictionary对象
void dictionary_dump(dictionary * d, FILE * out);
实例
ini文件
//Ali.ini
[mqtt_server_addr]
host = a1qMSl93zOd.iot-as-mqtt.cn-shanghai.aliyuncs.com
port = 1883
[user]
username = illumination&a1qMSl93zOd
passwd = 8dd6cccbb397e70aa42d3dceb2944d24e0874024db5f1b943539dbea0cc06a
[client_id]
id = "a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548|"
[sub_topic]
topic = /sys/a1qMSl93zOd/illumination/thing/event/property/set
[pub_topic]
topic = /sys/a1qMSl93zOd/illumination/thing/event/property/post
[keepalive]
keepalive = 60
[qos]
qos = 0
C文件
#include <stdio.h>
#include <stdlib.h>
#include "iniparser.h"
int main()
{
dictionary *ini;
ini = iniparser_load("./Ali.ini");
//打印第一个section名
printf("%s\n", iniparser_getsecname(ini, 0));
//获取整数
int port = iniparser_getint(ini, "mqtt_server_addr:port", -1);
printf("port:%d\n", port);
//某个key的值
const char *user_name = iniparser_getstring(ini, "client_id:id", "NULL");
printf("user_name:%s\n", user_name);
//修改ini文件里面某个key的值
iniparser_set(ini, "mqtt_server_addr:port", "666");
port = iniparser_getint(ini, "mqtt_server_addr:port", -1);
printf("port:%d\n", port);
return 0;
}
运行结果:
mqtt_server_addr
port:1883
user_name:a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548|
port:666