使用uci的C API获得和修改参数

openwrt版本:DESIGNATED DRIVER (Bleeding Edge, r49395)


【读wifi参数中的ssid】

int getWirelessCfgValue(char *name,char *value, int valueBufLen)
{
    if (NULL == name || NULL == value)
    {
        return RC_PROC_FAIL;
    }

	struct uci_context * uciCtx = uci_alloc_context();
	char * pValueData = NULL;
    struct uci_package * pkg = NULL;  
    struct uci_element * e;
	const char * NETWORK_UCI_CFG_NAME = "wireless";

	if (UCI_OK != uci_load(uciCtx, NETWORK_UCI_CFG_NAME, &pkg))  
        goto cleanup;
  
    uci_foreach_element(&pkg->sections, e)  
    {  
        struct uci_section *s = uci_to_section(e);  
        if (NULL != (pValueData = uci_lookup_option_string(uciCtx, s, name)))  
        {
		    strncpy(value, pValueData, valueBufLen);
			printf("get wireless cfg ok, %s: %s\n", name, value);
        }
    }  
	
    uci_unload(uciCtx, pkg);  
	
cleanup:  
    uci_free_context(uciCtx);  
    uciCtx = NULL; 

    return RC_PROC_SUCC;
}


【修改WIFI参数中的ssid】

下面函数中注销的那部分代码一直无法修改ssid成功。 如果对应的option不存在的话,下面的函数应该还需要再修改一下

int setWirelessCfgValue(char *name,char *value)
{
    if (NULL == name || NULL == value)
    {
        return RC_PROC_FAIL;
    }

    struct uci_context * ctx = uci_alloc_context();
	if (NULL == ctx)
		printf("setWirelessCfgValue uci_alloc_context error\n");
	
    int ret = 0;
    #if 0
	struct uci_ptr ptr;
	memset(&ptr, 0, sizeof(ptr));
	ptr.package = "wireless",  
	ptr.section = "@wifi-iface[0]",  
	ptr.option = name,  
	ptr.value = value,  
	#else
	struct uci_ptr ptr;
	memset(&ptr, 0, sizeof(ptr));
	char uciOption[128];
	memset(uciOption, 0, sizeof(uciOption));
	snprintf(uciOption, sizeof(uciOption)-1, "wireless.@wifi-iface[0].%s", name);
	printf("uci_lookup_ptr %s\n", uciOption);
	if(UCI_OK != uci_lookup_ptr(ctx, &ptr, uciOption, true))
        {
           uci_perror(ctx, "no found!\n");
           return RC_PROC_FAIL;
        }
	printf("uci_lookup_ptr ok: %s.%s.%s\n", 
		ptr.package, ptr.section, ptr.option);
	ptr.value = value;
	#endif
	
	printf("change cfg: %s.%s.%s, value(%s)\n", 
				ptr.package, ptr.section, ptr.option, ptr.value);
	ret = uci_set(ctx,&ptr);
	printf("uci_set ret(%d)\n", ret);
	if (0 == ret){
		ret = uci_commit(ctx, &ptr.p, false);
		printf("uci_commit ret(%d)\n", ret);
	}
	uci_unload(ctx,ptr.p);
	uci_free_context(ctx);
	
	printf("set wireless cfg end, %s: %s\n", name, value);
    return RC_PROC_SUCC;
}


【main函数】

int main(int argc , char** argv)
{
	char ssidStr[64];
        memset(ssidStr, 0, sizeof(ssidStr));
	getWirelessCfgValue("ssid",ssidStr, sizeof(ssidStr));
	setWirelessCfgValue("ssid","miva_hello_TEST");
	getWirelessCfgValue("ssid",ssidStr, sizeof(ssidStr));
	
	return 0;
}


执行结果:

get wireless cfg ok, ssid: OpenWrt_7F3CD4
uci_lookup_ptr wireless.@wifi-iface[0].ssid
uci_lookup_ptr ok: wireless.cfg033579.ssid
change cfg: wireless.cfg033579.ssid, value(miva_hello_TEST)
uci_set ret(0)
uci_commit ret(0)
set wireless cfg end, ssid: miva_hello_TEST
get wireless cfg ok, ssid: miva_hello_TEST


你可能感兴趣的:(openwrt)