精华内容
下载资源
问答
  • WIFI信号强度分析测试仪 Wifi Analyzer v2.4.9汉化版
  • 开发厂商:Home Page 文件格式:APK 软件语言:简体中文 软件性质:免费软件 ...支持多视图分析,各视图之间只需滑动屏幕即可切换,有快速设置通道,在查看数据后不必退出即可立刻选择信道或进行wifi设置。
  • 可以作为WiFi室内定位研究的前期数据,不需要采集,直接使用即可,本人实际做WiFi室内定位时采集所得,该项目公司做了将近一年的时间,数据...(RSSI信号强度,各个房间单数的文件,衰减模型每一米处的信号强度文件)
  • 可用过滤器:WiFi频段,信号强度,安全性和SSID 供应商/ OUI数据库查找 该应用程序具有太多功能,无法一一列举 请注意,WiFi Analyzer不是WiFi密码破解或网络钓鱼工具。 使用技巧 点击标题栏可在2.4 GHz和5 GHz ...
  • 该系统采用单片机硬件技术和Labview软件平台开发了一种基于USB总线的便携式功率计,作为无线信号强度测量设备,以精密电压控制的压控振荡器作为点频信号源,完成对有限空间WIFI无线信号强度数据的采集、接收、分析和...
  • WIFI分析仪源代码

    2017-11-07 17:09:20
    开发WIFI接收信号强度指示,ANDROID应用。WIFI分析仪源代码源程序。
  • 之前找到的源码是linux下的,而且充斥着黑科技(底层了,用socket的混淆模式去抓包然后分析,看的头大),想找到一些写好的接口,在收集后知道有个能用的,native wifi api(wlanapi)。那就试试看吧 目标 :获取本...

    缘由: 最近在写一个涉及到wifi的工具。之前找到的源码是linux下的,而且充斥着黑科技(底层了,用socket的混淆模式去抓包然后分析,看的头大),想找到一些写好的接口,在收集信息后知道有个能用的,native wifi api(wlanapi)。那就试试看吧
    目标 :获取本机可连接的wifi列表,包括ssid,bssid(mac)和延迟情况

    官方文档:这里
    这里有着一个实例,其实已经解决的很好了,直接复制上去就能用(虽然函数本身实现还是黑箱,不过无所谓了)
    官方使用实例

    通过WlanOpenHandle获取handle,然后使用WlanEnumInterfances去获取所有网卡信息,再WlanGetAvailableNetworkList使用把对应网卡下读取到的wifi读取出来

        HANDLE hClient = NULL;
        DWORD dwMaxClient = 2;      //    
        DWORD dwCurVersion = 0;
        DWORD dwResult = 0;
        DWORD dwRetVal = 0;
        int iRet = 0;
    
        WCHAR GuidString[39] = { 0 };
    
        unsigned int i, j, k;
    
        /* variables used for WlanEnumInterfaces  */
    
        PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
        PWLAN_INTERFACE_INFO pIfInfo = NULL;
    
        PWLAN_AVAILABLE_NETWORK_LIST pBssList = NULL;
        PWLAN_AVAILABLE_NETWORK pBssEntry = NULL;
    	//获取handle
    	dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
    	
    	//获取网卡信息
    	dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
    	
    	for (i = 0; i < (int)pIfList->dwNumberOfItems; i++) {
            pIfInfo = (WLAN_INTERFACE_INFO*)&pIfList->InterfaceInfo[i];
    		dwResult = WlanGetAvailableNetworkList(hClient,
                    &pIfInfo->InterfaceGuid,
                    0,
                    NULL,
                    &pBssList);//读取wifi
        }
    

    这里涉及到一个结构体PWLAN_AVAILABLE_NETWORK ,用于存储各个wifi的具体信息,具体定义在wlanapi.h中

    typedef struct _WLAN_AVAILABLE_NETWORK {
        WCHAR strProfileName[WLAN_MAX_NAME_LENGTH];
        DOT11_SSID dot11Ssid;
        DOT11_BSS_TYPE dot11BssType;
        ULONG uNumberOfBssids;
        BOOL bNetworkConnectable;
        WLAN_REASON_CODE wlanNotConnectableReason;
        ULONG uNumberOfPhyTypes;
        DOT11_PHY_TYPE dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER];
        // bMorePhyTypes is set to TRUE if the PHY types for the network
        // exceeds WLAN_MAX_PHY_TYPE_NUMBER.
        // In this case, uNumerOfPhyTypes is WLAN_MAX_PHY_TYPE_NUMBER and the
        // first WLAN_MAX_PHY_TYPE_NUMBER PHY types are returned.
        BOOL bMorePhyTypes;
        WLAN_SIGNAL_QUALITY wlanSignalQuality;
        BOOL bSecurityEnabled;
        DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;
        DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;
        DWORD dwFlags;
        DWORD dwReserved;
    } WLAN_AVAILABLE_NETWORK, *PWLAN_AVAILABLE_NETWORK;
    

    详细解读可以看文档 → 这里

    这里就简单谢谢
    strProfileName
    包含与网络关联的配置文件名称。如果网络没有配置文件,则该成员将为空。如果有多个配置文件与网络相关联,则可见网络列表中将有多个具有相同SSID的条目。配置文件名称区分大小写。该字符串必须以NULL终止。

    简单来叔,若是登录保存过这个wifi(有配置文件),这里就会显示这个wifi的名字。

    dot11Ssid
    一个DOT11_SSID结构,其中包含可见无线网络的SSID。(也就是wifi的名字)

    bNetworkConnectable
    指示网络是否可连接。如果设置为TRUE,则网络是可连接的,否则网络将无法连接。

    wlanSignalQuality
    代表网络信号质量的百分比值。也就是信号强度
    该成员的值介于0到100之间。值0表示实际RSSI信号强度为-100 dbm。值100表示实际RSSI信号强度为-50 dbm。

    bSecurityEnabled
    指示是否在网络上启用了安全性,也就是有没有设密码。值为TRUE表示已启用,否则未启用。

    dwFlags
    包含网络的各种标志。
    WLAN_AVAILABLE_NETWORK_CONNECTED
    该网络当前已连接。
    WLAN_AVAILABLE_NETWORK_HAS_PROFILE
    该网络有一个配置文件。

    值得注意的时,这里面并没有具体的bssid(mac)值,在一番搜索后发现一个方案–》源地址
    在这里提炼下,

    for (j = 0; j < pBssList->dwNumberOfItems; j++)
    {
    	pBssEntry = (WLAN_AVAILABLE_NETWORK *)& pBssList->Network[j];
    
    	PWLAN_BSS_LIST ppWlanBssList;
    
    	DWORD dwResult2 = WlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid,
    		&pBssEntry->dot11Ssid,
    		pBssEntry->dot11BssType,
    		pBssEntry->bSecurityEnabled,
    		NULL,
    		&ppWlanBssList);
    
    	if (dwResult2 == ERROR_SUCCESS)
    	{
    		for (int z = 0; z < ppWlanBssList->dwNumberOfItems; z++)
    		{
    			WLAN_BSS_ENTRY bssEntry = ppWlanBssList->wlanBssEntries[z];
    
    			AString bssid = Printf("%02X:%02X:%02X:%02X:%02X:%02X",
    				bssEntry.dot11Bssid[0],
    				bssEntry.dot11Bssid[1],
    				bssEntry.dot11Bssid[2],
    				bssEntry.dot11Bssid[3],
    				bssEntry.dot11Bssid[4],
    				bssEntry.dot11Bssid[5]);
    
    			vecBSSIDs.push_back(bssid);
    		}
    	}
    }
    

    在这里他在获取了WLAN_AVAILABLE_NETWORK之后,用其调用了WlanGetNetworkBssList函数以获取bssid。
    这里是官方文档:这里

    最后是实际代码,根据实例稍作修改的一个简单版本

    #include <iostream>
    #ifndef UNICODE
    #define UNICODE
    #endif
    
    #include <windows.h>
    #include <wlanapi.h>
    #include <objbase.h>
    #include <wtypes.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // Need to link with Wlanapi.lib and Ole32.lib
    #pragma comment(lib, "wlanapi.lib")
    #pragma comment(lib, "ole32.lib")
    int getwifi() {
        HANDLE hClient = NULL;
        DWORD dwMaxClient = 2;      //    
        DWORD dwCurVersion = 0;
        DWORD dwResult = 0;
        DWORD dwRetVal = 0;
        int iRet = 0;
    
        WCHAR GuidString[39] = { 0 };
    
        unsigned int i, j, k;
    
        /* variables used for WlanEnumInterfaces  */
    
        PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
        PWLAN_INTERFACE_INFO pIfInfo = NULL;
    
        PWLAN_AVAILABLE_NETWORK_LIST pBssList = NULL;
        PWLAN_AVAILABLE_NETWORK pBssEntry = NULL;
    
        int iRSSI = 0;
    
        dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
        
    
        dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
        if (dwResult != ERROR_SUCCESS) {
            wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
            return 1;
        }
        else {
            wprintf(L"Num Entries: %lu\n", pIfList->dwNumberOfItems);
            wprintf(L"Current Index: %lu\n", pIfList->dwIndex);
            for (i = 0; i < (int)pIfList->dwNumberOfItems; i++) {
                pIfInfo = (WLAN_INTERFACE_INFO*)&pIfList->InterfaceInfo[i];
                wprintf(L"  Interface Index[%u]:\t %lu\n", i, i);
                iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR)&GuidString,
                    sizeof(GuidString) / sizeof(*GuidString));
    
                if (iRet == 0)
                    wprintf(L"StringFromGUID2 failed\n");
                else {
                    wprintf(L"  InterfaceGUID[%d]: %ws\n", i, GuidString);
                    //https://baike.baidu.com/item/GUID/3352285?fr=aladdin
                }
                wprintf(L"  Interface Description[%d]: %ws", i,
                    pIfInfo->strInterfaceDescription);
                wprintf(L"\n");
                wprintf(L"  Interface State[%d]:\t ", i); //链接状态
                switch (pIfInfo->isState) {
                case wlan_interface_state_not_ready:
                    wprintf(L"Not ready\n");
                    break;
                case wlan_interface_state_connected:
                    wprintf(L"Connected\n");
                    break;
                case wlan_interface_state_ad_hoc_network_formed:
                    wprintf(L"First node in a ad hoc network\n");
                    break;
                case wlan_interface_state_disconnecting:
                    wprintf(L"Disconnecting\n");
                    break;
                case wlan_interface_state_disconnected:
                    wprintf(L"Not connected\n");
                    break;
                case wlan_interface_state_associating:
                    wprintf(L"Attempting to associate with a network\n");
                    break;
                case wlan_interface_state_discovering:
                    wprintf(L"Auto configuration is discovering settings for the network\n");
                    break;
                case wlan_interface_state_authenticating:
                    wprintf(L"In process of authenticating\n");
                    break;
                default:
                    wprintf(L"Unknown state %ld\n", pIfInfo->isState);
                    break;
                }
                wprintf(L"\n");
    
                dwResult = WlanGetAvailableNetworkList(hClient,
                    &pIfInfo->InterfaceGuid,
                    0,
                    NULL,
                    &pBssList);
    
                if (dwResult != ERROR_SUCCESS) {
                    wprintf(L"WlanGetAvailableNetworkList failed with error: %u\n",
                        dwResult);
                    dwRetVal = 1;
                    // You can use FormatMessage to find out why the function failed
                }
                else {
                    wprintf(L"WLAN_AVAILABLE_NETWORK_LIST for this interface\n");
    
                    wprintf(L"  Num Entries: %lu\n\n", pBssList->dwNumberOfItems);
    
                    for (j = 0; j < pBssList->dwNumberOfItems; j++) {
                        pBssEntry =
                            (WLAN_AVAILABLE_NETWORK*)&pBssList->Network[j];
    
                        wprintf(L"  Profile Name[%u]:  %ws\n", j, pBssEntry->strProfileName);
    
                        wprintf(L"  SSID[%u]:\t\t ", j);
                        if (pBssEntry->dot11Ssid.uSSIDLength == 0)
                            wprintf(L"\n");
                        else {
                            for (k = 0; k < pBssEntry->dot11Ssid.uSSIDLength; k++) {
                                wprintf(L"%c", (int)pBssEntry->dot11Ssid.ucSSID[k]);
                            }
                            wprintf(L"\n");
                        }
    
                        wprintf(L"  BSS Network type[%u]:\t ", j);
                        switch (pBssEntry->dot11BssType) {
                        case dot11_BSS_type_infrastructure:
                            wprintf(L"Infrastructure (%u)\n", pBssEntry->dot11BssType);
                            break;
                        case dot11_BSS_type_independent:
                            wprintf(L"Infrastructure (%u)\n", pBssEntry->dot11BssType);
                            break;
                        default:
                            wprintf(L"Other (%lu)\n", pBssEntry->dot11BssType);
                            break;
                        }
                        PWLAN_BSS_LIST ppWlanBssList;
                        wprintf(L"  BSSID(mac)[%u]:\t ", j);
                        DWORD dwResult2 = WlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid,
                            &pBssEntry->dot11Ssid,
                            pBssEntry->dot11BssType,
                            pBssEntry->bSecurityEnabled,
                            NULL,
                            &ppWlanBssList);
                        if (dwResult2 == ERROR_SUCCESS)
                        {
                            WLAN_BSS_ENTRY bssEntry = ppWlanBssList->wlanBssEntries[0];
    
                            wprintf(L"%02X:%02X:%02X:%02X:%02X:%02X\n",
                                bssEntry.dot11Bssid[0],
                                bssEntry.dot11Bssid[1],
                                bssEntry.dot11Bssid[2],
                                bssEntry.dot11Bssid[3],
                                bssEntry.dot11Bssid[4],
                                bssEntry.dot11Bssid[5]);
                        }
    
                        wprintf(L"  Connectable[%u]:\t ", j);
                        if (pBssEntry->bNetworkConnectable) //指示网络是否可连接。如果设置为TRUE,则网络是可连接的,否则网络将无法连接。
                            wprintf(L"Yes\n");
                        else {
                            wprintf(L"No\n");
                            wprintf(L"  Not connectable WLAN_REASON_CODE value[%u]:\t %u\n", j,
                                pBssEntry->wlanNotConnectableReason);
                        }
    
                        wprintf(L"  Signal Quality[%u]:\t %u (RSSI: %i dBm)\n", j,
                            pBssEntry->wlanSignalQuality, iRSSI);
    
                        wprintf(L"  Security Enabled[%u]:\t ", j);
                        if (pBssEntry->bSecurityEnabled)          //是否启用密码(公共网络或私人?)
                            wprintf(L"Yes\n");
                        else
                            wprintf(L"No\n");
    
                        wprintf(L"  Flags[%u]:\t 0x%x", j, pBssEntry->dwFlags);
                        if (pBssEntry->dwFlags) {
                            if (pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)
                                wprintf(L" - Currently connected");
                            if (pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_HAS_PROFILE)
                                wprintf(L" - Has profile");
                        }
                        wprintf(L"\n");
    
                        wprintf(L"\n");
                    }
                }
            }
    
        }
        if (pBssList != NULL) {
            WlanFreeMemory(pBssList);
            pBssList = NULL;
        }
    
        if (pIfList != NULL) {
            WlanFreeMemory(pIfList);
            pIfList = NULL;
        }
    
        return dwRetVal;
    }
    
    展开全文
  • 该系统采用单片机硬件技术和Labview软件平台开发了一种基于USB总线的便携式功率计,作为无线信号强度测量设备,以精密电压控制的压控振荡器作为点频信号源,完成对有限空间WIFI无线信号强度数据的采集、接收、分析和...
  • WIFI分析

    2013-10-17 22:11:44
    安卓手机专用无线网络分析器。可以查看加密方式和查看网络信号强度
  • wifi连接流程分析

    千次阅读 2012-09-13 17:55:13
    这是Android WIFI Setting/Service/Framwork/JNI到wpa_supplicant的详解 转自:... Wifi 连接部分 ...当用户选择一个AP时会弹出一个AP参数配置对话框,此对话框会显示当前选择的AP信号强度,若此A

    这是Android WIFI Setting/Service/Framwork/JNI到wpa_supplicant的详解

    转自:http://blog.csdn.net/liuying_0408/article/details/7461090

    Wifi 连接部分

     

    当用户选择一个AP时会弹出一个AP参数配置对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。WifiSettings中的 onPreferenceTreeClick会被调用          @Override

        public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {

             //点击AP响应函数

            if (preference instanceof AccessPoint) {

                mSelected = (AccessPoint) preference;

                showDialog(mSelected, false);

            } else if (preference == mAddNetwork) {

                mSelected = null;

                showDialog(null, true);

            } else if (preference == mNotifyOpenNetworks) {

                Secure.putInt(getContentResolver(),

                        Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,

                        mNotifyOpenNetworks.isChecked() ? 1 : 0);

            } else {

                return super.onPreferenceTreeClick(screen, preference);

            }

            return true;

        }

     

    用户配置好之后点击连接按钮,onClick函数会被调用。

    public void onClick(DialogInterface dialogInterface, int button) {

              //点击连接按钮的响应函数

            if (button == WifiDialog.BUTTON_FORGET && mSelected != null) {

                forget(mSelected.networkId);

            } else if (button == WifiDialog.BUTTON_SUBMIT && mDialog != null) {

                WifiConfiguration config = mDialog.getConfig();

     

                if (config == null) {

                    if (mSelected != null && !requireKeyStore(mSelected.getConfig())) {

                        connect(mSelected.networkId);

                    }

                } else if (config.networkId != -1) {

                    if (mSelected != null) {

                        mWifiManager.updateNetwork(config);

                        saveNetworks();

                    }

                } else {

                    int networkId = mWifiManager.addNetwork(config);

                    if (networkId != -1) {

                        mWifiManager.enableNetwork(networkId, false);

                        config.networkId = networkId;

                        if (mDialog.edit || requireKeyStore(config)) {

                            saveNetworks();

                        } else {

                            connect(networkId);

                        }

                    }

                }

            }

     

    连接请求部分

    一.Settings的connect函数响应连接,更新网络保存配置,更新设置当前选择的优先级最高,并

        保存。然后通过enableNetwork使得其他网络不可用来进行连接。最后调用WifiManager的

          reconnect函数连接当前选择的网络。

    二.WifiManager的reconnect函数通过AIDL的Binder机制,调用WifiService的reconnect函数

    三.然后会调用 WifiStateTracker的reconnectCommand函数,通过JNI(android_net_wifi_Wifi)的             

          android_net_wifi_reconnectCommand 函数向WPA_WPASUPPLICANT发送 RECONNECT命令。

    四. android_net_wifi_Wifi通过 doCommand(命令名,响应缓冲,响应缓存大小)调用wifi.c中的

          wifi_command函数来发送命令。

    五.最后通过 wpa_ctrl的wpa_ctrl_request函数向控制通道发送连接命令。

    返回请求部分

    六.当连接上之后WPA_SUPPLICANT会向控制通道发送连接成功命令。wifi.c的

          wifi_wait_for_event函数阻塞调用并返回这个命令的字符串(CONNECTED).

    七.而后WifiMonitor会被执行来处理这个事件,WifiMonitor 再调用 WifiStateTracker的

         notifyStateChange,WifiStateTracker 则接着会往自身发送 EVENT_DHCP_START 消息来启动

        DHCP 去获取 IP 地址,然后广播NETWORK_STATE_CHANGED_ACTION消息,最后由

        WifiSettings类来响应,改变状态和界面信息。

    关键函数功能介绍

    一.connect函数功能

      1.updateNetwork:updateNetwork(config)会将当前选择连接的AP配置信息

       信息传递进去,配置信息有(网络ID等)。如果网络ID-1则重新添加网络配置,然后向

       wpa_supplicant 发送SET_NETWORK命令(即通过这个网络ID设置其他一些相关信息,设置

       SSID,密码等)如果网络配置不为-1则直接执行后面步骤即发送SET_NETWORK命令。

      2.saveNetwork:告诉supplicant保存当前网络配置并更新列表。SaveNetwork会调用WifiService的

         saveConfiguration向wpa_supplicant发送SAVE_CONFIG命令保存当前网络配置信息,

        如果返回false,则向wpa_supplicant重新发送RECONFIGURE命令获取配置信息,如果获取信

     

        息成功后,会Intent一个  NETWORK_IDS_CHANGED_ACTION事件WifiSettings会注册接受

        这个 时间并更新列表。

      3.enableNetwork函数,向系统获取接口名并使得该接口有效。由于之前传递的disableOthers

        为true则向wpa_supplicant发送SELECT_NETWORK(如果传递的为false则发送                

         ENABLE_NETWORK命令),

      4.reconnect函数:连接AP

     

    二.reconnect函数功能:connect函数会调用WifiManager的reconnect然后通过Binder机制调用

       WifiService的reconnect,再由WifiStateTracke调用WifiNative向wpa_supplicant发送

       RECONNECT命令去连接网络,当连接上wpa_supplicant之后会向控制通道发送连接成功的命  

       令,

       wifi_wait_for_event函数阻塞等待该事件的发生,并返回这个命令的字符串(CONNECTED)

      

    三.android_net_wifi_Wifi函数的doCommand函数会调用wifi.c的wifi_command函数将上层的命

       令向wpa_supplicant发送。

      

    四.wifi_wait_for_event函数以阻塞的方式,等待控制通道传递的事件。当有事件传递过来的时候

       该函数会通过wpa_ctrl的wpa_ctrl_recv函数读取该事件,并以字符串形式返回该事件名。

       int wifi_wait_for_event(char *buf, size_t buflen)

    {

                           .......

        result = wpa_ctrl_recv(monitor_conn, buf, &nread);

        if (result < 0) {

            LOGD("wpa_ctrl_recv failed: %s/n", strerror(errno));

            strncpy(buf, WPA_EVENT_TERMINATING " - recv error", buflen-1);

            buf[buflen-1] = '/0';

            return strlen(buf);

        }

        buf[nread] = '/0';

        /* LOGD("wait_for_event: result=%d nread=%d string=/"%s/"/n", result, nread, buf); */

        /* Check for EOF on the socket */

        if (result == 0 && nread == 0) {

            /* Fabricate an event to pass up */

            LOGD("Received EOF on supplicant socket/n");

            strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1);

            buf[buflen-1] = '/0';

            return strlen(buf);

        }

        /*

         * Events strings are in the format

         *

         *     <N>CTRL-EVENT-XXX

         *

         * where N is the message level in numerical form (0=VERBOSE, 1=DEBUG,

         * etc.) and XXX is the event name. The level information is not useful

         * to us, so strip it off.

         */

        if (buf[0] == '<') {

            char *match = strchr(buf, '>');

            if (match != NULL) {

                nread -= (match+1-buf);

                memmove(buf, match+1, nread+1);

            }

        }

        return nread;

    }

     

    五.wpa_ctrl_request,通过socket方式向wpa_supplicant发送命令,以select模式阻塞在

       wpa_supplicant发送和接收。

    int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,char *reply, size_t *reply_len,void(*msg_cb)(char *msg, size_t len))

    {

             .......

                       res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);

                       if (FD_ISSET(ctrl->s, &rfds)) {

                                res = recv(ctrl->s, reply, *reply_len, 0);

                                if (res < 0)

                                         return res;

                                if (res > 0 && reply[0] == '<') {

                                         /* This is an unsolicited message from

                                          * wpa_supplicant, not the reply to the

                                          * request. Use msg_cb to report this to the

                                          * caller. */

                                         if (msg_cb) {

                                                   /* Make sure the message is nul

                                                    * terminated. */

                                                   if ((size_t) res == *reply_len)

                                                            res = (*reply_len) - 1;

                                                   reply[res] = '/0';

                                                   msg_cb(reply, res);

                                         }

                                         continue;

                                }

                                *reply_len = res;

                                break;

                       } else {

                                return -2;

                       }

             }

             return 0;

    }

     

    六.WifiMonitor 维护一个监视线程分发处理底层返回上来的事件

     void handleEvent(int event, String remainder) {

                switch (event) {

                    case DISCONNECTED:

                        handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED, remainder);

                        break;

                    case CONNECTED:

                        handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED, remainder);

                        break;

                    case SCAN_RESULTS:

                        mWifiStateTracker.notifyScanResultsAvailable();

                        break;

                    case UNKNOWN:

                        break;

                }

            }

    此时返回的事件是CONNECTED因此 handleNetworkStateChange会被调用,验证一下BSSID,重新获得networkId

    ,然后调用WifiStateTrackenotifyStateChange通知状态改变了的消息(EVENT_NETWORK_STATE_CHANGED

    接着处理这个消息,会移除可用网络通告,然后通过 configureInterface()的动态获取IP地址。最后

    发送一个NETWORK_STATE_CHANGED_ACTION IntentWifiSetings注册了此Intent因此会响应该它。由updateConnectionState函数响应。

    .updateConnectionState 获取连接信息,更新列表状态,设置为Connected,然后设置当前网络为可用状态

      

       private void updateConnectionState(DetailedState state) {

            /* sticky broadcasts can call this when wifi is disabled */

            if (!mWifiManager.isWifiEnabled()) {

                mScanner.pause();

                return;

            }

     

            if (state == DetailedState.OBTAINING_IPADDR) {

                mScanner.pause();

            } else {

                mScanner.resume();

            }

     

            mLastInfo = mWifiManager.getConnectionInfo();

            if (state != null) {

                mLastState = state;

            }

     

            for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) {

                ((AccessPoint) mAccessPoints.getPreference(i)).update(mLastInfo, mLastState);

            }

     

            if (mResetNetworks && (state == DetailedState.CONNECTED ||

                    state == DetailedState.DISCONNECTED || state == DetailedState.FAILED)) {

                updateAccessPoints();

                enableNetworks();

            }

        }

     

     

     流程图对应的源代码路径为:

     WifiEnabler,WifiSettings对应的路径如下:

     froyo/packages/apps/Settings/src/com/android/settings/

     

    WifiManager,WifiMonitor,WifiStateTracker,WifiNative.对应的源代码路径如下:

    froyo/frameworrks/base/wifi/java/android/net/wifi/

     

    WifiService 对应代码的位置

    froyo/frameworks/base/services/java/com/android/server/

     

    android_net_wifi_Wifi源代码路径如下:

    froyo/frameworks/base/core/jni/

     

    wifi_command,wifi_wait_for_envent源代码路径如下:

    /hardware/libhardware_legacy/wifi/wifi.c

     

    wpa_ctrl_源代码路径如下:

    /external/wpa_supplicant/wpa_ctrl.c

     

    wpa_supplicant源代码路径如下:

    froyo/external/wpa_supplicant/

    展开全文
  • Wifi连接流程分析

    千次阅读 2014-02-17 14:40:23
    当用户选择一个AP时会弹出一个AP参数配置对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。WifiSettings中的 onPreferenceTreeClick会被调用 @Override  public ...

    Wifi 连接部分

     

    当用户选择一个AP时会弹出一个AP参数配置对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。WifiSettings中的 onPreferenceTreeClick会被调用          @Override

        public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {

             //点击AP响应函数

            if (preference instanceof AccessPoint) {

                mSelected = (AccessPoint) preference;

                showDialog(mSelected, false);

            } else if (preference == mAddNetwork) {

                mSelected = null;

                showDialog(null, true);

            } else if (preference == mNotifyOpenNetworks) {

                Secure.putInt(getContentResolver(),

                        Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,

                        mNotifyOpenNetworks.isChecked() ? 1 : 0);

            } else {

                return super.onPreferenceTreeClick(screen, preference);

            }

            return true;

        }

     

    用户配置好之后点击连接按钮,onClick函数会被调用。

    public void onClick(DialogInterface dialogInterface, int button) {

              //点击连接按钮的响应函数

            if (button == WifiDialog.BUTTON_FORGET && mSelected != null) {

                forget(mSelected.networkId);

            } else if (button == WifiDialog.BUTTON_SUBMIT && mDialog != null) {

                WifiConfiguration config = mDialog.getConfig();

     

                if (config == null) {

                    if (mSelected != null && !requireKeyStore(mSelected.getConfig())) {

                        connect(mSelected.networkId);

                    }

                } else if (config.networkId != -1) {

                    if (mSelected != null) {

                        mWifiManager.updateNetwork(config);

                        saveNetworks();

                    }

                } else {

                    int networkId = mWifiManager.addNetwork(config);

                    if (networkId != -1) {

                        mWifiManager.enableNetwork(networkId, false);

                        config.networkId = networkId;

                        if (mDialog.edit || requireKeyStore(config)) {

                            saveNetworks();

                        } else {

                            connect(networkId);

                        }

                    }

                }

            }

     

    连接请求部分

    一.Settings的connect函数响应连接,更新网络保存配置,更新设置当前选择的优先级最高,并

        保存。然后通过enableNetwork使得其他网络不可用来进行连接。最后调用WifiManager的

          reconnect函数连接当前选择的网络。

    二.WifiManager的reconnect函数通过AIDL的Binder机制,调用WifiService的reconnect函数

    三.然后会调用 WifiStateTracker的reconnectCommand函数,通过JNI(android_net_wifi_Wifi)的             

          android_net_wifi_reconnectCommand 函数向WPA_WPASUPPLICANT发送 RECONNECT命令。

    四. android_net_wifi_Wifi通过 doCommand(命令名,响应缓冲,响应缓存大小)调用wifi.c中的

          wifi_command函数来发送命令。

    五.最后通过 wpa_ctrl的wpa_ctrl_request函数向控制通道发送连接命令。

    返回请求部分

    六.当连接上之后WPA_SUPPLICANT会向控制通道发送连接成功命令。wifi.c的

          wifi_wait_for_event函数阻塞调用并返回这个命令的字符串(CONNECTED).

    七.而后WifiMonitor会被执行来处理这个事件,WifiMonitor 再调用 WifiStateTracker的

         notifyStateChange,WifiStateTracker 则接着会往自身发送 EVENT_DHCP_START 消息来启动

        DHCP 去获取 IP 地址,然后广播NETWORK_STATE_CHANGED_ACTION消息,最后由

        WifiSettings类来响应,改变状态和界面信息。

    关键函数功能介绍

    一.connect函数功能

      1.updateNetwork:updateNetwork(config)会将当前选择连接的AP配置信息

       信息传递进去,配置信息有(网络ID等)。如果网络ID-1则重新添加网络配置,然后向

       wpa_supplicant 发送SET_NETWORK命令(即通过这个网络ID设置其他一些相关信息,设置

       SSID,密码等)如果网络配置不为-1则直接执行后面步骤即发送SET_NETWORK命令。

      2.saveNetwork:告诉supplicant保存当前网络配置并更新列表。SaveNetwork会调用WifiService的

         saveConfiguration向wpa_supplicant发送SAVE_CONFIG命令保存当前网络配置信息,

        如果返回false,则向wpa_supplicant重新发送RECONFIGURE命令获取配置信息,如果获取信

     

        息成功后,会Intent一个  NETWORK_IDS_CHANGED_ACTION事件WifiSettings会注册接受

        这个 时间并更新列表。

      3.enableNetwork函数,向系统获取接口名并使得该接口有效。由于之前传递的disableOthers

        为true则向wpa_supplicant发送SELECT_NETWORK(如果传递的为false则发送                

         ENABLE_NETWORK命令),

      4.reconnect函数:连接AP

     

    二.reconnect函数功能:connect函数会调用WifiManager的reconnect然后通过Binder机制调用

       WifiService的reconnect,再由WifiStateTracke调用WifiNative向wpa_supplicant发送

       RECONNECT命令去连接网络,当连接上wpa_supplicant之后会向控制通道发送连接成功的命  

       令,

       wifi_wait_for_event函数阻塞等待该事件的发生,并返回这个命令的字符串(CONNECTED)

      

    三.android_net_wifi_Wifi函数的doCommand函数会调用wifi.c的wifi_command函数将上层的命

       令向wpa_supplicant发送。

      

    四.wifi_wait_for_event函数以阻塞的方式,等待控制通道传递的事件。当有事件传递过来的时候

       该函数会通过wpa_ctrl的wpa_ctrl_recv函数读取该事件,并以字符串形式返回该事件名。

       int wifi_wait_for_event(char *buf, size_t buflen)

    {

                           .......

        result = wpa_ctrl_recv(monitor_conn, buf, &nread);

        if (result < 0) {

            LOGD("wpa_ctrl_recv failed: %s/n", strerror(errno));

            strncpy(buf, WPA_EVENT_TERMINATING " - recv error", buflen-1);

            buf[buflen-1] = '/0';

            return strlen(buf);

        }

        buf[nread] = '/0';

        /* LOGD("wait_for_event: result=%d nread=%d string=/"%s/"/n", result, nread, buf); */

        /* Check for EOF on the socket */

        if (result == 0 && nread == 0) {

            /* Fabricate an event to pass up */

            LOGD("Received EOF on supplicant socket/n");

            strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1);

            buf[buflen-1] = '/0';

            return strlen(buf);

        }

        /*

         * Events strings are in the format

         *

         *     <N>CTRL-EVENT-XXX

         *

         * where N is the message level in numerical form (0=VERBOSE, 1=DEBUG,

         * etc.) and XXX is the event name. The level information is not useful

         * to us, so strip it off.

         */

        if (buf[0] == '<') {

            char *match = strchr(buf, '>');

            if (match != NULL) {

                nread -= (match+1-buf);

                memmove(buf, match+1, nread+1);

            }

        }

        return nread;

    }

     

    五.wpa_ctrl_request,通过socket方式向wpa_supplicant发送命令,以select模式阻塞在

       wpa_supplicant发送和接收。

    int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,char *reply, size_t *reply_len,void(*msg_cb)(char *msg, size_t len))

    {

             .......

                       res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);

                       if (FD_ISSET(ctrl->s, &rfds)) {

                                res = recv(ctrl->s, reply, *reply_len, 0);

                                if (res < 0)

                                         return res;

                                if (res > 0 && reply[0] == '<') {

                                         /* This is an unsolicited message from

                                          * wpa_supplicant, not the reply to the

                                          * request. Use msg_cb to report this to the

                                          * caller. */

                                         if (msg_cb) {

                                                   /* Make sure the message is nul

                                                    * terminated. */

                                                   if ((size_t) res == *reply_len)

                                                            res = (*reply_len) - 1;

                                                   reply[res] = '/0';

                                                   msg_cb(reply, res);

                                         }

                                         continue;

                                }

                                *reply_len = res;

                                break;

                       } else {

                                return -2;

                       }

             }

             return 0;

    }

     

    六.WifiMonitor 维护一个监视线程分发处理底层返回上来的事件

     void handleEvent(int event, String remainder) {

                switch (event) {

                    case DISCONNECTED:

                        handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED, remainder);

                        break;

                    case CONNECTED:

                        handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED, remainder);

                        break;

                    case SCAN_RESULTS:

                        mWifiStateTracker.notifyScanResultsAvailable();

                        break;

                    case UNKNOWN:

                        break;

                }

            }

    此时返回的事件是CONNECTED因此 handleNetworkStateChange会被调用,验证一下BSSID,重新获得networkId

    ,然后调用WifiStateTrackenotifyStateChange通知状态改变了的消息(EVENT_NETWORK_STATE_CHANGED

    接着处理这个消息,会移除可用网络通告,然后通过 configureInterface()的动态获取IP地址。最后

    发送一个NETWORK_STATE_CHANGED_ACTION IntentWifiSetings注册了此Intent因此会响应该它。由updateConnectionState函数响应。

    .updateConnectionState 获取连接信息,更新列表状态,设置为Connected,然后设置当前网络为可用状态

      

       private void updateConnectionState(DetailedState state) {

            /* sticky broadcasts can call this when wifi is disabled */

            if (!mWifiManager.isWifiEnabled()) {

                mScanner.pause();

                return;

            }

     

            if (state == DetailedState.OBTAINING_IPADDR) {

                mScanner.pause();

            } else {

                mScanner.resume();

            }

     

            mLastInfo = mWifiManager.getConnectionInfo();

            if (state != null) {

                mLastState = state;

            }

     

            for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) {

                ((AccessPoint) mAccessPoints.getPreference(i)).update(mLastInfo, mLastState);

            }

     

            if (mResetNetworks && (state == DetailedState.CONNECTED ||

                    state == DetailedState.DISCONNECTED || state == DetailedState.FAILED)) {

                updateAccessPoints();

                enableNetworks();

            }

        }

     

     

     流程图对应的源代码路径为:

     WifiEnabler,WifiSettings对应的路径如下:

     froyo/packages/apps/Settings/src/com/android/settings/

     

    WifiManager,WifiMonitor,WifiStateTracker,WifiNative.对应的源代码路径如下:

    froyo/frameworrks/base/wifi/java/android/net/wifi/

     

    WifiService 对应代码的位置

    froyo/frameworks/base/services/java/com/android/server/

     

    android_net_wifi_Wifi源代码路径如下:

    froyo/frameworks/base/core/jni/

     

    wifi_command,wifi_wait_for_envent源代码路径如下:

    /hardware/libhardware_legacy/wifi/wifi.c

     

    wpa_ctrl_源代码路径如下:

    /external/wpa_supplicant/wpa_ctrl.c

     

    wpa_supplicant源代码路径如下:

    froyo/external/wpa_supplicant/

    展开全文
  • WIFI连接流程分析

    2012-10-12 14:11:35
    当用户选择一个AP时会弹出一个AP参数配置对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。WifiSettings中的onPreferenceTreeClick会被调用 @Override  ...

    Wifi 连接部分

     

    当用户选择一个AP时会弹出一个AP参数配置对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。WifiSettings中的onPreferenceTreeClick会被调用         @Override

        publicbooleanonPreferenceTreeClick(PreferenceScreenscreen,Preferencepreference){

             //点击AP响应函数

            if(preferenceinstanceofAccessPoint){

                mSelected=(AccessPoint)preference;

                showDialog(mSelected,false);

            }elseif(preference==mAddNetwork){

                mSelected=null;

                showDialog(null,true);

            }elseif(preference==mNotifyOpenNetworks){

                Secure.putInt(getContentResolver(),

                        Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,

                        mNotifyOpenNetworks.isChecked()?1:0);

            }else{

                returnsuper.onPreferenceTreeClick(screen,preference);

            }

            returntrue;

        }

     

    用户配置好之后点击连接按钮,onClick函数会被调用。

    publicvoidonClick(DialogInterfacedialogInterface,intbutton){

              //点击连接按钮的响应函数

            if(button==WifiDialog.BUTTON_FORGET&&mSelected!=null){

                forget(mSelected.networkId);

            }elseif(button==WifiDialog.BUTTON_SUBMIT&&mDialog!=null){

                WifiConfigurationconfig=mDialog.getConfig();

     

                if(config==null){

                    if(mSelected!=null&&!requireKeyStore(mSelected.getConfig())){

                        connect(mSelected.networkId);

                    }

                }elseif(config.networkId!=-1){

                    if(mSelected!=null){

                        mWifiManager.updateNetwork(config);

                        saveNetworks();

                    }

                }else{

                    intnetworkId=mWifiManager.addNetwork(config);

                    if(networkId!=-1){

                        mWifiManager.enableNetwork(networkId,false);

                        config.networkId=networkId;

                        if(mDialog.edit||requireKeyStore(config)){

                            saveNetworks();

                        }else{

                            connect(networkId);

                        }

                    }

                }

            }

     

    连接请求部分

    一.Settings的connect函数响应连接,更新网络保存配置,更新设置当前选择的优先级最高,并

        保存。然后通过enableNetwork使得其他网络不可用来进行连接。最后调用WifiManager的

          reconnect函数连接当前选择的网络。

    二.WifiManager的reconnect函数通过AIDL的Binder机制,调用WifiService的reconnect函数

    三.然后会调用 WifiStateTracker的reconnectCommand函数,通过JNI(android_net_wifi_Wifi)的             

          android_net_wifi_reconnectCommand 函数向WPA_WPASUPPLICANT发送RECONNECT命令。

    四. android_net_wifi_Wifi通过doCommand(命令名,响应缓冲,响应缓存大小)调用wifi.c中的

          wifi_command函数来发送命令。

    五.最后通过 wpa_ctrl的wpa_ctrl_request函数向控制通道发送连接命令。

    返回请求部分

    六.当连接上之后WPA_SUPPLICANT会向控制通道发送连接成功命令。wifi.c的

          wifi_wait_for_event函数阻塞调用并返回这个命令的字符串(CONNECTED).

    七.而后WifiMonitor会被执行来处理这个事件,WifiMonitor 再调用 WifiStateTracker的

         notifyStateChange,WifiStateTracker 则接着会往自身发送 EVENT_DHCP_START 消息来启动

        DHCP 去获取 IP 地址,然后广播NETWORK_STATE_CHANGED_ACTION消息,最后由

        WifiSettings类来响应,改变状态和界面信息。

    关键函数功能介绍

    一.connect函数功能

      1.updateNetwork:updateNetwork(config)会将当前选择连接的AP配置信息

       信息传递进去,配置信息有(网络ID等)。如果网络ID-1则重新添加网络配置,然后向

       wpa_supplicant 发送SET_NETWORK命令(即通过这个网络ID设置其他一些相关信息,设置

       SSID,密码等)如果网络配置不为-1则直接执行后面步骤即发送SET_NETWORK命令。

      2.saveNetwork:告诉supplicant保存当前网络配置并更新列表。SaveNetwork会调用WifiService的

         saveConfiguration向wpa_supplicant发送SAVE_CONFIG命令保存当前网络配置信息,

        如果返回false,则向wpa_supplicant重新发送RECONFIGURE命令获取配置信息,如果获取信

     

        息成功后,会Intent一个  NETWORK_IDS_CHANGED_ACTION事件WifiSettings会注册接受

        这个 时间并更新列表。

      3.enableNetwork函数,向系统获取接口名并使得该接口有效。由于之前传递的disableOthers

        为true则向wpa_supplicant发送SELECT_NETWORK(如果传递的为false则发送               

         ENABLE_NETWORK命令),

      4.reconnect函数:连接AP

     

    二.reconnect函数功能:connect函数会调用WifiManager的reconnect然后通过Binder机制调用

       WifiService的reconnect,再由WifiStateTracke调用WifiNative向wpa_supplicant发送

       RECONNECT命令去连接网络,当连接上wpa_supplicant之后会向控制通道发送连接成功的命  

       令,

       wifi_wait_for_event函数阻塞等待该事件的发生,并返回这个命令的字符串(CONNECTED)

      

    三.android_net_wifi_Wifi函数的doCommand函数会调用wifi.c的wifi_command函数将上层的命

       令向wpa_supplicant发送。

      

    四.wifi_wait_for_event函数以阻塞的方式,等待控制通道传递的事件。当有事件传递过来的时候

       该函数会通过wpa_ctrl的wpa_ctrl_recv函数读取该事件,并以字符串形式返回该事件名。

       int wifi_wait_for_event(char *buf, size_t buflen)

    {

                           .......

        result = wpa_ctrl_recv(monitor_conn, buf, &nread);

        if (result < 0) {

            LOGD("wpa_ctrl_recv failed: %s/n", strerror(errno));

            strncpy(buf, WPA_EVENT_TERMINATING " - recv error", buflen-1);

            buf[buflen-1] = '/0';

            return strlen(buf);

        }

        buf[nread] = '/0';

        /* LOGD("wait_for_event: result=%d nread=%d string=/"%s/"/n", result, nread, buf); */

        /* Check for EOF on the socket */

        if (result == 0 && nread == 0) {

            /* Fabricate an event to pass up */

            LOGD("Received EOF on supplicant socket/n");

            strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1);

            buf[buflen-1] = '/0';

            return strlen(buf);

        }

        /*

         * Events strings are in the format

         *

         *     <N>CTRL-EVENT-XXX

         *

         * where N is the message level in numerical form (0=VERBOSE, 1=DEBUG,

         * etc.) and XXX is the event name. The level information is not useful

         * to us, so strip it off.

         */

        if (buf[0] =='<') {

            char *match = strchr(buf,'>');

            if (match != NULL) {

                nread -= (match+1-buf);

                memmove(buf, match+1, nread+1);

            }

        }

        return nread;

    }

     

    五.wpa_ctrl_request,通过socket方式向wpa_supplicant发送命令,以select模式阻塞在

       wpa_supplicant发送和接收。

    int wpa_ctrl_request(struct wpa_ctrl *ctrl,constchar *cmd, size_t cmd_len,char *reply, size_t *reply_len,void (*msg_cb)(char *msg, size_t len))

    {

             .......

                       res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);

                       if (FD_ISSET(ctrl->s, &rfds)) {

                                res = recv(ctrl->s, reply, *reply_len, 0);

                                if (res < 0)

                                         return res;

                                if (res > 0 && reply[0] =='<') {

                                         /* This is an unsolicited message from

                                          * wpa_supplicant, not the reply to the

                                          * request. Use msg_cb to report this to the

                                          * caller. */

                                         if (msg_cb) {

                                                   /* Make sure the message is nul

                                                    * terminated. */

                                                   if ((size_t) res == *reply_len)

                                                           res = (*reply_len) - 1;

                                                   reply[res] = '/0';

                                                   msg_cb(reply, res);

                                         }

                                         continue;

                                }

                                *reply_len = res;

                                break;

                       } else {

                                return -2;

                       }

             }

             return 0;

    }

     

    六.WifiMonitor 维护一个监视线程分发处理底层返回上来的事件

     voidhandleEvent(intevent,Stringremainder){

                switch(event){

                    caseDISCONNECTED:

                        handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED,remainder);

                        break;

                    caseCONNECTED:

                        handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED,remainder);

                        break;

                    caseSCAN_RESULTS:

                        mWifiStateTracker.notifyScanResultsAvailable();

                        break;

                    caseUNKNOWN:

                        break;

                }

            }

    此时返回的事件是CONNECTED因此handleNetworkStateChange会被调用,验证一下BSSID,重新获得networkId

    ,然后调用WifiStateTrackenotifyStateChange通知状态改变了的消息(EVENT_NETWORK_STATE_CHANGED

    接着处理这个消息,会移除可用网络通告,然后通过configureInterface()的动态获取IP地址。最后

    发送一个NETWORK_STATE_CHANGED_ACTION IntentWifiSetings注册了此Intent因此会响应该它。由updateConnectionState函数响应。

    .updateConnectionState获取连接信息,更新列表状态,设置为Connected,然后设置当前网络为可用状态

      

       privatevoidupdateConnectionState(DetailedStatestate){

            /* sticky broadcasts can call this when wifi is disabled */

            if(!mWifiManager.isWifiEnabled()){

                mScanner.pause();

                return;

            }

     

            if(state==DetailedState.OBTAINING_IPADDR){

                mScanner.pause();

            }else{

                mScanner.resume();

            }

     

            mLastInfo=mWifiManager.getConnectionInfo();

            if(state!=null){

                mLastState=state;

            }

     

            for(inti=mAccessPoints.getPreferenceCount()-1;i>=0;--i){

                ((AccessPoint)mAccessPoints.getPreference(i)).update(mLastInfo,mLastState);

            }

     

            if(mResetNetworks&&(state==DetailedState.CONNECTED||

                    state==DetailedState.DISCONNECTED||state==DetailedState.FAILED)){

                updateAccessPoints();

                enableNetworks();

            }

        }

     

     

     流程图对应的源代码路径为:

     WifiEnabler,WifiSettings对应的路径如下:

     froyo/packages/apps/Settings/src/com/android/settings/

     

    WifiManager,WifiMonitor,WifiStateTracker,WifiNative.对应的源代码路径如下:

    froyo/frameworrks/base/wifi/java/android/net/wifi/

     

    WifiService对应代码的位置

    froyo/frameworks/base/services/java/com/android/server/

     

    android_net_wifi_Wifi源代码路径如下:

    froyo/frameworks/base/core/jni/

     

    wifi_command,wifi_wait_for_envent源代码路径如下:

    /hardware/libhardware_legacy/wifi/wifi.c

     

    wpa_ctrl_源代码路径如下:

    /external/wpa_supplicant/wpa_ctrl.c

     

    wpa_supplicant源代码路径如下:

    froyo/external/wpa_supplicant/


    展开全文
  • wifi分析仪是什么?

    千次阅读 2014-06-14 15:24:38
    wifi分析仪是一款可以分析wifi信号强度和信道的工具,通过这些信息,我们能完全掌握使用中的wifi热点。此外,根据监测数据还能协助调整无线路由器,由此到达wifi的理想状态,打破网络不稳定,掉线等境遇。 安装...
  • wifi模块分析

    2014-05-30 14:31:33
    1. 信号强度算法  WifiManager.java [cpp] view plaincopy /** Anything worse than or equal to this will show 0 bars. */ private static final int MIN_RSSI = -100; /** ...
  • 信标包RSSI是接收信号强度指示器,指示接收器接收到的信号功率。 联网接口卡使用RSSI来确定通道中的能量级别。 但是,RSSI值被广泛用于测距和定位目的,其中应保证准确性和可靠性。 但是,先前的研究预测RSSI值会...
  • 好用的PC端wifi分析工具NetSpot免费版

    千次阅读 2019-09-26 09:55:33
    NetSpot是一款十分好用的wifi信号扫面检测工具,它可以将周围的wifi设备统统扫描出来,并且详细的动态的列出这些wifi的详细信息,比如信号强度,信道,band,带宽,ssid,加密方式等等。 这么好的工具你值得拥有。 ...
  • wifi扫描器

    2017-02-23 21:34:43
    定时扫描周围wifi信号,并将扫描到的信息保存到本地,可用于分析定位,wifi信号强度
  • 我目前只能获取当前连接的Wifi的信道和信号强度。 但是我想要Wifi分析仪那种信号评级的功能,可是不知道怎么实现,有没有大神能给说说思路?![图片说明]...
  • Wifi Analyzer

    2013-09-09 18:36:21
    分析当前环境下wifi分布、信道、强度等,并能根据追踪某一特定wifi信号,通过仪表盘和声音显示当前信号强弱
  • WiFi Hopper 是一款无线网络的管理、分析和扫描工具,能够列出无线网络设备检测到的网络,列出包括SSID、AP的MAC地址、信号强度、网络模式、加密方式、频率、通道、物理层、无线AP的制造商、beacon interval等信息,...
  • 导师是做室内定位的,最近让我复现一篇论文中基于图像和WiFi融合定位的实现方法,目前图像定位已经简单的实现了,采用HOG+...1、基于RSSI(Received Signal Strength Indicator,信号接收强度)的,主要有以下两种方...

空空如也

空空如也

1 2 3 4 5
收藏数 91
精华内容 36
关键字:

wifi信号强度分析