问题描述
我已经设法扫描无线网络并在我的应用程序中获得扫描结果.但是有没有办法我可以使用我的应用程序本身连接到他们?我想知道是否需要为我要连接的网络指定加密类型?而我的要求是无论其加密类型如何都可以连接到任何无线网络?
I have managed to scan for wireless networks and obtain scan results in my application. but is there a way i could possibly connect to them using my app itself? I was wondering whether I would have to specify the encryption type for the network i'm trying to connect? and my requirement would be to connect to any wireless network irrespective of it's encryption type?
有什么想法吗?谢谢
推荐答案
要连接到实现以下步骤所需的WiFi AP:
TO connect to WiFi AP needed to implement followed steps:
-
扫描WiFi
请确保您具有适当的AP.请记住,您必须提供密码给受保护的AP.假设您知道您喜欢的女巫AP,现在我们将执行其他步骤:
To be sure that you have appropriate AP. Bear in mind that you must provide password to secured AP. Suppose you know witch AP you prefer and now we are going to other step:
创建新的配置文件
我们需要支持以下信息:
We need must support information about:
AP应该是哪种类型 : 空地, WEP, WPA, (或WPA2),通过共享密钥身份验证, WPA2-Enterprise(RADIUS服务器身份验证)
What type AP should be: Open spot, WEP, WPA, (or WPA2), with shared-key authentication, WPA2-Enterprise (RADIUS Server authentication)
优先级 -优先级确定网络的优先级 由wpa_supplicant选择要使用的访问点时 关联(我将默认设置为1000)
Priority - Priority determines the preference given to a network by wpa_supplicant when choosing an access point with which to associate (I set default 1000)
SSID -AP Name
密码 -如果它是安全的AP.
Password - if it's secured AP.
以下是演示此技术的摘要方法:
Here is a snippets method demonstrating the technique:
我将单个enum TEncMode encMode
用于switch语句
I used single enum TEncMode encMode
for switch statement
....
WifiConfiguration wc = new WifiConfiguration();
wc.allowedAuthAlgorithms.clear();
wc.allowedGroupCiphers.clear();
wc.allowedKeyManagement.clear();
wc.allowedPairwiseCiphers.clear();
wc.allowedProtocols.clear();
switch (encMode) {
case ENC_WEP:
// If password is empty, it should be left untouched
if (!TextUtils.isEmpty(pswd)) {
wc.wepKeys[0] = TextUtil.convertToQuotedString(pswd);
}
wc.wepTxKeyIndex = 0;
wc.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
wc.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
wc.allowedKeyManagement.set(KeyMgmt.NONE);
wc.allowedGroupCiphers.set(GroupCipher.WEP40);
wc.allowedGroupCiphers.set(GroupCipher.WEP104);
break;
case ENC_WPA:
case ENC_WPA2:
wc.allowedGroupCiphers.set(GroupCipher.TKIP);
wc.allowedGroupCiphers.set(GroupCipher.CCMP);
wc.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(PairwiseCipher.CCMP);
wc.allowedPairwiseCiphers.set(PairwiseCipher.TKIP);
wc.allowedProtocols.set(Protocol.RSN);
wc.allowedProtocols.set(Protocol.WPA);
// If password is empty, it should be left untouched
if (!TextUtils.isEmpty(pswd)) {
if (pswd.length() == 64) {
// Goes unquoted as hex
wc.preSharedKey = pswd;
} else {
// Goes quoted as ASCII
wc.preSharedKey = TextUtil.convertToQuotedString(pswd);
}
}
break;
// case ENC_WPA2_ENTERPRISE:
....
// break;
default:
wc.allowedKeyManagement.set(KeyMgmt.NONE);
break;
}
// This is must be quoted according to the documentation
// http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html#SSID
wc.SSID = TextUtil.convertToQuotedString(ssid.toString());
wc.hiddenSSID = false;
wc.priority = prior;
wc.BSSID = null;
wc.status = WifiConfiguration.Status.ENABLED;
目前,我们根据要求配置了新的AP.现在让我们创建它:
For now we configured new AP according to our requst. Now lets create it:
-
仅创建新的AP
....
int res = -1;
WifiManager m_WifiManager = (WifiManager)m_context.getSystemService(Context.WIFI_SERVICE);
....
/** If profile exists, do nothing */
if(ifConnectionProfileExists(ssid) == true){
Log.i(Constants.TAG, "createConnectionProfile :: " + "CREATE_PROFILE ssid=" + ssid + " exists");
}
else{
res = m_WifiManager.addNetwork(wc);
Log.i(Constants.TAG, "createConnectionProfile :: " + " CREATE_PROFILE ssid=" + ssid + " dosn't exist, addNetwork ... res = " + res);
// Don't make to AP high priority to connect
//m_WifiManager.enableNetwork(res, false);
m_WifiManager.saveConfiguration();
if(res != -1){
// profile created
}
else{
// failed to add profile
}
}
如果您跳过此实现,则关闭WiFi后,您创建的AP将消失m_WifiManager.saveConfiguration();
if you skip this implementation, after turn WiFi off your created AP will dissapearm_WifiManager.saveConfiguration();
到目前为止,我们可以等待android连接到新的AP,也可以由我们自己完成
So far so good, we can wait for android to connect to our new AP or we can do it by ourselves
-
创建并连接到AP
int res = -1;
/** If profile exists, do nothing */
if(ifConnectionProfileExists(ssid) == true){
res = getNetIdBySSID(ssid);
}
else{
res = m_WifiManager.addNetwork(wc);
}
// Don't make to AP high priority to connect
boolean b = m_WifiManager.enableNetwork(res, true);
if(b == true){
fixSupplicant();
m_WifiManager.saveConfiguration();
// start connect to AP
}
else{
// failed
}
....
private void fixSupplicant() {
final SupplicantState state = m_WifiManager.getConnectionInfo().getSupplicantState();
boolean isReconnectDone = false;
if ((state == SupplicantState.SCANNING)
|| (state == SupplicantState.DISCONNECTED)
|| (state == SupplicantState.DORMANT)) {
isReconnectDone = m_WifiManager.reconnect();;
}
}
private boolean ifConnectionProfileExists(String ssid){
List<WifiConfiguration> apProfiles = m_WifiManager.getConfiguredNetworks();
// remove profile if exists:
for (int i = 0; i < apProfiles.size(); i++) {
final WifiConfiguration ap = apProfiles.get(i);
if ((ap.SSID != null)) {
// try to find by SSID
if (TextUtils.equals(ap.SSID), ssid) {
return true;
}
}
}
return false;
}
枚举TEncMode
/**
* Represents encryption types modes of access points
*/
public enum TEncMode {
/**
* No encryption (open spot)
*/
ENC_NONE(0),
/*
* General encryption
*/
ENC_UNKNOWN(1),
/**
* WEP
*/
ENC_WEP(2),
/**
* WPA
*/
ENC_WPA(3),
/**
* WPA (or WPA2), with shared-key authentication
*/
ENC_WPA2(4),
/**
* WPA2-Enterprise (RADIUS Server authentication).
*/
ENC_WPA2_ENTERPRISE(5)
;
public static TEncMode
FromIntToEnum(
int value ) throws Exception
{
for ( TEncMode c : TEncMode.values() ) {
if ( c.mId == value ) {
return c;
}
}
throw new AgException( new StringBuilder("Illegal TEncMode: ").append(value).toString() );
}
public int
FromEnumToInt() {
return mId;
}
private TEncMode( int id ){
mId = id;
}
private int mId;
}
仅此而已.可以肯定的是,您可以侦听WiFi状态更改以捕获CONNECTED
事件.因为我们不知道设备需要多长时间才能连接到您的AP.但是我们禁用了所有其他AP,并启用了新的AP.之后,我们可以从Google获得HTTP响应,例如,以确保我们的AP可以连接互联网.
That's all. For sure you can listen on WiFi state changed to catch CONNECTED
event. Because we don't know how long it will take to device to connect to your AP. But we disabled all other APs and enabled new one. After we can get HTTP response for example from google to be sure that our AP has internet.
要求我添加此方法:
/**
* Surround the given string in quotes.
*
* @param string The text to surround in quotes.
* @return string wrapped with quotes.
*/
static public String convertToQuotedString(String string){
if (string==null) {
string = "";
}
empty(workBuffer);
workBuffer.append("\"");
workBuffer.append(string);
workBuffer.append("\"");
return workBuffer.toString();
}
这篇关于如何在Android中连接到无线网络?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!