引入:
以蜂鸣器为例,每次我们增加新的设备,
都需要添加两个新文件:
修改程序代码,手动添加:
缺点: 不利于维护
设备类节点直接通过ini文件配置
什么是.ini文件
ini文件通常以纯文本形式存在,并且包含了一个或多个节(sections)以及每个节下的键值对(keyvalue pairs)。这些键值对用来指定应用程序的各种设置。
比如Linux系统里就有非常多这类格式的文件,如Linux下的打印机服务程序启动配置文
件/lib/systemd/system/cups.service:
举例:
cat /lib/systemd/system/dbus.service
这种.server文件的格式就是 ini格式
[字段]
若干 键值对(key = value)[sesction]
name = key
[Install]
Also=cups.socket cups.path
WantedBy=printer.target multi-user.target
在配置ini之前我们需要 安装ini文件对应的解析库 inih
inih解析库介绍
特点
安装
apt-cache search libinih
sudo apt install libinih-dev
方法二:
(博主方法一没下好,直接上Github下载)
直接到Github上面下载,然后通过FileZilla传送到虚拟机
下载zip文件 --> 解压 --> 传送得到这样一个文件夹
里面内容如下:
示例代码
查看C语言的示例代码
ini的简单使用:
新建一个 文件夹 -- ini
把前面我我们提到的ini.c , ini.h 文件创送过来
gdevice.ini
[lock]
key=0x44
gpio_pin=8
gpio_mode=OUTPUT
gpio_status=HIGH
check_face_status=1
voice_set_status=1[beep]
key=0x45
gpio_pin=9
gpio_mode=OUTPUT
gpio_status=HIGH
check_face_status=0
voice_set_status=1[BR led]
key=0x42
gpio_pin=5
gpio_mode=OUTPUT
gpio_status=HIGH
check_face_status=0
voice_set_status=0[LV led]
key=0x41
gpio_pin=2
gpio_mode=OUTPUT
gpio_status=HIGH
check_face_status=0
voice_set_status=0[fan]
key=0x43
gpio_pin=7
gpio_mode=OUTPUT
gpio_status=HIGH
check_face_status=0
voice_set_status=0
case1 -- 打印信息:
initest.c
/* Example: parse a simple configuration file */#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ini.h"#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0static int handler(void* user, const char* section, const char* name,const char* value)
{printf("section = %s, name = %s, value = %s\n", section, name, value);return 1;
}int main(int argc, char* argv[])
{if (ini_parse("gdevice.ini", handler, NULL) < 0) {printf("Can't load 'gdevice.ini'\n");return 1;}return 0;
}
运行结果
case2 -- 配置设备节点
其实就是把ini文件里面的设备消息,用头插法插入到对应的设备节点里面
initest.c
/* Example: parse a simple configuration file */#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ini.h"
#include "gdevice.h"// 没引入wiringpi库要手动定义宏#ifndef LOW
#define LOW 0
#define HIGH 1
#endif#ifndef OUTPUT
#define OUTPUT 1
#define INPUT 0
#endif#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0static struct gdevice *pdevhead = NULL;static int handler_gdevice(void* user, const char* section, const char* name,const char* value)
{struct gdevice *pdev = NULL;if(NULL == pdevhead){pdevhead = (struct gdevice *)malloc(sizeof(struct gdevice));memset(pdevhead, 0, sizeof(struct gdevice));pdevhead->next = NULL;strcpy(pdevhead->dev_name,section); }//printf("section = %s, name = %s, value = %s\n", section, name, value);else if(0 != strcmp(section, pdevhead->dev_name))// 当section对不上的时候,表示到了下一个设备{// 把新节点(设备)使用头插法插入pdev = (struct gdevice *)malloc(sizeof(struct gdevice));memset(pdev, 0, sizeof(struct gdevice));strcpy(pdev->dev_name,section);pdev->next = pdevhead;pdevhead = pdev;}if(NULL != pdevhead){if(MATCH(pdevhead->dev_name, "key")){sscanf(value, "%x", &pdevhead->key); //把value(string)的值 转为int类型 16进行格式 传递给 pdevhead->key)printf("%d pdevhead->key = 0x%x\n",__LINE__,pdevhead->key);}else if(MATCH(pdevhead->dev_name, "gpio_pin")){pdevhead->gpio_pin = atoi(value);}else if(MATCH(pdevhead->dev_name, "gpio_mode")){if(strcmp(value, "OUTPUT") == 0){pdevhead->gpio_mode = OUTPUT;}else if(strcmp(value, "INPUT") == 0){pdevhead->gpio_mode = INPUT;}else{printf("gpio_mode error\n");}}else if(MATCH(pdevhead->dev_name, "gpio_status")){if(strcmp(value, "LOW") == 0){pdevhead->gpio_mode = LOW;}else if(strcmp(value, "HIGH") == 0){ pdevhead->gpio_mode = HIGH;}else{printf("gpio_status error\n");}}else if(MATCH(pdevhead->dev_name, "check_face_status")){pdevhead->check_face_status = atoi(value); }else if(MATCH(pdevhead->dev_name, "voice_set_status")){pdevhead->voice_set_status = atoi(value);}}return 1;
}int main(int argc, char* argv[])
{struct gdevice *pdev = NULL;//printf("before handler_gdevice %d",__LINE__);if (ini_parse("gdevice.ini", handler_gdevice, NULL) < 0) {printf("Can't load 'gdevice.ini'\n");return 1;}//printf("after handler_gdevice %d",__LINE__);//打印每个设备的信息来测试是否配置成功pdev = pdevhead;while (pdev != NULL){//printf("inside %d",__LINE__);printf("dev_name:%s\n",pdev->dev_name);printf("key:%x\n",pdev->key);printf("gpio_pin:%d\n",pdev->gpio_pin);printf("gpio_mode:%d\n",pdev->gpio_mode);printf("gpio_status:%d\n",pdev->gpio_status);printf("check_face_status:%d\n",pdev->check_face_status); printf("voice_set_status:%d\n",pdev->voice_set_status);pdev= pdev->next;}return 0;
}