骁龙820A不但提供可扩展的信息娱乐,图形和多媒体平台。而且通过Wifi等无线接入方式,使得车内具备独立的网络,手机、PAD等设备可以轻松接入到车载网络,实现灵活、保密的可靠连接。
Wi-Fi状态机的连接状态和控制状态
在应用层mWifiStateMachine 这个实例代表着一个Wifi状态机,它定义了wifi的很多状态,通过消息驱动状态的转变。而wifiThread 是一个HandlerThread 的实例,HandlerThread 是一个内部有Looper的线程,wifiThread会一直监听消息,消息到来以后,通过mClientHandler 的handleMessage来处理消息。WifiStateMachineHandler 主要作用是发送和处理wifi状态机相关的消息。
mWifiController 是另一个状态机,是用户控制信息状态,比如wifi设备的开关状态,wifi热点的开关状态等。而mWifiStateMachine 表述wifi连接过程中的具体状态,比如supplicant启动/关闭状态,driver启动/关闭状态等。
SystemServer中启动的Wifi相关的服务有四个,从上往下依次是P2P wifi服务,普通wifi,wifi扫描附近热点的服务以及以太网服务。
Wifi主要过程介绍
首先从setWifiEnabled开始,wifi是一个WifiServiceImpl的客户端,它会通过binder和WifiServiceImpl的实例交互,也就是在WifiService中通过addService方法向系统注册的mImpl对象。
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);
这个方法首先要使用mSettingsStore.handleWifiToggled(enable)来判断wifi状态是否可以切换,不能切换就直接返回。如果wifi状态可以切换,那么接下来会使用mWifiController.sendMessage(CMD_WIFI_TOGGLED);来给mWifiController状态佳发送一条消息,mWifiController状态机控制wifi设备的开关灯状态。
当需要扫描附近的热点AP时,如果wifi状态机正处于开启状态,那么上层的操作会导致wifi状态机接收到一个消息,开启的状态对它处理后,发现需要把wifi状态机切换到scan状态,于是开启状态的exit方法被调用,scan状态的enter方法被调用。切换不应该只是wifi状态机状态的切换,这个过程应该会调用底层的代码真正的把wifi的状态切换到对应的状态。切换过去以后wpa_supplicant会返回响应的事件,这又会导致响应的消息被wifi状态机接受,从而又促使wifi状态机状态的切换。
WAPI-PSK协议连接过程分析
下面我们通过具体的log来分析连接过程。
08-23 02:03:54.711 3210 3268 D WifiAutoJoinController : updateConfigurationHistory add a choice "wapi-psk"WAPI_PSK over "TP-LINK_5G_943A17"NONE choice 60
08-23 02:03:54.711 3210 3268 D WifiAutoJoinController : updateConfigurationHistory add a choice "wapi-psk"WAPI_PSK over "wapi-open"NONE choice 60
08-23 02:03:54.711 3210 3268 D WifiAutoJoinController : updateConfigurationHistory add a choice "wapi-psk"WAPI_PSK over "wapi-psk"WPA_PSK choice 60
08-23 02:03:54.711 3210 3268 E WifiConfigStore: rewrite network history for "wapi-psk"WAPI_PSK
08-23 02:03:54.713 3287 3287 D wpa_supplicant: wlan0: Control interface command 'ENABLE_NETWORK 9'
08-23 02:03:54.714 3287 3287 D wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
08-23 02:03:54.715 3210 3268 E WifiConfigStore: found sortedWifiConfigurations : "wapi_psk"WAPI_PSK
08-23 02:03:54.716 3210 3268 E WifiConfigStore: found sortedWifiConfigurations : "wapi-psk"WAPI_PSK
通过这段log信息从中可以看出在PONLIST中添加新的wapi_psk 无线网,此过程调用可以从frameworks/opt/net/wifi/service/java/com/android/server/wifi/wificonfigstore.java 中体现。
boolean selectNetwork(WifiConfiguration config, boolean updatePriorities, int uid)→>private void buildPnoList()
→>mCachedPnoList.add(network)。
证明可以正常识别wapi_psk server
08-23 02:03:54.716 3210 3268 E WifiConfigStore: found sortedWifiConfigurations : "wapi-psk"WAPI_PSK
08-23 02:03:54.716 3287 3287 D wpa_supplicant: wlan0: Control interface command 'SET HS20 0'
08-23 02:03:54.716 3287 3287 D wpa_supplicant: wlan0: Control interface command 'SAVE_CONFIG'
08-23 02:03:54.726 3287 3287 D wpa_supplicant: wlan0: Control interface command 'SELECT_NETWORK 9'
08-23 02:03:54.726 3287 3287 D wpa_supplicant: wlan0: State: DISCONNECTED -> DISCONNECTED
wpa_supplicant 通过控制命令配置和保存wpa_psk相关信息,并通过SELECT_NETWORK 9,选择wpa_psk网络进行链接。
Hardware/intel/wlan/hostap_wcs/rel/wpa_supplicant/ctrl.iface.c
char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,char *buf, size_t *resp_len)
wpa_psk MAC层的的鉴定(AUTHENTICATING)
08-23 02:03:54.728 3287 3287 D wpa_supplicant: wlan0: State: DISCONNECTED -> AUTHENTICATING
08-23 02:03:54.757 3287 3287 D wpa_supplicant: wlan0: Control interface command 'RECONNECT'
08-23 02:03:54.759 3287 3287 D wpa_supplicant: wlan0: Control interface command 'SET pno 0'
08-23 02:03:54.784 6582 6887 D ap : SECURITY_WAPI_PSK
08-23 02:03:54.784 6582 6887 D ap : SECURITY_WAPI_PSK
08-23 02:03:54.784 6582 6887 D ap : SECURITY_WAPI_PSK
08-23 02:03:54.784 6582 6887 D ap : SECURITY_WAPI_PSK
08-23 02:03:54.839 3287 3287 D wpa_supplicant: wlan0: State: AUTHENTICATING -> ASSOCIATING
当Authentication认证成功后,进入ASSOCIATING状态,最终进入ASSOCIATED。此后就进入密钥交换过程,这个过程和WPA-PSK的四次握手交换密钥过程类似。过程如下
08-23 02:03:54.885 3287 3287 I wpa_supplicant: WAPI: ASUE Rx - invalid src addr, dropping...
08-23 02:03:54.890 3287 3287 D wpa_supplicant: wlan0: State: ASSOCIATING -> ASSOCIATED
08-23 02:03:54.891 3287 3287 D wpa_supplicant: WAPI_ASUE: WAPI_ASUE entering state AUTHENTICATION
08-23 02:03:54.891 3287 3287 D wpa_supplicant: WAPI_ASUE: WAPI_ASUE entering state INITPSK
08-23 02:03:55.885 3287 3287 D wpa_supplicant: WAPI: ASUE Rx - WAI_STYPE_USK_NEGOTIATION_REQ packet
08-23 02:03:55.891 3287 3287 D wpa_supplicant: WAPI_ASUE: WAPI_ASUE entering state USKNEGOTIATING
08-23 02:03:55.919 3287 3287 D wpa_supplicant: WAPI: ASUE Rx - WAI_STYPE_USK_NEGOTIATION_CONF packet
08-23 02:03:55.919 3287 3287 D wpa_supplicant: WAPI_ASUE: WAPI_ASUE entering state USKDONE
08-23 02:03:55.975 3287 3287 D wpa_supplicant: WAPI_ASUE: WAPI_ASUE entering state IDLE
08-23 02:03:55.975 3287 3287 D wpa_supplicant: WAPI: ASUE Rx - WAI_STYPE_MSK_ANNOUNCEMENT packet
08-23 02:03:55.975 3287 3287 D wpa_supplicant: WAPI_ASUE: WAPI_ASUE entering state MSKDONE
这个是后已经获得了USK单播密钥和MSK组播密钥。
08-23 02:03:56.052 3287 3287 D wpa_supplicant: wlan0: State: ASSOCIATED -> COMPLETED
密钥交互完成后则进入COMPLETED状态,MAC层可以正常连接。前面的所以过程与WPA、WAPI-OPEN对比 ,过程基本正常。
DHCP过程
1.发现阶段,即DHCP客户机寻找DHCP服务器的阶段(DhcpClient: Broadcasting DHCPDISCOVER)
2、提供阶段,即DHCP服务器提供IP地址的阶段。(DhcpClient: Received packet: 00:c2:c6:d8:e3:75 OFFER, ip /192.168.0.109)
3、选择阶段,即DHCP客户机选择某台DHCP服务器提供的IP地址的阶段。(DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=192.168.0.109 serverid=192.168.0.1)
4、 确认阶段,即DHCP服务器确认所提供的IP地址的阶段(DhcpClient: Received packet: 00:c2:c6:d8:e3:75 ACK: your new IP )
WAPI连接常见问题分析
1、获取的IP数据包被刷掉,导致DHCPclient无法获取有效数据包。
2、从服务器获取不到IP包,如果在可以正常获取IP包,在wifinative.java中或过滤得到的IP数据包(正常情况下可以得到下面一段log)。
08-20 21:12:42.279 3306 3306 D wpa_supplicant: wlan0: Control interface command 'DRIVER RXFILTER-STOP'
08-20 21:12:42.280 3306 3306 D wpa_supplicant: wlan0: Control interface command 'DRIVER RXFILTER-REMOVE 2'
08-20 21:12:42.281 3306 3306 D wpa_supplicant: wlan0: Control interface command 'DRIVER RXFILTER-START'
总结
骁龙820A的车载应用中Wi-Fi作用巨大,由此可以衍生更加多样和便捷的通信应用,甚至视频和多媒体在线应用也将成为主流。
Qualcomm汽车技术讨论组 QQ群号:566131670