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

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


【读wifi参数中的ssid】

[cpp]  view plain  copy
  1. int getWirelessCfgValue(char *name,char *value, int valueBufLen)  
  2. {  
  3.     if (NULL == name || NULL == value)  
  4.     {  
  5.         return RC_PROC_FAIL;  
  6.     }  
  7.   
  8.     struct uci_context * uciCtx = uci_alloc_context();  
  9.     char * pValueData = NULL;  
  10.     struct uci_package * pkg = NULL;    
  11.     struct uci_element * e;  
  12.     const char * NETWORK_UCI_CFG_NAME = "wireless";  
  13.   
  14.     if (UCI_OK != uci_load(uciCtx, NETWORK_UCI_CFG_NAME, &pkg))    
  15.         goto cleanup;  
  16.     
  17.     uci_foreach_element(&pkg->sections, e)    
  18.     {    
  19.         struct uci_section *s = uci_to_section(e);    
  20.         if (NULL != (pValueData = uci_lookup_option_string(uciCtx, s, name)))    
  21.         {  
  22.             strncpy(value, pValueData, valueBufLen);  
  23.             printf("get wireless cfg ok, %s: %s\n", name, value);  
  24.         }  
  25.     }    
  26.       
  27.     uci_unload(uciCtx, pkg);    
  28.       
  29. cleanup:    
  30.     uci_free_context(uciCtx);    
  31.     uciCtx = NULL;   
  32.   
  33.     return RC_PROC_SUCC;  
  34. }  


【修改WIFI参数中的ssid】

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

[cpp]  view plain  copy
  1. int setWirelessCfgValue(char *name,char *value)  
  2. {  
  3.     if (NULL == name || NULL == value)  
  4.     {  
  5.         return RC_PROC_FAIL;  
  6.     }  
  7.   
  8.     struct uci_context * ctx = uci_alloc_context();  
  9.     if (NULL == ctx)  
  10.         printf("setWirelessCfgValue uci_alloc_context error\n");  
  11.       
  12.     int ret = 0;  
  13.     #if 0  
  14.     struct uci_ptr ptr;  
  15.     memset(&ptr, 0, sizeof(ptr));  
  16.     ptr.package = "wireless",    
  17.     ptr.section = "@wifi-iface[0]",    
  18.     ptr.option = name,    
  19.     ptr.value = value,    
  20.     #else  
  21.     struct uci_ptr ptr;  
  22.     memset(&ptr, 0, sizeof(ptr));  
  23.     char uciOption[128];  
  24.     memset(uciOption, 0, sizeof(uciOption));  
  25.     snprintf(uciOption, sizeof(uciOption)-1, "wireless.@wifi-iface[0].%s", name);  
  26.     printf("uci_lookup_ptr %s\n", uciOption);  
  27.     if(UCI_OK != uci_lookup_ptr(ctx, &ptr, uciOption, true))  
  28.         {  
  29.            uci_perror(ctx, "no found!\n");  
  30.            return RC_PROC_FAIL;  
  31.         }  
  32.     printf("uci_lookup_ptr ok: %s.%s.%s\n",   
  33.         ptr.package, ptr.section, ptr.option);  
  34.     ptr.value = value;  
  35.     #endif  
  36.       
  37.     printf("change cfg: %s.%s.%s, value(%s)\n",   
  38.                 ptr.package, ptr.section, ptr.option, ptr.value);  
  39.     ret = uci_set(ctx,&ptr);  
  40.     printf("uci_set ret(%d)\n", ret);  
  41.     if (0 == ret){  
  42.         ret = uci_commit(ctx, &ptr.p, false);  
  43.         printf("uci_commit ret(%d)\n", ret);  
  44.     }  
  45.     uci_unload(ctx,ptr.p);  
  46.     uci_free_context(ctx);  
  47.       
  48.     printf("set wireless cfg end, %s: %s\n", name, value);  
  49.     return RC_PROC_SUCC;  
  50. }  


【main函数】

[cpp]  view plain  copy
  1. int main(int argc , char** argv)  
  2. {  
  3.     char ssidStr[64];  
  4.         memset(ssidStr, 0, sizeof(ssidStr));  
  5.     getWirelessCfgValue("ssid",ssidStr, sizeof(ssidStr));  
  6.     setWirelessCfgValue("ssid","miva_hello_TEST");  
  7.     getWirelessCfgValue("ssid",ssidStr, sizeof(ssidStr));  
  8.       
  9.     return 0;  
  10. }  


执行结果:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值