2019独角兽企业重金招聘Python工程师标准>>>

首先,要实现一个简单的WIFI连接设置,我们需要掌握和WIFI功能相关的一些类,比如WIfiManager,WifiInfo,ScanResult,WifiConfiguration等,提供了WIFI连接相关的基本的API. 比如:
打开关闭网关:wifiManager.setWifiEnabled(true/false);
扫描周边网络:wifiManager.getScanResults();
连接指定网络:wifiManager.enableNetwork(networkId,true);
添加网络:wifiManager.addNetwork(wcg);
移除网络:wifiManager.removeNetwork(netId);
获取网卡状态:wifiManager.getWifiState()
……
2 扫描的网络将会被保存在一个List<ScanResult>中,同时WifiManager会为我们维护一个List<WifiConfiguration>,这个List中保存了我们已经连接过的配置好的网络连接.
当我们选择一个网络时,判断它是否存在于这个List中,存在即可直接连接,否则需要用户输入密码创建一个新的WifiConfiguration.
3 获得的ScanResult中将会保存有该无线连接的相关信息,包括SSID,BSSID,capabilities,level等属性,其中SSID号是该连接的一个标识符,比如我们经常看到的TP_LINKXXX.
capabilities中保存了相关加密信息,比如WEB和WPA等.level则表示信号度.
4 在获取连接状态时,即调用wifiManager.getWifiState()或者wifiInfo.getSupplicantState()时,通常在用户已经授权成功后,我们获得的状态值就为COMPLETED,此时不管网络是否已经连接成功,我们都无法获得新的状态. 所以要判断WIFI网络是否已经真的连接成功需要用到如下方法判断:

?

代码片段,双击复制

01
02
03
04
05
06
07
08
09
10
11
12
13
ConnectivityManager connManager = (ConnectivityManager) WifiConnection.this
.getSystemService(CONNECTIVITY_SERVICE);
// 获取代表联网状态的NetWorkInfo对象
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
if(networkInfo !=null&& networkInfo.getType() ==1
&& wifiAdmin.getWifiInfo().getSSID()!=null)
{
//WIFI网络连接成功
}

5 获取本地IP地址的方法:

?

代码片段,双击复制

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
publicString getLocalIpAddress() {     
try{     
for(Enumeration<NetworkInterface> en = NetworkInterface     
.getNetworkInterfaces(); en.hasMoreElements();) {     
NetworkInterface intf = en.nextElement();     
for(Enumeration<InetAddress> enumIpAddr = intf     
.getInetAddresses(); enumIpAddr.hasMoreElements();) {     
InetAddress inetAddress = enumIpAddr.nextElement();     
if(!inetAddress.isLoopbackAddress()) {     
returninetAddress.getHostAddress().toString();     
}     
}     
}     
}catch(SocketException ex) {     
Log.e("WifiPreference IpAddress", ex.toString());     
}     
returnnull;     
}     

6 在创建一个新的WifiConfiguration时,切记SSID和preSharedKey必须添加双引号,否则必将会导致连接失败.正确写法如下:

?

代码片段,双击复制

01
02
03
04
05
06
07
08
09
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
36
37
38
39
40
41
42
43
//创建一个新的WifiConfiguration
WifiConfiguration wcg =newWifiConfiguration();
wcg.BSSID = mBSSID;
//SSID和preSharedKey必须添加双引号,否则将会导致连接失败
wcg.SSID ="\""+ mSSID +"\"";
wcg.hiddenSSID =false;
wcg.status = WifiConfiguration.Status.ENABLED;
wcg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wcg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wcg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wcg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wcg.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wcg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
//如果加密模式为WEP
if(mSecurity.equals("WEP"))
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wcg.wepKeys[0] ="\""+ editText.getText().toString() +"\"";//This is the WEP Password
wcg.wepTxKeyIndex =0;
}
//如果加密模式为WPA EPA
elseif(mSecurity.equals("WPA EAP"))
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wcg.preSharedKey ="\""+ editText.getText().toString() +"\"";
}
//如果加密模式为WPA PSK
elseif(mSecurity.equals("WPA PSK"))
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wcg.preSharedKey ="\""+ editText.getText().toString() +"\"";
}
//无加密
else
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
} 首先,要实现一个简单的WIFI连接设置,我们需要掌握和WIFI功能相关的一些类,比如WIfiManager,WifiInfo,ScanResult,WifiConfiguration等,提供了WIFI连接相关的基本的API. 比如:

打开关闭网关:wifiManager.setWifiEnabled(true/false);
扫描周边网络:wifiManager.getScanResults();
连接指定网络:wifiManager.enableNetwork(networkId,true);
添加网络:wifiManager.addNetwork(wcg);
移除网络:wifiManager.removeNetwork(netId);
获取网卡状态:wifiManager.getWifiState()
……
2 扫描的网络将会被保存在一个List<ScanResult>中,同时WifiManager会为我们维护一个List<WifiConfiguration>,这个List中保存了我们已经连接过的配置好的网络连接.
当我们选择一个网络时,判断它是否存在于这个List中,存在即可直接连接,否则需要用户输入密码创建一个新的WifiConfiguration.
3 获得的ScanResult中将会保存有该无线连接的相关信息,包括SSID,BSSID,capabilities,level等属性,其中SSID号是该连接的一个标识符,比如我们经常看到的TP_LINKXXX.
capabilities中保存了相关加密信息,比如WEB和WPA等.level则表示信号度.
4 在获取连接状态时,即调用wifiManager.getWifiState()或者wifiInfo.getSupplicantState()时,通常在用户已经授权成功后,我们获得的状态值就为COMPLETED,此时不管网络是否已经连接成功,我们都无法获得新的状态. 所以要判断WIFI网络是否已经真的连接成功需要用到如下方法判断:

?

代码片段,双击复制

01
02
03
04
05
06
07
08
09
10
11
12
13
ConnectivityManager connManager = (ConnectivityManager) WifiConnection.this
.getSystemService(CONNECTIVITY_SERVICE);
// 获取代表联网状态的NetWorkInfo对象
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
if(networkInfo !=null&& networkInfo.getType() ==1
&& wifiAdmin.getWifiInfo().getSSID()!=null)
{
//WIFI网络连接成功
}

5 获取本地IP地址的方法:

?

代码片段,双击复制

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
publicString getLocalIpAddress() {     
try{     
for(Enumeration<NetworkInterface> en = NetworkInterface     
.getNetworkInterfaces(); en.hasMoreElements();) {     
NetworkInterface intf = en.nextElement();     
for(Enumeration<InetAddress> enumIpAddr = intf     
.getInetAddresses(); enumIpAddr.hasMoreElements();) {     
InetAddress inetAddress = enumIpAddr.nextElement();     
if(!inetAddress.isLoopbackAddress()) {     
returninetAddress.getHostAddress().toString();     
}     
}     
}     
}catch(SocketException ex) {     
Log.e("WifiPreference IpAddress", ex.toString());     
}     
returnnull;     
}     

6 在创建一个新的WifiConfiguration时,切记SSID和preSharedKey必须添加双引号,否则必将会导致连接失败.正确写法如下:

?

代码片段,双击复制

01
02
03
04
05
06
07
08
09
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
36
37
38
39
40
41
42
43
//创建一个新的WifiConfiguration
WifiConfiguration wcg =newWifiConfiguration();
wcg.BSSID = mBSSID;
//SSID和preSharedKey必须添加双引号,否则将会导致连接失败
wcg.SSID ="\""+ mSSID +"\"";
wcg.hiddenSSID =false;
wcg.status = WifiConfiguration.Status.ENABLED;
wcg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wcg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wcg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wcg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wcg.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wcg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
//如果加密模式为WEP
if(mSecurity.equals("WEP"))
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wcg.wepKeys[0] ="\""+ editText.getText().toString() +"\"";//This is the WEP Password
wcg.wepTxKeyIndex =0;
}
//如果加密模式为WPA EPA
elseif(mSecurity.equals("WPA EAP"))
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wcg.preSharedKey ="\""+ editText.getText().toString() +"\"";
}
//如果加密模式为WPA PSK
elseif(mSecurity.equals("WPA PSK"))
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wcg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wcg.preSharedKey ="\""+ editText.getText().toString() +"\"";
}
//无加密
else
{
wcg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}

转载于:https://my.oschina.net/u/994235/blog/119510

android wifi的知识相关推荐

  1. 第四章 Android WiFi基础知识

    系列文章目录 第一章 国内下载AOSP最新源码的方法 第二章 下载AOSP WiFi相关的代码 第三章 将源码导入Android Studio(无需编译idegen) 文章目录 系列文章目录 前言 一 ...

  2. android wifi flow

    复习并记录下android wifi相关知识,因为下载的是androidp 的source code,因此codebase就用androidP的版本,复习整个android wifi的flow,我大概 ...

  3. Android 系统 wifi基础知识

    第3章 Wi-Fi基础知识 本章所涉及的源代码文件名及位置 ·wireless.h external/ kernel-headers/ original/ linux/ wireless.h ·dri ...

  4. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第三章 Wi-Fi基础知识

    首先感谢各位兄弟姐妹们的耐心等待.本书预计在3月中旬上市发售.从今天开始,我将在博客中连载此书的一些内容.注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业. 注意,如下是本章目录,本文 ...

  5. Android Wi-Fi子系统学习笔记

    一.学习目的 了解Android  Wi-Fi模组的移植及调试 二.基础知识 1.wifi的两个标志: (1)无线 (2)基于IEEE802.11协议 2.Android wifi模块的三个作用 (1 ...

  6. android Wifi开发相关内容

    今天,简单讲讲android里如何使用WifiManager. 之前,我看代码时,看到了wifi相关的代码,发现自己对于这个内容的使用还很不熟悉,所以在网上查找资料,最终解决了问题.这里记录一下. 移 ...

  7. Android 驱动(3)---Android驱动开发知识储备

    Android驱动开发知识储备 Android软件层次结构 (1)操作系统层 显示驱动(Frame Buffer),Flash内存驱动,照相机驱动,音频驱动,WiFi驱动,键盘驱动,蓝牙驱动,Bind ...

  8. 详细介绍android rom移植知识普及

    详细介绍android rom移植知识普及 最近接到很多兄弟们的求助,也回答过无数个和下面这个问题类似的问题: 如何编译android 原生代码得到一个rom,然后跑到某某手机上. 鉴于很多兄弟对这块 ...

  9. Android WIFI密码查看器实例(在获取Root权限下查看系统文件)

    Android WIFI密码查看器实例 实现原理:使用shell命令查看保存WIFI密码的系统文件 涉及的知识 界面展示 基本的Shell命令 shell查看WIFI密码 ShellUtil的使用 正 ...

最新文章

  1. 自学成才翁_如何发挥自学成才的内在游戏
  2. 概率模型与条件随机场
  3. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子
  4. IBASE read buffer issue - FM IB_COM1_READ_IBASE
  5. 数据结构与算法 Python语言描述 笔记
  6. spring boot: 支持jsp,支持freemarker
  7. excel自动导出功能_自动关联数据字典---SpringCloud Alibaba_若依微服务框架改造---工作笔记008
  8. alert 乱码(转 学习)
  9. Silicon Labs CP210x USB to UART Bridge_6.6.6.14_4-8-2013_6.1_x64,驱动程序64位环境,ESP32
  10. redis 集群介绍及docker实现
  11. python辅助脚本教程_Python简单实现阴阳师挂机脚本
  12. 优酷古永锵:最大对手是土豆网 做好内容监管
  13. 人工智能如何改变了我们的日常生活?
  14. Web开发未来会完全替代客户端开发吗?
  15. java-net-php-python-jsp网上拍卖系统计算机毕业设计程序
  16. opencv-python 小白笔记(3)
  17. 苹果手机投影_会议室投影机最常用的一款无线投影解决方案,操作便捷,运行稳定且不需要装软件...
  18. java bulk_Elasticsearch Java High Level REST Client(Bulk API)
  19. 【区域经济学论文】基于区域经济背景下的茶叶资源发展研究(节选)
  20. Python网络爬虫专业级框架_scrapy

热门文章

  1. 收费站计算机安全应急预案,收费站突发事 件应急处置预案.doc
  2. 计算机word如何插入新列表,电脑word文档中怎么给表格自动添加序号?怎么增加表目录...
  3. 浙江理工大学计算机学院招生,浙江理工大学信息学院(专业学位)计算机技术保研夏令营...
  4. 宇宙工大路由器APP2021版使用教程
  5. TI IPNC Web网页之流程分析
  6. 分享小黄豆CRM的截图
  7. 如何转换swf格式的文件?
  8. [教学] [PCEVA超频宝典之CPU进阶篇]AM3平台超频教程
  9. 蚂蚁上市:P7可获1200万元期权,酸酸酸酸酸...
  10. 小熊个人资料_抖音网红熊董事长个人资料,美迪智董事长张曼如信息介绍