wifi学习记录

/external/wpa_supplicant_8/wpa_supplicant/ctrl_iface.c

该类是底层用于对接上层com.android.server.wifi.WifiNative类

WifiNative 通过链接库文件libwifi-service.so

/* Native functions are defined in libwifi-service.so */
        System.loadLibrary("wifi-service");

通过doBooleanCommandNative方法,向ctrl_iface传入操作命令字符串,从而起到方法调用的动能。

举例要添加一个wifi network,则需要上层WifiNative点用ctrl_iface的wpa_supplicant_ctrl_iface_process并传入ADD_NETWORK命令字符串以及相关的参数(网络编号)

else if (os_strcmp(buf, "ADD_NETWORK") == 0) {
reply_len = wpa_supplicant_ctrl_iface_add_network(
wpa_s, reply, reply_size);
}

这中间还经由ctrl_iface_unix.c文件的wpa_supplicant_ctrl_iface_receive方法


我wifi完成添加网络的调用步骤:

WifiNative

ctrl_iface_unix : wpa_supplicant_ctrl_iface_receive

ctrl_iface : wpa_supplicant_ctrl_iface_process

ctrl_iface : wpa_supplicant_ctrl_iface_add_network

这里面实际上真正的添加网络操作在wpa_supplicant_ctrl_iface_add_network里

wpa_supplicant_ctrl_iface_add_network

首先ssid = wpa_config_add_network(wpa_s->conf);添加网络,并返回一个ssid,ssid代表了该网络的身份标识。

然后通过wpa_config_set_network_defaults初始化wifi网络信息.。(config.c::wpa_config_set_network_defaults)

/**
 * wpa_config_set_network_defaults - Set network default values
 * @ssid: Pointer to network configuration data
 */
void wpa_config_set_network_defaults(struct wpa_ssid *ssid)


然后SET_NETWORK流程查看:

} else if (os_strncmp(buf, "SET_NETWORK ", 12) == 0) {
if (wpa_supplicant_ctrl_iface_set_network(wpa_s, buf + 12))

最终调用:wpa_supplicant_ctrl_iface_update_network

ret = wpa_config_set(ssid, name, value, 0); 设置值。

根据name判断是否是‘psk’和'priority',做相应的处理

if ((os_strcmp(name, "psk") == 0 &&
    value[0] == '"' && ssid->ssid_len) ||
   (os_strcmp(name, "ssid") == 0 && ssid->passphrase))
wpa_config_update_psk(ssid);
else if (os_strcmp(name, "priority") == 0)
wpa_config_update_prio_list(wpa_s->conf);

其中wpa_config_update_prio_list具体实现如下:

int wpa_config_update_prio_list(struct wpa_config *config)    (config.c::wpa_config_set_network_defaults)
{
struct wpa_ssid *ssid;
int ret = 0;


os_free(config->pssid);
config->pssid = NULL;
config->num_prio = 0;


ssid = config->ssid;
while (ssid) {
ssid->pnext = NULL;
if (wpa_config_add_prio_network(config, ssid) < 0)
ret = -1;
ssid = ssid->next;
}


return ret;
}

enable wifi network

将会调用到wpa_supplicant.c文件,wpa_supplicant_enable_network,wpa_supplicant_enable_one_network, 然后会启动scan,

wpa_supplicant_req_scan(wpa_s, 0, 0);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WIFI模块转换学习笔记 WIFI模块转换是一种将串口信号转换为WIFI信号的技术,可以实现无线通信和远程控制。WIFI模块通常包括芯片和天线两部分,芯片负责信号处理和转换,天线负责信号发射和接收。在学习WIFI模块转换之前,需要了解WIFI技术的基础知识和串口通信的基本原理。 1. WIFI技术的基础知识 WIFI技术是一种无线局域网技术,可以实现电子设备之间的无线通信。WIFI技术使用了IEEE 802.11协议,包括多种不同的标准,如IEEE 802.11a、IEEE 802.11b、IEEE 802.11g、IEEE 802.11n和IEEE 802.11ac等。这些标准都支持不同的频率、速率和传输距离,可以根据具体需求进行选择。 2. 串口通信的基本原理 串口通信是一种通过串行通信协议将数据传输到计算机的方法,其中数据位、停止位和奇偶校验位等参数会影响通信成功率。串口通信通常使用RS-232或RS-485标准通信协议。在Arduino开发板中,可以使用串口库函数来实现串口通信。 3. WIFI模块转换的基本原理 WIFI模块转换是一种将串口信号转换为WIFI信号的技术,可以实现无线通信和远程控制。常见的WIFI模块包括ESP8266和ESP32等。这些WIFI模块可以通过简单的AT指令控制,实现WIFI信号的连接和传输。在Arduino开发板中,可以使用ESP8266库或ESP32库函数来控制WIFI模块。 4. WIFI模块转换的实验 为了学习WIFI模块转换,我们可以进行一个简单的实验。首先,我们需要准备一个WIFI模块,如ESP8266或ESP32。接着,我们需要将WIFI模块连接到Arduino开发板中,可以使用杜邦线将WIFI模块的串口引脚(TX、RX)分别连接到Arduino开发板的数字引脚(D1、D2)上。然后,我们需要编写一个Arduino程序,调用ESP8266库或ESP32库函数,实现WIFI信号的连接和传输。在程序中,我们需要设置WIFI的SSID和密码,以及WIFI模块的AT指令。最后,我们可以使用串口调试助手来监控WIFI信号的传输情况,以确保程序的正确性。 总的来说,学习WIFI模块转换需要了解WIFI技术的基础知识和串口通信的基本原理,以及掌握WIFI模块的使用方法和编程技巧。通过实验的实践,可以更好地理解和应用WIFI模块转换技术,实现无线通信和远程控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值