** El lenguaje C lee y escribe archivos de configuración definiendo la estructura UCI
1 、 配置 文件 名称: roaming
#define UCI_ROAM_FILE "/ etc / config / roaming" // 配置 文件
config wlan "wlan0"
opción basicnetwork_name 'siot'
option basicstate 'enable'
option securitysuite 'wpa2'
option securitywpaxauthentication 'psk'
option securitywpaxieee_80211 desactivado '
opción securitywpaxpassphrase' 12345678 '
2. Necesidad de definir una matriz de estructura
KEY Roaming_Conf_Value [6] = {{"basicnetwork_name", 0,0}, \
{"basicstate", 1,0}, \
{"securitysuite", 2,0}, \
{"securitywpaxauthentication", 3,0}, \
{"securitywpaxieee_80211r", 4,0}, \
{"securitywpaxpassphrase", 5,0}};
3. Luego, debe definir la
estructura estática del objeto UCI uci_context ctx = NULL;
4. Luego, escriba una única función de archivo de configuración de escritura;
void write_roam_config (char package_char, char section_char, char roam_conf_name, char roam_conf_value)
{// escribe el archivo de configuración de roaming
int i = 0;
printf ("write_roam_config ....... inicio ..... \ n");
struct uci_package pkg = NULL;
ctx = uci_alloc_context ();
if (UCI_OK != uci_load(ctx, UCI_ROAM_FILE, &pkg))
goto cleanup; //if open false then goto cleanup:
char p[100];
char s[100];
char o[100];
char c[100];
sprintf(p,"%s",package_char); //配置文件名
sprintf(s,"%s",section_char); //wlan0
sprintf(o,"%s",roam_conf_name); //option 对应的名称如:basicnetwork_name
sprintf(c,"%s",roam_conf_value);//value值: siot
struct uci_ptr ptr ={
.package= p,
.section= s,
.option = o,
.value = c,
};
uci_set(ctx, &ptr); //write config
uci_commit(ctx, &ptr.p, false); //save
uci_unload(ctx, ptr.p); //unload
limpieza:
uci_free_context (ctx);
ctx = NULL;
}
5. Lea el archivo de configuración y asigne una función a la matriz de estructura;
void read_config_init ()
{
printf ("read_config_init () está comenzando \ n");
struct uci_package pkg = NULL;
struct uci_element e;
const char *value;
ctx = uci_alloc_context(); //
if (UCI_OK != uci_load(ctx, UCI_ROAM_FILE, &pkg))
goto cleanup;
//foreach "power" element
uci_foreach_element(&pkg->sections, e)
{
struct uci_section *s = uci_to_section(e);
//print section type
//printf("section s's type is %s.\n",s->type);
//if(!strcmp) if(!strcmp("power",s->type));
for(int i=0;i<=5;i++){
if (NULL != (value = uci_lookup_option_string(ctx,\
s, Roaming_Conf_Value[i].name))) {
strcpy(Roaming_Conf_Value[i].value,strdup(value));
//printf("%s's %s is %s.\n",s->e.name,Roaming_Conf_Value[i].name,value);
}
}
}
uci_unload(ctx, pkg);
limpieza:
uci_free_context (ctx);
ctx = NULL;
printf ("read_config_init () es end \ n");
} **