您的位置:首页 > 运维架构

openwrt使用uci C API获取和修改wifi密码

2018-03-21 15:53 2296 查看
openwrt版本:DESIGNATED DRIVER (Bleeding Edge, r49395)

【读wifi参数中的ssid】

[cpp] view plain copyint 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不存在的话,下面的函数应该还需要再修改一下

[cpp] view plain copyint 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函数】

[cpp] view plain copyint 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

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/junglefly/article/details/52415978
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openwrt uci api 教程