• Android WIFI 启动流程(TIP^^)


    前几天因为解决一堆Bug,没时间写。我不会每天都写,就是为了存档一些资料。

    内容来源:工作中接触到的+高手博客+文档(Books)=自己理解

    仅限参考^^

    此博客是上一个<<Android WIFI 启动流程>>的附加项。

    参考博客:http://blog.csdn.net/eoeandroida/article/details/40583353

    配置AP:

     当用户在WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框。

    showAccessPointDialog(state, AccessPointDialog.MODE_INFO);(通过使用WifiDialog.java类对话框)

     连接AP:

    当用户在AccessPointDialog(WifiDialog.java类对话框)中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个AP。

    1 WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK(在WifiNative类中使用)命令并且比较返回值来实现的,

    //Need WifiConfiguration for the AP

    WifiConfiguration config = findConfiguredNetwork(state);

    如果wpa_supplicant没有这个AP的配置信息,则会向wpa_supplicant发送ADD_NETWORK命令来添加该AP

    2 ADD_NETWORK命令会返回一个ID,WifiLayer再用这个返回的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去连接该AP。

    配置IP地址:

    1 当wpa_supplicant成功连接上AP之后,它会向控制通道发送事件,通知连接上AP了,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来处理这个事件。

    2 WifiMonitor再调用WifiStateTracker的notifyStateChange,WifiStateTracker则接着会往自身发送EVENT_DHCP_START消息来启动DHCP去获取IP地址。

    3 然后再广播发送NETWORK_STATE_CHANGED_ACTION这个Intent。

    4 WifiLayer注册了接收NETWORK_STATE_CHANGED_ACTION这个Intent,所以它的相关处理函数handleNetworkStateChanged会被调用,当DHCP拿到IP地址之后,会再发送EVENT_DHCP_SUCCEEDED消息。

    5 WifiLayer处理EVENT_DHCP_SUCCEEDED消息,会再次广播发送。

    至此为止,整个连接过程完成。(找不到WifiLayer类以及EVENT_DHCP_SUCCEEDED消息,但基本思路是这样)

    *wpa_supplicant

    wpa_supplicant

    对应上述结构,基于Android的手机中的WiFi控制分为三大组件:

    1 客户端程序,包括wpa_cli命令行或java图形界面程序,通过socket与wpa_supplicant daemon服务通信,发送命令并接收结果。

    2 wpa_supplicant daemon服务,对应上述中间部分,功能是“上传下达”。所有客户端通过它控制硬件网卡,通过发送字符串命令控制是否扫描AP,提取扫描结果和是否关联AP等操作,同时将驱动的执行状态发送给用户。

       该服务是设计支持多种无线网卡芯片,因此各个厂商共同提供了一个通用接口给wpa_supplicant调用。

    3 网卡驱动。

    在手机内存的/etc/wpa_supplicant.conf中,我们可以直接看到WIFI支持的网络类型,每种类型都有例子,比如:

    #Both WPA-PSK and WPA-EAP is accepted. Only CCMP is accepted as pairwise and

    # group cipher.

    #network={

    # ssid="example"

    # bssid=00:11:22:33:44:55

    # proto=WPA RSN

    # key_mgmt=WPA-PSK WPA-EAP

    # pairwise=CCMP

    # group=CCMP

    # psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb

    #}

    不同类型的网络,不同的参数等等,应有尽有。

  • 相关阅读:
    SQL命令
    MySQL、Oracle、SQL Server
    函数调用
    php 读取图片显示在页面上 demo
    浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
    jquery $.ajax()方法
    HTML 字符实体
    php 内置支持的标签和属性
    java-03 变量与运算符
    java-02 JDK安装与环境变量配置&安装编程IDE
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/5222519.html
Copyright © 2020-2023  润新知