时间:2022-08-05 01:08:08
摘 要:Android智能终端通过WLAN无线局域网接入互联网是用户最常用的上网方式,但是在同时检测到多个WiFi信号的时候,用户不得不手动连接到想要连接的信号上去。本文通过研究Android应用程序设计原理和Android中处理WiFi信号的相关类库,最后设计实现了WiFi管理软件,通过设定使用过的WiFi信号的优先级实现自动连接。软件在红米,三星等智能终端上安装使用,实现了WiFi的自动连接。
关键词:Android;WiFi;优先级管理;软件设计
中图分类号:TP311.52
移动终端在近年中发展迅速,尤其是智能手机平台Android的与开源,其发展势头强劲,给移动领域注入了新的活力。Android系统是Google公司开发的一个开源手机操作系统,它包括了智能手机工作所需的全部软件[1]。WLAN无线局域网使用无线信道来接入网络,以其高速、灵活、易于管理和扩展等特点,迅速成为宽带接入的最有效方式之一。
Android智能终端的用户在通过WiFi信号连接WLAN时,如果同时搜索到多个WiFi信号或者用户位置发生移动从一个WiFi信号覆盖范围移动到另一个WiFi信号覆盖范围时,智能终端不能自动连接到用户想要连接的信号,需要用户进行手动连接。本文设计的WiFi管理软件能够管理使用过的WiFi信号,可以设置不同信号的优先级,并且能够按照设置的优先级自动连接当前可用WiFi信号中优先级最高的信号。实现了WiFi信号的智能化自动连接及基本信息(WiFi名称、信号强度)的查看。
1 Android应用程序概述
Android应用程序主要由四部分构造而成:Activity(活动对象)、intent(目标)、Service(服务)、Content Provider(内容提供者)。当然,并不是所有的程序都需要全部部分,可以根据开发者的需要由上面的一个或几个来组建。使用某些组件构建Android应用程序时,需要在AndroidManifest.xml文件里进行声明。[2]
1.1 Activity(活动对象)
Activity是最基本的模块,在Android应用程序中,Activity一般代表用户可见的一个界面,并显示由视图控件组成的用户接口,并对用户激发的事件做出响应,大多数应用程序都有多个Activity,程序的运行过程就是在不同的Activity之间切换的过程。
1.2 intent(目标)
Android用Intent这个特殊类实现在Activity与Activity之间的切换,Intent类用于描述应用的功能。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有MAIN,VIEW,PICK,EDIT等,而动作对应的数据则以URI的形式表示。例如,要跳转到查看一个人的联系方式的界面,需要创建一个动作类型为VIEW的intent,以及表达这个人联系方式的URI。
1.3 Service(服务)
Service是具有长生命周期并且没有用户界面的代码,通过StartService(Intent service)可以来启动一个Service使程序在后台运行。通过Context.bindService()可以绑定一个Service。
1.4 Content Provider(内容提供者)
Content Provider就是一个类,作为应用程序之间唯一的共享数据的途径,它实现了一个标准的方法集合,能够让其他应用程序可以保存或读取此内容提供器处理的各种数据类型[3]。
2 Android上的WiFi概述
Android提供了.wifi包供我们操作WiFi。首先介绍一下几个类:
WiFiManager:提供了管理WiFi连接的大部分APIScanResult:已经检测出的接入点(包括接入点的地址、名称、身份认证、频率、信号强度);
WiFiConfiguration:WiFi连接的网络配置(包括安全配置等);
WiFiInfo:WiFi无线连接的描述(包括接入点、网络连接状态、隐藏的接入点、IP地址、连接速度、MAC地址、网络ID、信号强度等等);
WiFiManager.WiFiLock:允许应用程序一直使用WiFi无线网络,通常情况下当用户在一段时间内没有任何操作的时候,WiFi网络会自动关闭。我们使用WiFiLock来锁定WiFi网络,使其一直保持连接,直到这个锁被释放。
3 基于Android的WiFi管理软件
3.1 本软件的主要功能
(1)查询、连接周围WiFi信号,查看当前使用的WiFi信号的基本信息(WiFi名称、信号强度等)。
(2)管理使用过的WiFi信号,可以设置高、中、低等不同的信号优先级,并可以屏蔽不想连接的WiFi信号,在开启自动连接WiFi服务的功能时,系统会按照设置的优先级自动连接当前可用WiFi信号中优先级最高的信号。其中设置屏蔽的信号不会被连接。
图1 程序主界面 图2 WiFi信号优先级设置
3.2 主要用到的技术
(1)Android中处理WiFi信号的相关类库:WiFiManager、WiFiInfo、ScanResult、WiFiConfiguration、WiFiLock等。
(2)Android中数据库sqlite及相关类库:SQLiteDatabase、SQLiteOpenHelper等[4]。
(3)Android中接收广播的类BroadcastReceiver和服务类Service[5]。
3.3 软件主要操作实现流程
(1)主界面流程
图3 主界面流程
(2)自动连接WiFi服务
图4 自动连接服务流程图
4 软件具体实现
4.1 WiFi信号相关功能
获取当前连接WiFi的状态(已开启,正在开启中、已断开、已正在断开中、未知)、关闭WiFi功能、开启WiFi功能、获取当前正在使用的WiFi信号、获取当前正在使用的WiFi信号唯一的网络标识id、断开当前WiFi连接、判断WiFi信号是否SSID加密、获取当前使用的WiFi信号的IP地址、获取当前WiFi信号的速度(Mbps)、获取当前周围可用的WiFi信号列表、获取已经使用过的WiFi信号列表、添加删除已经使用过的WiFi信号列表等。
部分核心代码:
函数功能:获取周围WiFi信号的列表信息,包括WiFi的名称,标识号SSID以及信号强度等;
public ArrayList getScanResults(){
this.scan();
ArrayList scanResult=new ArrayList();
if (null != this.WiFi_lists){
int i=1;
for (ScanResult result:WiFi_lists) {
scanResult.add("NO."+(i++)+":"+result.toString()
+"WiFi名称"+result.SSID+"WiFi强度"+result.level);
}
return scanResult;
}else{
scanResult.add("当前周围没有可用的WiFi");
return scanResult;
}
}
4.2 数据库相关
数据库是用来保存WiFi信号信息的,包含的字段主要有:id(主键)、name(WiFi名称)、net_id(WiFi网络id)、priority(优先级)等。
核心代码:
函数功能:在数据库中添加一条WiFi信息,包括WiFi的名称、SSID、优先级等。
public boolean addOne(MyWiFiInfo WiFi){
ContentValues cv=new ContentValues();
cv.put("name",WiFi.getName());
cv.put("net_id",WiFi.getNet_id());
cv.put("priority",WiFi.getPriority());
cv.put("belong",WiFi.getBelong());
if (this.db.insert("WiFis",null,cv)==-1){
return false;
}
return true;
}
4.3 服务相关
服务的功能是检测周围WiFi信号的变换,自动切换到当前可用信号中优先级最高的WiFi信号,如果都没有设置优先级,则自动连接到强度最大的信号。
核心代码:
public class WiFiService extends Service{
private WiFiAdmin admin;
private BroadcastReceiver myReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//TODO Auto-generated method stub
admin=new WiFiAdmin(context);
if (admin.getWiFiState()==WiFiManager.WIFI_STATE_DISABLED
||admin.getWiFiState()==WiFiManager.WIFI_STATE_DISABLING) {
Toast.makeText(WiFiService.this,"WiFi服务正在运行,不能关闭WiFi",
Toast.LENGTH_SHORT).show();
admin.openWiFi();
}else{
String action = intent.getAction();
if(action.equals(WORK_STATE_CHANGED_ACTION)) {
Log.i("info", "WiFi连接发生变化");
admin.openWiFi();
admin.scan();
Mapmap=admin.linkMaxPrioritySingnal();
if(null!=map){
String name=(String) map.get("name");
int netid=(Integer) map.get("id");
admin.enableWiFiById(netid,true);
Toast.makeText(context,
"检测到变化,已经连接到当前WiFi优先级最高"+name,
Toast.LENGTH_SHORT).show();
}else{
if(admin.linkExceptLastWiFi()){
Toast.makeText(context,"检测到变化,随机连接到未屏蔽WiFi",
Toast.LENGTH_SHORT).show();
}
}
}
}
}
};
5 结束语
本文首先介绍了Android开发应用程序的组成,然后介绍了Android平台上WiFi开发的实现及方法。接着详细介绍了WiFi管理软件的功能,软件的流程,最后介绍了WiFi信号管理,数据库存储,服务切换三个功能模块的具体实现并给出了核心代码。本软件在红米,三星等各智能终端上测试表明,本文所设计的软件实用可靠,能给用户带来方便。
参考文献:
[1]刘枫.Android智能手机天气预报系统设计及实现[J].计算机时代,2011(04):61-63.
[2]孟刚.基于Android 蓝牙聊天系统的设计与实现[J].信息安全与技术,2012(06):79-81.
[3]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.
[4]王世江,余志龙,陈昱勋.Google Android SDK开发范例大全[M].北京:人民邮电出版社,2010.
[5]曾健平,邵艳洁.Android系统架构及应用程序开发研究[J].微计算机信息,2011(09):1-3.
作者简介:刘瑾(1980-),女,新疆人,网络与信息化中心教工,助理工程师,硕士,研究方向:网络与信息化。
作者单位:大连理工大学网络与信息化中心,辽宁大连 116023;大连理工大学创新实验学院,辽宁大连 116023;大连理工大学电子信息与电气工程学部,辽宁大连 116023