android wifi热点的创建以及连接通信(华为T8951 Google GALAXY Nexus 测试通过)

android 专栏收录该内容
63 篇文章 0 订阅

               参考网上的很多的资料,初步实现了wifi热点的创建、连接以及聊天通信以下是网上广为流传的Wifi 三种配置:

  1. public WifiConfiguration createWifiInfo(String SSID, String password, int type) {
  2. Log.v(TAG, "SSID = " + SSID + "## Password = " + password + "## Type = " + type);
  3. WifiConfiguration config = new WifiConfiguration();
  4. config.allowedAuthAlgorithms.clear();
  5. config.allowedGroupCiphers.clear();
  6. config.allowedKeyManagement.clear();
  7. config.allowedPairwiseCiphers.clear();
  8. config.allowedProtocols.clear();
  9. config.SSID = "\"" + SSID + "\"";
  10. WifiConfiguration tempConfig = this.IsExsits(SSID);
  11. if (tempConfig != null) {
  12. mWifiManager.removeNetwork(tempConfig.networkId);
  13. }
  14. // 分为三种情况:1没有密码2用wep加密3用wpa加密
  15. if (type == TYPE_NO_PASSWD) {// WIFICIPHER_NOPASS
  16. config.wepKeys[0] = "";
  17. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  18. config.wepTxKeyIndex = 0;
  19. } else if (type == TYPE_WEP) { // WIFICIPHER_WEP
  20. config.hiddenSSID = true;
  21. config.wepKeys[0] = "\"" + password + "\"";
  22. config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
  23. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
  24. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
  25. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
  26. config.allowedGroupCiphers
  27. .set(WifiConfiguration.GroupCipher.WEP104);
  28. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  29. config.wepTxKeyIndex = 0;
  30. } else if (type == TYPE_WPA) { // WIFICIPHER_WPA
  31. config.preSharedKey = "\"" + password + "\"";
  32. config.hiddenSSID = true;
  33. config.allowedAuthAlgorithms
  34. .set(WifiConfiguration.AuthAlgorithm.OPEN);
  35. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
  36. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
  37. config.allowedPairwiseCiphers
  38. .set(WifiConfiguration.PairwiseCipher.TKIP);
  39. // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
  40. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
  41. config.allowedPairwiseCiphers
  42. .set(WifiConfiguration.PairwiseCipher.CCMP);
  43. config.status = WifiConfiguration.Status.ENABLED;
  44. }
  45. return config;
  46. }


            wifi热点的创建代码:


 

  1. package com.example.andoidwifihotdemo.wifiadamin;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import com.example.andoidwifihotdemo.activity.BaseActivity;
  5. import com.example.andoidwifihotdemo.activity.WifiApAdminActivity;
  6. import com.example.andoidwifihotdemo.constant.Global;
  7. import android.content.Context;
  8. import android.net.wifi.WifiConfiguration;
  9. import android.net.wifi.WifiManager;
  10. import android.util.Log;
  11. /**
  12. *
  13. * 热点搜索,创建,关闭
  14. *
  15. */
  16. public class WifiApAdmin {
  17. public static final String TAG = "WifiApAdmin";
  18. private WifiManager mWifiManager = null;
  19. private Context mContext = null;
  20. private static WifiApAdmin instance;
  21. private WifiApAdminActivity wifiApAdminActivity;
  22. public void closeWifiAp() {
  23. closeWifiAp(mWifiManager);
  24. }
  25. public static WifiApAdmin newInstance(Context context){
  26. if(instance==null){
  27. instance = new WifiApAdmin(context);
  28. }
  29. return instance;
  30. }
  31. private WifiApAdmin(Context context) {
  32. mContext = context;
  33. wifiApAdminActivity = (WifiApAdminActivity)context;
  34. mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
  35. closeWifiAp(mWifiManager);
  36. }
  37. public void startWifiAp() {
  38. Log.i(TAG, "into startWifiAp()");
  39. //創建Wifi熱點需要關閉Wifi
  40. if (mWifiManager.isWifiEnabled()) {
  41. mWifiManager.setWifiEnabled(false);
  42. }
  43. stratWifiAp();
  44. }
  45. //啟動一個Wifi 熱點
  46. private boolean stratWifiAp() {
  47. Log.i(TAG, "into startWifiAp() 启动一个Wifi 热点!");
  48. Method method1 = null;
  49. boolean ret = false;
  50. try {
  51. method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class, boolean.class);
  52. // WifiConfiguration netConfig =WifiApConfigurationAdmin.getInstance(mContext).CreateWifiInfo(Global.SSID, Global.SSID, 2);
  53. //热点的配置类
  54. WifiConfiguration apConfig = createPassHotWifiConfig(Global.SSID,Global.PASSWORD);
  55. ret = (Boolean) method1.invoke(mWifiManager, apConfig, true);
  56. } catch (IllegalArgumentException e) {
  57. e.printStackTrace();
  58. Log.d(TAG, "stratWifiAp() IllegalArgumentException e");
  59. } catch (IllegalAccessException e) {
  60. e.printStackTrace();
  61. Log.d(TAG, "stratWifiAp() IllegalAccessException e");
  62. } catch (InvocationTargetException e) {
  63. e.printStackTrace();
  64. Log.d(TAG, "stratWifiAp() InvocationTargetException e");
  65. } catch (SecurityException e) {
  66. e.printStackTrace();
  67. Log.d(TAG, "stratWifiAp() SecurityException e");
  68. } catch (NoSuchMethodException e) {
  69. e.printStackTrace();
  70. Log.d(TAG, "stratWifiAp() NoSuchMethodException e");
  71. }
  72. Log.i(TAG, "out startWifiAp() 启动一个Wifi 热点!");
  73. return ret;
  74. }
  75. //關閉Wifi熱點
  76. private boolean closeWifiAp(WifiManager wifiManager) {
  77. Log.i(TAG, "into closeWifiAp() 关闭一个Wifi 热点!");
  78. boolean ret =false;
  79. if (isWifiApEnabled(wifiManager)) {
  80. try {
  81. Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");
  82. method.setAccessible(true);
  83. WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager);
  84. Method method2 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
  85. ret = (Boolean) method2.invoke(wifiManager, config, false);
  86. } catch (NoSuchMethodException e) {
  87. // TODO Auto-generated catch block
  88. e.printStackTrace();
  89. } catch (IllegalArgumentException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. } catch (IllegalAccessException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. } catch (InvocationTargetException e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. }
  99. }
  100. Log.i(TAG, "out closeWifiAp() 关闭一个Wifi 热点!");
  101. return ret;
  102. }
  103. //检测Wifi 热点是否可用
  104. public boolean isWifiApEnabled(WifiManager wifiManager) {
  105. try {
  106. Method method = wifiManager.getClass().getMethod("isWifiApEnabled");
  107. method.setAccessible(true);
  108. return (Boolean) method.invoke(wifiManager);
  109. } catch (NoSuchMethodException e) {
  110. e.printStackTrace();
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. return false;
  115. }
  116. //扫描附近可用网络
  117. public void startScan(){
  118. //wifi 关闭的情况下,取消wifi状态广播监听
  119. if(BaseActivity.wifiStatebRoadCast){
  120. BaseActivity.wifiStatebRoadCast =false;
  121. wifiApAdminActivity.unregisterReceiver(wifiApAdminActivity.connectReceiver);
  122. }
  123. //搜索热点
  124. mWifiManager.startScan();
  125. }
  126. }

            以上代码就是网上收集的wifi热点的创建,关闭,检测是否可用,值得说明的是,参照部分大牛的代码,利用android的广播来监听附近wifi热点的扫描:


            IntentFilter intentWifiApoints = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 加入附近热点的扫描结果,热点扫描代码:

        

          

  1. mWifimanager =(WifiManager)getSystemService(Context.WIFI_SERVICE);
  2. mWifiManager.startScan();

                    广播监听处理,根据SSID来判断附近热点有没有自己需要的连接的热点,然后配置相应的WifiConfiguration 连接Wifi热点:

                      

  1. package com.example.andoidwifihotdemo.receiver;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.example.andoidwifihotdemo.activity.BaseActivity;
  5. import com.example.andoidwifihotdemo.activity.WifiApAdminActivity;
  6. import com.example.andoidwifihotdemo.constant.Global;
  7. import com.example.andoidwifihotdemo.wifiadamin.WifiApConfigurationAdmin;
  8. import android.content.BroadcastReceiver;
  9. import android.content.Context;
  10. import android.content.Intent;
  11. import android.net.wifi.ScanResult;
  12. import android.net.wifi.WifiConfiguration;
  13. import android.net.wifi.WifiManager;
  14. import android.util.Log;
  15. /**
  16. * 扫描热点,找到符合规格的热点并连接
  17. *
  18. */
  19. public class WifiScanRsultBroadCast extends BroadcastReceiver {
  20. private Context mContext;
  21. private WifiApAdminActivity wifiApAdminActivity;
  22. private WifiManager mWifimanager;
  23. private String ssID;
  24. private List<WifiConfiguration> configurations = new ArrayList<WifiConfiguration>();
  25. // 网络连接列表
  26. private List<WifiConfiguration> mWifiConfiguration;
  27. private List<ScanResult> wifiList;
  28. public WifiScanRsultBroadCast(Context context){
  29. this.mContext = context;
  30. wifiApAdminActivity = (WifiApAdminActivity)context;
  31. }
  32. @Override
  33. public void onReceive(Context context, Intent intent) {
  34. Log.i("WifiBroadCast", "into onReceive(Context context, Intent intent)");
  35. if(intent.getAction().equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)){
  36. mWifimanager = BaseActivity.mWifimanager;
  37. wifiList = mWifimanager.getScanResults();
  38. Log.i("WifiBroadCast", "into onReceive(Context context, Intent intent) wifiList= "+wifiList);
  39. if (wifiList == null || wifiList.size() == 0||WifiApAdminActivity.isConnecting){
  40. return;
  41. }
  42. configurations = BaseActivity.mWifimanager.getConfiguredNetworks();
  43. for(WifiConfiguration config :configurations){
  44. Log.i("WifiBroadCast config pro 优先级", " "+config.priority+" config SSID="+config.SSID);
  45. Log.i("WifiBroadCast config statu =", " "+config.status);
  46. }
  47. onReceiveNewNetworks(wifiList);
  48. Log.i("WifiBroadCast", "out onReceive(Context context, Intent intent)");
  49. }
  50. }
  51. /*当搜索到新的wifi热点时判断该热点是否符合规格*/
  52. public void onReceiveNewNetworks(List<ScanResult> wifiList){
  53. Log.i("WifiBroadCast", "into onReceiveNewNetworks(List<ScanResult> wifiList)");
  54. for(ScanResult result:wifiList){
  55. System.out.println(result.SSID);
  56. if((result.SSID).contains(Global.SSID)){
  57. synchronized (this) {
  58. ssID =result.SSID;
  59. new Thread(new Runnable() {
  60. @Override
  61. public void run() {
  62. connectToHotpot();
  63. }
  64. }).start();
  65. }
  66. }
  67. }
  68. }
  69. /*连接到热点*/
  70. public void connectToHotpot(){
  71. Log.i("WifiBroadCast", "into connectToHotpot()");
  72. if(ssID==null||ssID.equals("")){
  73. return;
  74. }
  75. WifiConfiguration config = WifiApConfigurationAdmin.getInstance(mContext).CreateWifiInfo(ssID,Global.PASSWORD,1);
  76. // WifiConfiguration config = createConnectWifiConfig();
  77. wifiApAdminActivity.enableNetwork(config);
  78. Log.i("WifiBroadCast", "out connectToHotpot()");
  79. }
  80. }


               值得提醒的一点是,通过Activity注册wifi热点广播监听时,记得注销掉,个人认为,在出发搜索事件的时候注册,在搜索结束之后应该注销掉,不然后台会一直在跑,自己测试的时候,一直在不停地打log日志,感觉很不好。

wifi热点的连接代码,其实很简单:

  1. int wcgID = mWifimanager.addNetwork(wifiConfig);
  2. Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) wcID = "+ wcgID);
  3. if (wcgID < 0) {
  4. Log.i(TAG,"into enableNetwork(WifiConfiguration wifiConfig) addNetWork fail!");
  5. statu.setText("Wifi 热点连接失败!");
  6. isConnected = false;
  7. return;
  8. }
  9. boolean flag = mWifimanager.enableNetwork(wcgID, true);

       个人测试的部分所得是:如果需要连接某一个Wifi热点,必须得先添加网络,根据自己的华为手机测试结果知,一下添加代码的效果就只是将你所指定的热点网络加入到信任区
   addNetwork(wifiConfig);

           恩,以上所说的绝大部分都是根据网上大牛的代码所得,之下就是自己的一些个人收获:

        其实,wifi热点的创建、关闭了这些东西网上都有现成的代码很是简单,热点能否连接成功才是最关键的地方,而热点连接成功与否的关键应该在于热点创建的WifiConfiguration对象与连接热点时所创建的WifiConfiguration 对象是否匹配上。


             个人对计算机网络很是菜鸟,仅仅就是根据文章最前说的三种配置方式进行对应配置进行测试,过程中发现一些问题,与大家分享一下,希望大家多多指点:

            1.没有密码的配置方式

            A.热点创建端

          

  1. //1.没有任何密码保护
  2. private WifiConfiguration createHotWifiConfig(String mSSID,String mPasswd){
  3. WifiConfiguration config = new WifiConfiguration();
  4. config.allowedAuthAlgorithms.clear();
  5. config.allowedGroupCiphers.clear();
  6. config.allowedKeyManagement.clear();
  7. config.allowedPairwiseCiphers.clear();
  8. config.allowedProtocols.clear();
  9. config.SSID = "" + mSSID + "";
  10. config.wepKeys[0] = "";
  11. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  12. config.wepTxKeyIndex = 0;
  13. config.priority=0;
  14. return config;
  15. }

              B.连接热点端配置

          

  1. WifiConfiguration config = new WifiConfiguration();
  2. config.allowedAuthAlgorithms.clear();
  3. config.allowedGroupCiphers.clear();
  4. config.allowedKeyManagement.clear();
  5. config.allowedPairwiseCiphers.clear();
  6. config.allowedProtocols.clear();
  7. config.SSID = "\"" + SSID + "\"";
  8. config.priority=0;
  9. IsExsits(SSID);
  10. // 分为三种情况:1没有密码2用wep加密3用wpa加密
  11. if (type == 1) {// WIFICIPHER_NOPASS
  12. config.wepKeys[0] = "\""+""+"\"";
  13. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  14. config.wepTxKeyIndex = 0;
  15. }

               仔细一看,其实两端的代码基本上是一样的,唯一的差别就是在于
      config.SSID = "\"" + SSID + "\"";
   

             所以这是个人所得的第一点,在创建热点,以及连接热点时,转义字符千万别搞错了,否则在 addNetWork(wifiConfig)时,返回的NwtWorkID 会一直都是-1,也就是添加网络失败。

 

        说明ISExsists(String SSID)


  1. public void IsExsits(String SSID)  
  2.     {  
  3.         mWifiManager = WifiApAdminActivity.mWifimanager;
  4.         String destStr = "\""+SSID+"\"";
  5.         Log.i(TAG, "existingConfig destStr = "+destStr);
  6.         Log.d(TAG, "mWifiManager ="+mWifiManager);
  7. // 获取已配置wifi热点网络,通过 addNetwork(wifiConfig)会将连接端自己配置的WifiConfiguration加入到其中;
  8.         List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();  
  9.         if(existingConfigs==null){
  10.             return;
  11.         }
  12.            for (WifiConfiguration existingConfig : existingConfigs)   
  13.            {  
  14.                  Log.i(TAG, "existingConfig ssid = "+existingConfig.SSID);
  15.              if (existingConfig.SSID.equalsIgnoreCase(destStr))  
  16.              {  
  17.                  Log.i(TAG, "existingConfig contain ssid = "+existingConfig.SSID);
  18.                  mWifiManager.removeNetwork(existingConfig.networkId);
  19. //                 return existingConfig;  
  20.              }  
  21.            }  
  22. //        return null;   
  23.     }

              因为

     addNetwork(wifiConfig)
   会将wifi热点连接端配置的WifiConfiguration 对象加入信任区中,在每一次连接自己指点的 WifiConfiguration 配置对象之前,需要根据SSID 将信任区中的 WifiConfiguration 对象移除,否侧的话网络会连接不上,这也就是个人所得的第二点,记得移除配置中已经存在的相同wifi热点配置。


     根据第一种配置方式进行测试,我的华为手机作为客户端连接到 GALAXY  热点是OK的,也可以进行聊天通信,但是如果换过来的话,即我的华为手机作为热点Server端,GALAXY  作为 连接热点客户端的话,就一直失败。

     addNetwork(wifiConfig) 方法会一直返回-1,当时自己就很诧异,难道是手机版本的问题,华为手机4.0系统,GALAXY 4.2的系统,自己就换了第二种配置方式:


        2.wep 配置方式

   

      A 热点创建端:

   

  1.     WifiConfiguration config = new WifiConfiguration();
  2.         config.allowedAuthAlgorithms.clear();
  3.         config.allowedGroupCiphers.clear();
  4.         config.allowedKeyManagement.clear();
  5.         config.allowedPairwiseCiphers.clear();
  6.         config.allowedProtocols.clear();
  7.         config.SSID = "" + SSID + "";
  8.         config.priority=0;
  9. config.hiddenSSID = true;
  10. config.wepKeys[0] = "" + password + "";
  11. config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
  12. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
  13. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
  14. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
  15. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
  16. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  17. config.wepTxKeyIndex = 0;


       B 热点连接端:

     

  1. WifiConfiguration config = new WifiConfiguration();
  2. config.allowedAuthAlgorithms.clear();
  3. config.allowedGroupCiphers.clear();
  4. config.allowedKeyManagement.clear();
  5. config.allowedPairwiseCiphers.clear();
  6. config.allowedProtocols.clear();
  7. config.SSID = "\"" + SSID + "\"";
  8. config.priority=0;
  9. config.hiddenSSID = true;
  10. config.wepKeys[0] = "\"" + password + "\"";
  11. config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
  12. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
  13. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
  14. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
  15. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
  16. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  17. config.wepTxKeyIndex = 0;


            使用第二种方式,连接端,GALAXY 在添加网络的时候,不再返回-1,表示网络添加成功,但是连接网络时一直失败。后来仔细看了一下,按照这样的对应配置,热点创建段提示的安全性是 无,然而连接端提示的是 Wep 方式加密,而且出现两个相同SSID的热点网络,一个是热点创建端的,一个是连接端的,很明显两端的配置虽然一样但是,两端根本就是两个不同的热点配置,当然无法连接,哎,没办法了,自己对网络也是那种菜鸟的,自己根本就不会配置,后来自己想到一个问题,按照第二种方式创建的热点时不加密的,那么我可以用第一种的连接端的配置去连接啊,但是GALAXY 添加网络会一直返回-1,呵呵,突然想到,加上转义字符,有可能会行,然后加上了转义字符:得到自己最终的两端配置如下:

      A 热点创建段


    

  1. WifiConfiguration config = new WifiConfiguration();
  2. config.allowedAuthAlgorithms.clear();
  3. config.allowedGroupCiphers.clear();
  4. config.allowedKeyManagement.clear();
  5. config.allowedPairwiseCiphers.clear();
  6. config.allowedProtocols.clear();
  7. config.SSID = "" + SSID + "";
  8. config.priority=0;
  9. config.hiddenSSID = true;
  10. config.wepKeys[0] = "" + password + "";
  11. config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
  12. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
  13. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
  14. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
  15. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
  16. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  17. config.wepTxKeyIndex = 0;

      

     B 热点连接端配置

    

    

  1. WifiConfiguration config = new WifiConfiguration();
  2. config.allowedAuthAlgorithms.clear();
  3. config.allowedGroupCiphers.clear();
  4. config.allowedKeyManagement.clear();
  5. config.allowedPairwiseCiphers.clear();
  6. config.allowedProtocols.clear();
  7. config.SSID = "\"" + SSID + "\"";
  8. config.priority=0;
  9. IsExsits(SSID);
  10. config.wepKeys[0] = "\""+""+"\"";
  11. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  12. config.wepTxKeyIndex = 0;
  13. config.status = WifiConfiguration.Status.ENABLED;

        然后居然就连接成功了,呵呵,连接也很稳定。

       文章开头说到的三种配置方式,1,2种到此,第三种按照1,2中的反向思维进行配置,但是不知道为什么热点还么有创建成功,手机自动重启,而且不是一次两次,只要调用热点创建的代码就会手机重启,是在搞不住。 

至此,我wifi热点的创建连接说到此,后面一些连接成功否检测,Socket通信的内容,等小弟整理好再加进来。希望大家多多指教,才能好好进步


 


             

 

   参考文章:

   Wifi 热点

  http://www.oschina.net/question/207975_79027

 http://bbs.csdn.net/topics/360190048

 http://blog.csdn.net/sasoritattoo/article/details/8285926


 http://stackoverflow.com/questions/15813767/connect-to-wifi-programmaticly-in-google-android

 C 底层源码
  http://www.oschina.net/code/explore/freebsd/contrib/wpa/wpa_supplicant/wps_supplicant.c

 百度空间
  http://hi.baidu.com/backwang/item/1f6df08b9cf936ded1f8cd99




项目下载地址(小弟赚一点积分)