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

本文介绍了如何在openwrt的DESIGNATED DRIVER版本中,利用uci C API来获取和修改WiFi参数,特别是SSID。在尝试修改SSID时遇到问题,虽然uci_set和uci_commit返回成功,但实际修改并未生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


1、基于OpenWrt开发,编写一个ARP扫描的服务程序arpsd,用于定时扫描指定网段的主机。ARP扫描需要通过socket编程收发ARP包来实现。 2、arpsd使用uci保存配置,配置参数包括:扫描周期(秒)、有效期(秒)、发包间隔(毫秒)、起始IP、结束IP。 例如可以指定192.168.1.100-192.168.1.200,每格60秒扫描一遍,发包间隔100毫秒,如果网络中有192.168.1.101192.168.1.102两台主机,则扫描结果就是这两个IP地址及对应的MAC地址。 扫描的结果需要在内存中管理维护,一个ARP条目如果超过有效期时间都未被再次扫描到则删除掉该条目。 3、arpsd需要提供ubus服务接口,至少提供以下接口: reload_config(重载配置)、start_scan(开始一次扫描)、stop_scan(停止扫描)、get_scan_status(扫描状态)、get_scan_result(获取最近一次的扫描结果)、clear_result(清楚历史结果)。 4、每次发现一台新的主机(之前扫描时未发现的),通过ubus事件把相关信息发送出来。 5、写一个测试程序test_arpsd,通过C代码调用ubus/uciAPI的方式(不能直接调用ubusuci命令),对各部分功能接口进行测试。 6、在Network标签下添加一个子页面,标题为ARP Scanner。可以在该web页面上进行以下操作: 修改上述配置参数并生效、执行或终止一次扫描、获取并显示上一次扫描结果。 7、编写为Openwrt的一个软件包,包含所有的c、shell、lua、html代码及Makefile文件
最新发布
07-02
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值