之前调查过Android中WIFI模块的使用,也写过两篇学习总结的文章(http://smallwoniu.blog.51cto.com/3911954/1334951),后来发现DEMO里面还是有许多不足之处,前段时间有不少人Q我,问到WIFI模块中的一些细节,小弟这里只能说声抱歉,因为当时的我也还没研究到那个层次呀。。。,后来毕业设计选题干脆直接选择了关于WIFI热点通信方面的题目,调查和整理了一些资料,进行了一段时间的学习算是弥补了自己的短板吧,主要还是希望自己能够更加全面的掌握这方面的知识。

废话不多说了!今天主要讲解WIFI热点通信的前期准备工作:

          1.热点创建:创建指定名称的热点。

          2.热点搜索:搜索附近可用热点,生成列表。

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

一.框架搭建

说明:

    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.相关类图:

二.模块讲解

 接下来通过以下三个部分功能来逐一剖析,在此之前首先看一张最终的效果图加深以下印象:

(由于本章讲解的部分是我的整个项目中的一部分,所以大家不用在意图片素材等其他细节)

2.1热点创建

点击WIFI管理界面中创建热点按钮,首先会检测当前WIFI是否可用,若可用则需将其关闭掉才能创建WIFI热点,因为手机热点把手机的接收GPRS或3G信号转化为WIFI信号再发出去,即你的手机就成了一个WIFI热点,所以共享和接收功能是不能同时进行的。之后就是创建指定名称的热点过程。热点创建时序图如下图所示。

几个核心方法:

  • 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.classboolean.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列表。

几个核心方法:

  • 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状态变化广播等,之后,开启独立线程进行热点匹配连接,热点连接时序图如图所示。

几个核心方法:

  • 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(falsenull);
        return;
     }
     if (ssid.equalsIgnoreCase(mSSID) && isConnecting) {
        Log.d(TAG, "same ssid is  connecting!");
        mWifiBroadCastOperator.disPlayWifiConnResult(falsenull);
        return;
     }
    if (!checkCoonectHotIsEnable(ssid, wifiList)) {
        Log.d(TAG, "ssid is not in the wifiList!");
        mWifiBroadCastOperator.disPlayWifiConnResult(falsenull);
        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;
    }

说明:连接热点的过程实质上就是获取热点配置信息,之后将其添加到自己的网络信息中同时使其可用。

至此,WIFI热点通信的前期工作已经完成,连接的手机端已在同一局域网内,若再有手机连接进来会自动为其分配该网段内的IP地址,接下来我们要做的就是在IP地址上实现数据的传输通信。在下一章中准备实现一个多人聊天室功能,希望能够帮助到大家!

源码下载:http://down.51cto.com/data/1812897

本文出自 “狂奔的蜗牛” 博客,请务必保留此出处http://smallwoniu.blog.51cto.com/3911954/1536126

【移动开发】WIFI热点通信(一)的更多相关文章

  1. 【移动开发】WIFI热点通信(二)

    相信大家在上一篇中已经了解了Android中WIFI热点通信的相关操作知识(http://smallwoniu.blog.51cto.com/3911954/1536126),今天我们将在上一篇代码基 ...

  2. Android 开发 创建WiFi、WiFi热点 ---开发集合

    WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...

  3. Android WiFi开发教程(一)——WiFi热点的创建与关闭

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...

  4. Android WiFi开发教程(三)——WiFi热点数据传输

    在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...

  5. Android WiFi/WiFi热点开发总结

    首先看一下WiFi的自我介绍: Wi-Fi是一种允许电子设备连接到一个无线局域网(WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段.连接到无线局域网通常是有密码保护的:但也可 ...

  6. android wifi热点 socket通信

    1.首先建立wifi热点服务器  wifi客户端连接 2.开启一个子线程循环监听某个端口,进行数据流输入输出 /* 服务器 接收数据 */ class Receiver extends Thread ...

  7. Android开发之扫描附近wifi热点并列表显示

    近期项目中用到了wifi模块.今天做一个简单的总结. 參考:http://www.2cto.com/kf/201310/253617.html 1.如何获取wifi对象并进行操作 要操作WIFI设备, ...

  8. 办公开发环境(外接显示屏,wifi热点)

    笔记本电脑怎样外接显示器 https://jingyan.baidu.com/article/3c48dd34495247e10ae35879.html?qq-pf-to=pcqq.c2c 怎样在Wi ...

  9. android 基于wifi模块通信开发

    这篇文章主要是我写完手机与wifi模块通信后所用来总结编写过程的文章,下面,我分几点来说一下编写的大概流程. 一.拉出按钮控件并设置它的点击事件 二.设置wifi权限 三.打开和关闭wifi 四.扫描 ...

随机推荐

  1. 集成支付宝后出现LaunchServices: ERROR: There is no registered handler for URL scheme alipay

    原因如下: There's no problem with your implementation. All those warnings mean is the apps which each UR ...

  2. Configuration ReportNG with TestNG

    下载 Reporter.jar,velocity-dep-1.4.jar 和 Guice.jar: 配置项目属性:Properties ->TestNG ->Disable Default ...

  3. 初涉JavaScript模式 (13) : 代码复用 【上】

    引子 博客断了一段时间,不是不写,一是没时间,二是觉得自己沉淀不够,经过一段时间的学习和实战,今天来总结下一个老生常谈的东西: 代码复用. 为何复用 JS门槛低,故很多人以为写几个特效就会JS,其实真 ...

  4. LIKE匹配关键字

    1.% 匹配任意数目字符(包括零个字符) SELECT * FROM edo_user WHERE true_name LIKE '王%' 应用:关键字查询 WHERE u.true_name lik ...

  5. php转化输入日期为Unix 纪元到当前时间的秒数 日期筛选

    多条件筛选时 日期筛选 部分 demo   http://pan.baidu.com/s/1hqGF5Ik 时间输入控件http://www.jq22.com/jquery-info332 输入控件 ...

  6. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  7. Solr4.8.0源码分析(5)之查询流程分析总述

    Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilt ...

  8. 不同浏览器使用Content-disposition时filename带空格的处理方式不同

    最近在做项目中遇到一个问题,纠结了好久才找到原因.起因:通过MIME的扩展Content-disposition来实现在客户端保存附加文件(快捷方式).问题:在chrome和IE8+下一切都很和谐,浏 ...

  9. 转:Backbone与Angular的比较

    原文来自于:http://www.infoq.com/cn/articles/backbone-vs-angular 将不同的思想和工具进行对比,是一种更好地理解它们的方式.在本文中,我首先将列举在创 ...

  10. Node.js stream 流学习

    由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...