设为首页 收藏本站
查看: 1535|回复: 0

[经验分享] 【移动开发】WIFI热点通信(一)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-30 12:45:11 | 显示全部楼层 |阅读模式
  之前调查过Android中WIFI模块的使用,也写过两篇学习总结的文章(http://smallwoniu.blog.iyunv.com/3911954/1334951),后来发现DEMO里面还是有许多不足之处,前段时间有不少人Q我,问到WIFI模块中的一些细节,小弟这里只能说声抱歉,因为当时的我也还没研究到那个层次呀。。。 DSC0000.gif ,后来毕业设计选题干脆直接选择了关于WIFI热点通信方面的题目,调查和整理了一些资料,进行了一段时间的学习算是弥补了自己的短板吧 DSC0001.gif ,主要还是希望自己能够更加全面的掌握这方面的知识。
  
  废话不多说了!今天主要讲解WIFI热点通信的前期准备工作:

            1.热点创建:创建指定名称的热点。
            2.热点搜索:搜索附近可用热点,生成列表。

            3.热点连接:在列表中点击指定名称的WIFI项,进行连接操作。

  
  一.框架搭建
   DSC0002.jpg
  说明:
    1.几个权限:



1
2
3
4
5
6


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
  2.相关类图:
DSC0003.jpg
  
  二.模块讲解
   接下来通过以下三个部分功能来逐一剖析,在此之前首先看一张最终的效果图加深以下印象:
DSC0004.jpg
  (由于本章讲解的部分是我的整个项目中的一部分,所以大家不用在意图片素材等其他细节)
  
  2.1热点创建
  
  点击WIFI管理界面中创建热点按钮,首先会检测当前WIFI是否可用,若可用则需将其关闭掉才能创建WIFI热点,因为手机热点把手机的接收GPRS或3G信号转化为WIFI信号再发出去,即你的手机就成了一个WIFI热点,所以共享和接收功能是不能同时进行的。之后就是创建指定名称的热点过程。热点创建时序图如下图所示。
DSC0005.jpg
  几个核心方法:

  •   startApWifiHot()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


/**
* create a hot wifi
*
* @param wifiName
*/
public boolean startApWifiHot(String wifiName) {
    Log.i(TAG, "into startApWifiHot(String wifiName) wifiName = " + wifiName);
    if (wifiManager.isWifiEnabled()) {
        wifiManager.setWifiEnabled(false);
    }
    if (mWifiHotAdmin != null) {
        return mWifiHotAdmin.startWifiAp(wifiName);
    }
    Log.i(TAG, "out startApWifiHot(String wifiName)");
    return false;
}


  •   createWifiAp()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


/**
* start hot pot
* @param wifiName
* @return
*/
private boolean createWifiAp(String wifiName) {
    Log.i(TAG, "into startWifiAp() 启动一个Wifi 热点!");
    Method method1 = null;
    boolean ret = false;
    try {
        //setWifiApEnabled is @hide, so reflect
        method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",
            WifiConfiguration.class, boolean.class);
        WifiConfiguration apConfig = createPassHotWifiConfig(wifiName,Global.PASSWORD);
        ret = (Boolean) method1.invoke(mWifiManager, apConfig, true);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        Log.d(TAG, "stratWifiAp() IllegalArgumentException e");
    }
    Log.i(TAG, "out startWifiAp() 启动一个Wifi 热点!");
    return ret;
}
  
  2.2热点搜索
  
  
  点击WIFI管理界面中搜索热点按钮,同创建一样,首先需要检测WIFI热点是否关闭,将其关闭掉后才能打开WIFI搜索功能。在搜索完成后系统会发送WIFI状态变化广播来通知消息栏,这里通过自定义广播接收器接收了搜索成功消息,最后通过回调MainActivity中disPlayWifiScanResult()来显示WIFI列表。
DSC0006.jpg
  几个核心方法:

  •   scanWifiHot()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


/** scan wifi hot **/
public void scanWifiHot() {
    Log.i(TAG, "into wifiHotScan()");
    if(mWifiHotAdmin.isWifiApEnabled(wifiManager)) {
        mWifiHotAdmin.closeWifiAp();
    }
    if (!wifiIsOpen()) { // WIFI is close currently
        //listen to the specified SSID wifi state
        registerWifiStateBroadcast("");
        mWifiStateReceiver.setOperationsType(OperationsType.SCAN);
      
        //open wifi
        openWifi();
    } else { // WIFI is open currently
        scanNearWifiHots();
    }
    Log.i(TAG, "out wifiHotScan()");
}


  •   scanNearWifiHots()
      



1
2
3
4
5
6


/** scan near wifi **/
private void scanNearWifiHots() {
    registerWifiScanBroadcast();
    //start scan
    wifiManager.startScan();
}
  说明:这里的扫描实现过程是通过调用系统中WifiManager中扫描功能。



1
2
3
4
5
6
7
8
9
10
11
12
13
14


    /**
     * Request a scan for access points. Returns immediately. The availability
     * of the results is made known later by means of an asynchronous event sent
     * on completion of the scan.
     * @return {@code true} if the operation succeeded, i.e., the scan was initiated
     */
    public boolean startScan() {
        try {
            mService.startScan(false);
            return true;
        } catch (RemoteException e) {
            return false;
        }
    }
  
  2.3热点连接
  
  
  在搜索完成之后,需要在WIFI列表中找到游戏的热点,点击连接过程会处理一系列逻辑:当前WIFI可用、是否已经连接、注册WIFI状态变化广播等,之后,开启独立线程进行热点匹配连接,热点连接时序图如图所示。
DSC0007.jpg
  
  几个核心方法:

  •   connectToHotpot()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35


/**
* connect to hotpot
*
* @param ssid
* @param wifiList
* @param password
*/
public void connectToHotpot(String ssid, List<ScanResult> wifiList, String password) {
    if (ssid == null || password.equals("") || !ssid.equals(Global.HOTPOT_NAME)) {
        Log.d(TAG, "WIFI ssid is null or ");
        mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
        return;
     }
     if (ssid.equalsIgnoreCase(mSSID) && isConnecting) {
        Log.d(TAG, "same ssid is  connecting!");
        mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
        return;
     }
    if (!checkCoonectHotIsEnable(ssid, wifiList)) {
        Log.d(TAG, "ssid is not in the wifiList!");
        mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
        return;
    }
    if (!wifiIsOpen()) {
        //listen to ssid wifi
        registerWifiStateBroadcast(ssid);
        mWifiStateReceiver.setOperationsType(OperationsType.CONNECT);
         
        //open wifi
        openWifi();
    } else {
        // real connecting
        enableNetwork(ssid, password);
    }
}


  •   enableNetwork()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25


/**
* connect wifi hot really by thread
*
* @param ssid
* @param password
*/
private void enableNetwork(final String ssid, final String password) {
    // delete more conneted wifi
    deleteMoreCon(ssid);
    registerWifiConnectBroadCast();
     
    new Thread(new Runnable() {
        @Override
        public void run() {
             WifiConfiguration config = WifiHotConfigAdmin.createWifiNoPassInfo(ssid,             password);
            // if connect is successful
            isConnecting = connectHotSpot(config);
            mSSID = ssid;
            if (!isConnecting) {
                Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) isConnecting             =" + isConnecting);
                return;
            }
        }
    }).start();
}


  •   connectHotSpot()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


    /**
     * connect wifi hot if successful
     *
     * @param wifiConfig
     * @return
     */
    private boolean connectHotSpot(WifiConfiguration wifiConfig) {
        Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig)");
        
        //the ID of the newly created network description
        int wcgID = wifiManager.addNetwork(wifiConfig);
        Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) wcID = "+ wcgID);
        if (wcgID < 0) {
            return false;
        }
        boolean flag = wifiManager.enableNetwork(wcgID, true);
        Log.i(TAG, "out enableNetwork(WifiConfiguration wifiConfig)");
        return flag;
    }
  说明:连接热点的过程实质上就是获取热点配置信息,之后将其添加到自己的网络信息中同时使其可用。
  
  
DSC0008.jpg
  
  
DSC0009.jpg
  

  至此,WIFI热点通信的前期工作已经完成,连接的手机端已在同一局域网内,若再有手机连接进来会自动为其分配该网段内的IP地址,接下来我们要做的就是在IP地址上实现数据的传输通信。在下一章中准备实现一个多人聊天室功能,希望能够帮助到大家!
  
  源码下载:http://down.iyunv.com/data/1812897
  
  
  本文出自 “狂奔的蜗牛” 博客,请务必保留此出处http://smallwoniu.blog.iyunv.com/3911954/1536126

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120945-1-1.html 上篇帖子: Ubuntu Kylin 15.04 笔记本wifi驱动问题 下篇帖子: 【移动开发】Android中WIFI开发总结(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表