最近用MQTT的mosquitto库连接多个云平台(阿里云、华为云、腾讯云),但是它们三个平台的连接配置信息都不一样,所以使用起来很不便。最后了解到有iniparser这个库,最后用一个ini文件就可以配置不同云平台的信息了,而且如果要某云平台的配置信息,我也不用改源码,直接改ini配置文件即可。
- 一、概述
- 二、语法
- 三、API
- iniparser.h的API
- dictionary.h的API
- 实例
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#include #include "iniparser.h" int main() { dictionary *ini; ini = iniparser_load("./Ali.ini"); //打印第一个section名 printf("%sn", iniparser_getsecname(ini, 0)); //获取整数 int port = iniparser_getint(ini, "mqtt_server_addr:port", -1); printf("port:%dn", port); //某个key的值 const char *user_name = iniparser_getstring(ini, "client_id:id", "NULL"); printf("user_name:%sn", user_name); //修改ini文件里面某个key的值 iniparser_set(ini, "mqtt_server_addr:port", "666"); port = iniparser_getint(ini, "mqtt_server_addr:port", -1); printf("port:%dn", port); return 0; }
运行结果:
mqtt_server_addr port:1883 user_name:a1qMSl93zOd.illumination|securemode=2,signmethod=hmacsha256,timestamp=1651067157548| port:666



