记录一下最近做Wifi相关知识~
第一步打开我们的Wifi管理器了~
用到的类:
WifiMangerWrapper
mWifiMangerWrapper.setWifiEnabled(true);
注意该方法是异步的,所以你必须等到真正执行完毕之后才能去扫描Wifi信息(我目前的做法是开启一个线程去不断检测当前Wifi是否可用)
扫描Wifi信息:
开始扫描
mWifiMangerWrapper.startScan();
获取Wifi信息
wifiList = mWifiMangerWrapper.getScanResults();
返回的是一个实体bean,带有Wifi相关信息
/** The network name. */
public String SSID;
/** Ascii encoded SSID. This will replace SSID when we deprecate it. @hide */
public WifiSsid wifiSsid;
/** The address of the access point. */
public String BSSID;
/**
* Describes the authentication, key management, and encryption schemes
* supported by the access point.
*/
public String capabilities;
/**
* The detected signal level in dBm. At least those are the units used by
* the TI driver.
*/
public int level;
/**
* The frequency in MHz of the channel over which the client is communicating
* with the access point.
*/
public int frequency;
/**
* Time Synchronization Function (tsf) timestamp in microseconds when
* this result was last seen.
*/
public long timestamp;
/**
* The approximate distance to the AP in centimeter, if available. Else
* {@link UNSPECIFIED}.
* {@hide}
*/
public int distanceCm;
/**
* The standard deviation of the distance to the AP, if available.
* Else {@link UNSPECIFIED}.
* {@hide}
*/
public int distanceSdCm;
/**
* {@hide}
*/
public final static int UNSPECIFIED = -1;
比如 level 就是我们的信号强度了 0 -到 -100 值越小代表信号越好
感觉做Wifi这块就是注册各种广播,然后对广播消息进行处理
addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
这个广播可以获取Wifi在连接过程中的各种状态,比如正在获取IP,正在验证
SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
有以下这些状态
/**
* This state indicates that client is not associated, but is likely to
* start looking for an access point. This state is entered when a
* connection is lost.
*/
DISCONNECTED,
/**
* Interface is disabled
* <p/>
* This state is entered if the network interface is disabled.
* wpa_supplicant refuses any new operations that would
* use the radio until the interface has been enabled.
*/
INTERFACE_DISABLED,
/**
* Inactive state (wpa_supplicant disabled).
* <p/>
* This state is entered if there are no enabled networks in the
* configuration. wpa_supplicant is not trying to associate with a new
* network and external interaction (e.g., ctrl_iface call to add or
* enable a network) is needed to start association.
*/
INACTIVE,
/**
* Scanning for a network.
* <p/>
* This state is entered when wpa_supplicant starts scanning for a
* network.
*/
SCANNING,
/**
* Trying to authenticate with a BSS/SSID
* <p/>
* This state is entered when wpa_supplicant has found a suitable BSS
* to authenticate with and the driver is configured to try to
* authenticate with this BSS.
*/
AUTHENTICATING,
/**
* Trying to associate with a BSS/SSID.
* <p/>
* This state is entered when wpa_supplicant has found a suitable BSS
* to associate with and the driver is configured to try to associate
* with this BSS in ap_scan=1 mode. When using ap_scan=2 mode, this
* state is entered when the driver is configured to try to associate
* with a network using the configured SSID and security policy.
*/
ASSOCIATING,
/**
* Association completed.
* <p/>
* This state is entered when the driver reports that association has
* been successfully completed with an AP. If IEEE 802.1X is used
* (with or without WPA/WPA2), wpa_supplicant remains in this state
* until the IEEE 802.1X/EAPOL authentication has been completed.
*/
ASSOCIATED,
/**
* WPA 4-Way Key Handshake in progress.
* <p/>
* This state is entered when WPA/WPA2 4-Way Handshake is started. In
* case of WPA-PSK, this happens when receiving the first EAPOL-Key
* frame after association. In case of WPA-EAP, this state is entered
* when the IEEE 802.1X/EAPOL authentication has been completed.
*/
FOUR_WAY_HANDSHAKE,
/**
* WPA Group Key Handshake in progress.
* <p/>
* This state is entered when 4-Way Key Handshake has been completed
* (i.e., when the supplicant sends out message 4/4) and when Group
* Key rekeying is started by the AP (i.e., when supplicant receives
* message 1/2).
*/
GROUP_HANDSHAKE,
/**
* All authentication completed.
* <p/>
* This state is entered when the full authentication process is
* completed. In case of WPA2, this happens when the 4-Way Handshake is
* successfully completed. With WPA, this state is entered after the
* Group Key Handshake; with IEEE 802.1X (non-WPA) connection is
* completed after dynamic keys are received (or if not used, after
* the EAP authentication has been completed). With static WEP keys and
* plaintext connections, this state is entered when an association
* has been completed.
* <p/>
* This state indicates that the supplicant has completed its
* processing for the association phase and that data connection is
* fully configured. Note, however, that there may not be any IP
* address associated with the connection yet. Typically, a DHCP
* request needs to be sent at this point to obtain an address.
*/
COMPLETED,
/**
* An Android-added state that is reported when a client issues an
* explicit DISCONNECT command. In such a case, the supplicant is
* not only dissociated from the current access point (as for the
* DISCONNECTED state above), but it also does not attempt to connect
* to any access point until a RECONNECT or REASSOCIATE command
* is issued by the client.
*/
DORMANT,
/**
* No connection to wpa_supplicant.
* <p/>
* This is an additional pseudo-state to handle the case where
* wpa_supplicant is not running and/or we have not been able
* to establish a connection to it.
*/
UNINITIALIZED,
/**
* A pseudo-state that should normally never be seen.
*/
INVALID;
/**
* Returns {@code true} if the supplicant state is valid and {@code false}
* otherwise.
* @param state The supplicant state
* @return {@code true} if the supplicant state is valid and {@code false}
* otherwise.
*/
特别是如果连接一个有密码的Wifi,如果密码错误导致验证失败,也是在这里获取的
int wifistate = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
之前做的是时候就是在这个地方卡了一下,不知道怎么得到当Wifi连接的失败信息
还有其他一些广播:
监听Wifi是否打开或者关闭
addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
网络状态监听
addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
补充一些方法:
断开Wifi连接:
mWifiMangerWrapper.disconnect()
/**
* 获取Wifi的状态
*
* @return
*/
public int getWifiState() {
return mWifiManager.getWifiState();
}
/**
* 从列表中删除指定的网络配置网络。
*
* @param netid
* @return
*/
public void removeNetwork(int netid) {
mWifiManager.removeNetwork(netid);
}
/**
* 获取当前连接的Wifi信息
*
* @return
*/
public WifiInfo getCurrentWifiInfo() {
return mWifiManager.getConnectionInfo();
}