【移动开发】WIFI热点通信(一)
之前调查过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.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列表。

几个核心方法:
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(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; } |
说明:连接热点的过程实质上就是获取热点配置信息,之后将其添加到自己的网络信息中同时使其可用。


至此,WIFI热点通信的前期工作已经完成,连接的手机端已在同一局域网内,若再有手机连接进来会自动为其分配该网段内的IP地址,接下来我们要做的就是在IP地址上实现数据的传输通信。在下一章中准备实现一个多人聊天室功能,希望能够帮助到大家!
源码下载:http://down.51cto.com/data/1812897
本文出自 “狂奔的蜗牛” 博客,请务必保留此出处http://smallwoniu.blog.51cto.com/3911954/1536126
【移动开发】WIFI热点通信(一)的更多相关文章
- 【移动开发】WIFI热点通信(二)
相信大家在上一篇中已经了解了Android中WIFI热点通信的相关操作知识(http://smallwoniu.blog.51cto.com/3911954/1536126),今天我们将在上一篇代码基 ...
- Android 开发 创建WiFi、WiFi热点 ---开发集合
WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...
- Android WiFi开发教程(一)——WiFi热点的创建与关闭
相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...
- Android WiFi开发教程(三)——WiFi热点数据传输
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...
- Android WiFi/WiFi热点开发总结
首先看一下WiFi的自我介绍: Wi-Fi是一种允许电子设备连接到一个无线局域网(WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段.连接到无线局域网通常是有密码保护的:但也可 ...
- android wifi热点 socket通信
1.首先建立wifi热点服务器 wifi客户端连接 2.开启一个子线程循环监听某个端口,进行数据流输入输出 /* 服务器 接收数据 */ class Receiver extends Thread ...
- Android开发之扫描附近wifi热点并列表显示
近期项目中用到了wifi模块.今天做一个简单的总结. 參考:http://www.2cto.com/kf/201310/253617.html 1.如何获取wifi对象并进行操作 要操作WIFI设备, ...
- 办公开发环境(外接显示屏,wifi热点)
笔记本电脑怎样外接显示器 https://jingyan.baidu.com/article/3c48dd34495247e10ae35879.html?qq-pf-to=pcqq.c2c 怎样在Wi ...
- android 基于wifi模块通信开发
这篇文章主要是我写完手机与wifi模块通信后所用来总结编写过程的文章,下面,我分几点来说一下编写的大概流程. 一.拉出按钮控件并设置它的点击事件 二.设置wifi权限 三.打开和关闭wifi 四.扫描 ...
随机推荐
- android 9Path图片的使用
Android UI设计时,经常会使用图片作为背景,比如给按钮设置背景图片时,图片会默认缩放来适应整个按钮.但是有时这种缩放效果并不是我们所需求的.而我们只是希望缩放图片的特定位置,以此来保证按钮的视 ...
- Chrome扩展与用户隐私
转载自https://www.imququ.com/post/chrome-extensions-and-user-privacy.html Google Chrome浏览器应该早就是大家的默认了 ...
- 将CSS CLIP属性应用在:扩展覆盖效果
我们想要展示如何利用CSS3 clip属性制作一种简单而整洁的扩展效果,当点击一个box元素时实现平稳过渡.这个想法是为了实现某种叠加效果,好像它实际上在各个元素的下面.点击其中一个元素将创建一个切断 ...
- 使用wireshark抓本机之间的包(转)
所转地址:http://www.chinadmd.com/file/oc6evrwtzieitexvoupppisr_1.html 在进行通信开发的过程中,我们往往会把本机既作为客户端又作为服务器端来 ...
- jQuery 的ready事件和 JavaScript 的load事件对比
为了理解2个事件的异同,先了解一下HTML文档加载顺序 HTML DOM文档加载步骤 HTML DOM文档加载是按顺序执行的,这与浏览器的渲染方式有关,一般浏览器渲染操作的顺序大致按如下几个步骤 1, ...
- 88 Merge Sorted Array(归并排序Easy)
题目意思:num1和num2均为递增数组,对其进行递增排序存到num1中 class Solution { public: void merge(vector<int>& nums ...
- z-index的理解 z-index 属性仅在节点的 position 属性为 relative, absolute 或者 fixed 时生效.
今天做游戏的Exercise模式的时候,发现把所有的div设置为position:absolute;后,点击play进入到游戏界面的时候,鼠标点击数字的时候,完全没反应.经过我的反复检查,发现只要给所 ...
- C语言基础文件读写操作
整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...
- Permission denied (publickey).
问题: ssh-keygen -t rsa -C "youremail@example.com" 若是接连按三次回车,会在-/.ssh下生成 id_rsa, id_rsa.pub ...
- ISO14443-4块传输协议的实现
ISO1444-3块传输协议主要用于应用数据的传输,其实现如下: unsigned char Apdu(unsigned char *comm,unsigned short len,unsigned ...