从Android framework层实现实现wifi无缝切换AP
来源:互联网 发布:现在淘宝什么最赚钱 编辑:程序博客网 时间:2024/04/24 16:56
Android市场上有一款叫Wifijumper的软件,实现相同ssid的多个AP之间根据wifi信号的强弱与阀值进行判断,实现自动切换AP的功能。目前在android4.2之前系统都没有该功能,对于google来讲,这是个相当简单的问题,不明白为什么一直都不支持该功能。鄙人之前在某个方案公司就遇到过客户需要该功能。以下是鄙人实现的具体过程,希望对大家有些许的帮助。
首先我们必须时刻监听当前wifi的信号强度,那么我们的手机连上wifi之后状态兰就会有wifi图标出来,并且信号强度变化信号格也要跟随变化,这部分工作是在SystemUI完成的。在目录
framework/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
这个类就是SystemUI监听网络连接状态的Receiver。
在OnReceive方法中
if ( action.equals( WifiManager.RSSI_CHANGED_ACTION ) || action.equals( WifiManager.WIFI_STATE_CHANGED_ACTION ) || action.equals( WifiManager.NETWORK_STATE_CHANGED_ACTION ) ){ updateWifiState( intent ); refreshViews();}
调用了 updateWifiState(Intent intent)方法,那么我们的切换功能就可以放到这个updateWifiState方法中:
mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200); mWifiLevel = WifiManager.calculateSignalLevel( mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT);
添加一下代码:
+import android.net.wifi.ScanResult; /* 导入包 */boolean isWorking = false;if ( mWifiConnected ){ WifiInfo wifiInfo = ( (WifiManager) mContext.getSystemService( Context.WIFI_SERVICE ) ).getConnectionInfo(); /* ---- */ if ( (wifiInfo != null) && !isWorking ) { String curentSSID = wifiInfo.getSSID(); String currentBssid = wifiInfo.getBSSID(); Log.e( TAG, "updateWifiState curentSSID == " + curentSSID + " currentBssid = " + currentBssid + " mWifiRssi = " + mWifiRssi + " mWifiLevel = " + mWifiLevel ); List<ScanResult> sameSSIDList = new ArrayList<ScanResult>(); List<ScanResult> list = mWifiManager.getScanResults(); if ( list != null ) { for ( ScanResult rt : list ) { Log.e( TAG, "list ---------- onReceive():ScanResult = " + rt ); if ( curentSSID.equals( rt.SSID ) ) { sameSSIDList.add( rt ); } } } if ( sameSSIDList.size() >= 2 ) { ScanResult strongestRssi = sameSSIDList.get( 0 ); for ( int i = 1; i <= (sameSSIDList.size() - 1); i++ ) { if ( sameSSIDList.get( i ).level > strongestRssi.level ) { strongestRssi = sameSSIDList.get( i ); } } /* * int strongestLevel = WifiManager.calculateSignalLevel( * strongestRssi.level, WifiIcons.WIFI_LEVEL_COUNT); */ Log.e( TAG, "strongestRssi = " + strongestRssi + " mWifiRssi = " + mWifiRssi ); /* if(!currentBssid.equals(strongestRssi.BSSID) && (strongestLevel - mWifiLevel) >= 1){ */ if ( (strongestRssi.level - mWifiRssi) >= 18 ) { Log.e( TAG, "do reconnect now !!!!!!!!!!!!" ); mWifiManager.disconnect(); mWifiManager.reconnect(); isWorking = true; } } }}
逻辑其实很简单,就是根据当前ssid去扫描的列表中找相同ssid的ap如果有,就找信号最强的,当最强的那个信号比当前的信号超过一定的值时,断开重连。当然这种做法还是效率不是高的。原因就是当你在不停的移动中,传过来的信号值其实和当前的实际值有一定的差异。
0 0
- 从Android framework层实现实现wifi无缝切换AP
- Android framework层实现实现wifi无缝切换AP
- wifi 多ap 无缝切换
- android wifi 无缝切换
- 什么是WiFi无缝漫游(即无线AP自动切换)?
- 什么是WiFi无缝漫游(即无线AP自动切换)?
- Android 实现双Launcher的无缝切换
- js实现无缝切换
- android 实现指定wifi切换
- js实现 无缝切换 效果
- Android 从framework层到HAL层调用实现(蓝牙串口)
- hostapd实现WIFI 热点(AP)
- hostapd实现WIFI 热点(AP)
- hostapd实现WIFI 热点(AP)
- hostapd实现WIFI 热点(AP)
- hostapd实现WIFI 热点(AP)
- pcDuino实现AP--wifi热点共享
- android开启Wifi AP
- iOS导航栏使用
- Codeforces 602B Approximating a Constant Range 【dp + 二分】
- poj 3253 Fence Repair 贪心
- Android Studio引入javax包问题
- Loadrunner错误代码27740_27995_27796学习笔记_SariyaLee
- 从Android framework层实现实现wifi无缝切换AP
- foundation框架
- LESS学习笔记(下)
- Ubuntu 15.10使用——系统安装
- Pig_1. Pig 基础知识 -- 待完善
- 一个松鼠大战游戏实现
- 25. Magento 创建新闻模块(5)
- jQuery validate 和artDialog的兼容问题
- 技术学习链接