Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3398315
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: 嵌入式

2012-12-25 16:34:57

1.wifi热点的创建
   /**
* 创建wifi热点
* @param ssid 热点信息
* @param passwd  密码
* @author wanghongbin
*/
public void startWifiAp(Context context, String ssid, String passwd) {
//关闭wifi
closeWifi();
//关闭热点
closeWifiAp();
//激活热点
invokeWifiAp(ssid, passwd);
}

       /**
* 激活wifi热点
* @param ssid
* @param passwd
* @author wanghongbin
*/
private void invokeWifiAp(String ssid, String passwd) {
try {
Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",
WifiConfiguration.class, boolean.class);
WifiConfiguration netConfig = new WifiConfiguration();

netConfig.SSID = ssid;
netConfig.preSharedKey =   passwd ;
//启动热点
boolean isSuccess = (Boolean)method1.invoke(mWifiManager, netConfig, true);
Log.i(TAG, "whb end startWifiAp isSuccess="+isSuccess);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG, "whb end startWifiAp IllegalArgumentException");
} catch (IllegalAcces***ception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG, "whb end startWifiAp IllegalAcces***ception");
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// onNotifyWifiNotSurpport();
Log.i(TAG, "whb end startWifiAp onNotifyWifiNotSurpport");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG, "whb end startWifiAp SecurityException");
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
onNotifyWifiNotSurpport();
Log.i(TAG, "whb end startWifiAp NoSuchMethodException");
}
}

// 关闭WIFI
public void closeWifi() {
if (mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(false);
}
}

     //作热点之前先关闭wifi热点服务
public  void closeWifiAp( ) {
if (isWifiApEnabled()) {
try {
Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");
method.setAccessible(true);

WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);

Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method2.invoke(mWifiManager, config, false);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAcces***ception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

2.连接热点
  
    /**
* 添加一个网络节点并连接
* @param ssid   wifi节点名称
* @param passwd  密码
* @param type  : TYPE_WEP TYPE_WPA
*/
public void addNetwork(Context context, String ssid, String passwd, int type) {
closeWifiAp();
openWifi();

mConfig = createWifiInfo(ssid, passwd, type);
SSID = ssid;
connectToWifiWithConfiguration(mConfig);
}

     public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds
   public static final int WIFI_SCAN_TIMEOUT = 20 * 1000;
   /**
    * 连接指定热点
    * @param config
    * @return true : 调用函数成功,具体网络状态还得检测
    * @author wanghongbin  这个函数害死人阿,网上看了半天也没人说,最后是看的源代码里的WifiConnectionTest.java才明白需要等待,步步等待,步步惊心
    */
public boolean connectToWifiWithConfiguration(WifiConfiguration config) {
       String ssid = config.SSID;
       config.SSID = "\""+ssid+"\"";

       //If Wifi is not enabled, enable it
       if (!mWifiManager.isWifiEnabled()) {
           Log.v(TAG, "Wifi is not enabled, enable it");
           mWifiManager.setWifiEnabled(true);
       }

       List netList = mWifiManager.getScanResults();
       if (netList == null) {
           Log.v(TAG, "scan results are null");
           // if no scan results are available, start active scan
           mWifiManager.startScan();
           boolean mScanResultIsAvailable = false;
           long startTime = System.currentTimeMillis();
           while (!mScanResultIsAvailable) {
               if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) {
                   return false;
               }
               // wait for the scan results to be available
               synchronized (this) {
                   // wait for the scan result to be available
                   try {
                       this.wait(WAIT_FOR_SCAN_RESULT);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   if ((mWifiManager.getScanResults() == null) ||
                           (mWifiManager.getScanResults().size() <= 0)) {
                       continue;
                   }
                   mScanResultIsAvailable = true;
               }
           }
       }

       netList = mWifiManager.getScanResults();

       for (int i = 0; i < netList.size(); i++) {
           ScanResult sr= netList.get(i);
           if (sr.SSID.equals(ssid)) {
               Log.v(TAG, "found " + ssid + " in the scan result list");
               int networkId = mWifiManager.addNetwork(config);
               // Connect to network by disabling others.
               mWifiManager.enableNetwork(networkId, true);
               mWifiManager.saveConfiguration();
               mWifiManager.reconnect();
               break;
          }
       }

       List netConfList = mWifiManager.getConfiguredNetworks();
       if (netConfList.size() <= 0) {
           Log.v(TAG, ssid + " is not available");
           return false;
       }
       return true;
   }

public static final int TYPE_NO_PASSWD = 0x11;
public static final int TYPE_WEP = 0x12;
public static final int TYPE_WPA = 0x13;
     /**
* 连接信息生成配置对象
* @param SSID
* @param password
* @param type
* @return
* @author wanghongbin
*/
public WifiConfiguration createWifiInfo(String SSID, String password, int type) {
Log.v(TAG, "whb SSID =" + SSID + "## Password =" + password + "## Type = " + type);
       WifiConfiguration config = new WifiConfiguration();
        config.SSID = SSID;       
        clearAll(SSID);


        // 分为三种情况:1没有密码2用wep加密3用wpa加密
        if (type == TYPE_NO_PASSWD) {// WIFICIPHER_NOPASS
            config.hiddenSSID = false;
            config.status =  WifiConfiguration.Status.ENABLED;
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.preSharedKey = null;
        } else if (type == TYPE_WEP) { // WIFICIPHER_WEP
            config.hiddenSSID = true;
            config.wepKeys[0] = "\"" + password + "\"";
            config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            config.wepTxKeyIndex = 0;
        } else if (type == TYPE_WPA) { // WIFICIPHER_WPA
            config.preSharedKey = "\"" + password + "\"";
            config.hiddenSSID = false;
            config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
            config.priority = 10000;
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
        }

return config;
}

3.很多之前已经连接上的WIFI,配置信息会自动保存,当你关闭---->打开WIFI时就会自动连接,但有时我们并不希望这样处理,解决方法为在打开WIFI之前将以前所保存的信息清除,代码为
if(isWifiConnect()){
    WifiInfo info = mWifiManager.getConnectionInfo();
    mWifiManager.removeNetwork(info.getNetworkId());
    mWifiManager.saveConfiguration();
   }
  或者
   /**
* 移除所有同名节点
* @param SSID
*/
private void clearAll(String SSID) {
List existingConfigs = mWifiManager.getConfiguredNetworks();
//按照networkId从大到小排序
Collections.sort(existingConfigs, new ComparatorConfig());
for (WifiConfiguration existingConfig : existingConfigs) {
LogHelper.i(TAG,"existingConfig.SSID="+existingConfig.SSID+",netID = "+ existingConfig.networkId);
if (existingConfig.SSID.equals("\""+SSID+"\"") /*&& existingConfig.preSharedKey.equals("\"" + password + "\"")*/) {
mWifiManager.disableNetwork(existingConfig.networkId);
mWifiManager.removeNetwork(existingConfig.networkId);
}
}
mWifiManager.saveConfiguration();
}

阅读(3111) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~