2012-10-19 43 views
3

我设法扫描无线网络并在我的应用程序中获取扫描结果。但有没有一种方法可以使用我的应用程序本身连接到它们?我想知道是否需要为我想连接的网络指定加密类型?我的要求是连接到任何无线网络,而不考虑它的加密类型?如何连接到android的无线网络?

任何想法? 谢谢

+0

你是什么意思? –

+0

如果你知道它的IP地址,你可以扫描一台打印机(wifi)。如果是,那么plz帮助我。我是新手。 – MGDroid

回答

4

连接到无线AP来实现遵循的步骤需要:

  1. 扫描WiFi

    确保您有适当的AP。请记住,您必须为安全AP提供密码。假设你知道巫AP你喜欢,现在我们将其他步骤:

  2. 创建新配置文件

    我们需要必须支持有关的信息:

什么类型的AP应是: 开放地点, WEP, WPA, (或WPA2),与共享密钥认证, WPA2企业(RADIUS服务器认证)

优先 - 优先确定给予由的wpa_supplicant网络 偏好选择的接入点,用以 关联时(I设置默认1000 )

SSID - AP Name

密码 - 如果它是安全的AP。

这里是一个片段的方法证明了该技术:

我用单enum TEncMode encMode为switch语句

.... 
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; 

现在我们根据我们的requst配置新的AP。现在,让我们创建它:

  1. 创建新的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后将dissapear m_WifiManager.saveConfiguration();

所以非常好,我们可以等待android连接到我们的新AP,或者我们可以自己做。

  1. 创建并连接到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需要多长时间。但是我们禁用了所有其他接入点并启用了新接入点。例如,我们可以从谷歌获得HTTP响应,以确保我们的AP具有互联网。

问我加入这个方法:

/** 
* 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(); 
} 
+0

你是什么意思由TEncMode?你能解释一下我究竟是什么吗?谢谢 –

+0

其实际的加密类型AP的单枚'enum'。我编辑我的例子,见上文末尾 –

+0

嘿,麻烦我得到这个编译错误,说“该方法convertToQuotedString(字符串)是未定义的类型TextUtils” –

1

我知道的唯一的事情就是检查IP地址以确定您连接的位置。我会想象,选择SSID需要使用设备的接口(即向WiFi服务发出意图,而不是自己选择)。

对于它的价值,及时发现我连在哪里,我用的是这样的:

package com.nifty.android.initialization; 

import android.content.Context; 
import android.net.wifi.WifiManager; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

import com.nifty.android.R; 
import com.nifty.android.preferences.Preferences; 

public class NetworkDetector { 
    Context mContext = null; 
    Preferences mPrefs = null; 

    public static final String NONE    =  "none"; 
    public static final String HI_SPEED   =  "hiSpeed"; 
    public static final String MED_SPEED   =  "medSpeed"; 
    public static final String LOW_SPEED   =  "lowSpeed"; 

    public NetworkDetector(Context aContext) { 
      mContext = aContext; 
      mPrefs = new Preferences(aContext); 

      WifiManager lWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); 
      TelephonyManager lTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); 

      String netSpeed = null; 

      if((lWifiManager.isWifiEnabled() && lWifiManager.getConnectionInfo() != null && lWifiManager.getConnectionInfo().getIpAddress() != 0)) { 
        netSpeed = HI_SPEED; 
      } else { 
        if(lTelephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS && lTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED) { 
          netSpeed = MED_SPEED; 
        } else { 
          if(( lTelephonyManager != null && lTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED)){ 
            netSpeed = LOW_SPEED; 
          } else { 
            netSpeed = NONE; 
          } 
        } 
      } 

      mPrefs.networkSpeed(netSpeed); 
      } 
    } 
+0

嗯,我认为如果您可以使用设备的接口扫描它,则必须能够从应用程序进行连接。需要读取它 –

+0

@泰德柯林斯可以扫描打印机(无线),如果你知道它的IP地址。如果是,那么plz帮助我。我是新手。 – MGDroid

+0

这是一个很好的问题。你应该考虑把它作为一个单独的问题,尽管(而不是评论,所以其他人可以找到它)。同时,我会看看我能否弄清楚如何做到这一点。 –

相关问题