Android4.0 framework 中的流程图如下:
wifiManage中还有其他几个与连接ap相关的函数如下:
public boolean reconnect() 对应于public booleandisconnect()
public boolean reassociate() 重新连接当前热点,即使以及连接状态
public void connectNetwork(int networkId)
public void connectNetwork(WifiConfiguration config)
// 用来取代addNetwork(), enableNetwork(), saveConfiguration(), reconnect()
到后面再来分析下各有什么不同之处。往下走到wpa_supplicant,越过wpa_client.so
Eloop接收到wpa_client的消息后调用回调函数:wpa_supplicant_ctrl_iface_receiveàwpa_supplicant_ctrl_iface_processàwpa_supplicant_ctrl_iface_select_network。一切由此开始。
wpa_supplicant_scan:
a. 如果是disconnected,并且没有扫描需求,直接返回,设置为disconnected状态
b. 查看是否有enabled networks,如果否直接返回,设置状态为INACTIVE
c. 判断是否支持有线认证,直接跳过
d. 判断是否支持MLEM(MAC Layer Management Entity(MLME):作为独立于MAC层之外的实体,包括MAC层的MIB信息,完成MAC层的操作和性能管理),或者ap_scan==2时,最多只能指定扫描一个ssid,否则可以扫描多个ssid
e. 如果scan_req!=2&& connect_without_scan!=null,直接开启pre-selectednetwork without scan step。
f. 选择需要扫描的ssid,选择扫描的频段,选择过滤的ssid
g. 开启扫描请求
h. 释放资源
i. 扫描请求失败则开启timeout的扫描请求。