/*
* Copyright 2013 wada811<at.wada811@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package at.wada811.net;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;
import at.wada811.net.NetworkManager.Wifi.Security;
import at.wada811.utils.LogUtils;
import java.util.ArrayList;
import java.util.List;
public class NetworkManager {
private WifiManager mWifiManager;
private ConnectivityManager mConnectivityManager;
/**
* コンストラクタ
*/
public NetworkManager(Context context) {
mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
}
/**
* ネットワークの接続状態を返す
*
* @return ネットワークに接続している場合は true
*/
public boolean isNetworkConnected(){
NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
/**
* ネットワークの接続状態を返す
*
* @param type ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_MOBILE など
* @return ネットワークに接続している場合は true
*/
public boolean isNetworkConnected(int type){
NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == type;
}
/**
* Wifiに接続しているかを返す
*
* @return Wifiに接続している場合は true
*/
public boolean isWifiConnected(){
return isNetworkConnected(ConnectivityManager.TYPE_WIFI);
}
public static class Wifi {
public static enum Security {
/** セキュリティなし */
NONE("NONE"),
/** WEP */
WEP("WEP"),
/** WPA/WPA2-PSK */
WPA("WPA");
private String type;
Security(String type) {
this.type = type;
}
public String getSecurityType(){
return type;
}
}
}
/**
* Wifiの有効/無効を設定する
*
* @param enabled
* @return
*/
public boolean setWifiEnabled(boolean enabled){
return mWifiManager.setWifiEnabled(enabled);
}
/**
* Wifiの有効/無効を取得する
*
* @return boolean
*/
public boolean isWifiEnabled(){
return mWifiManager.isWifiEnabled();
}
public boolean reconnect(){
return mWifiManager.reconnect();
}
/**
* Wifiネットワークに接続する
*
* @return boolean
*/
public boolean connect(String ssid){
int networkId = 0;
WifiConfiguration config = getWifiConfig(ssid);
networkId = mWifiManager.addNetwork(config);
if(networkId == -1){
return false;
}
mWifiManager.saveConfiguration();
mWifiManager.updateNetwork(config);
config.networkId = networkId;
return connect(config);
}
/**
* Wifiネットワークに接続する
*
* @return boolean
*/
public boolean connect(String ssid, String password){
int networkId = 0;
Security security = getWifiSecurity(ssid);
WifiConfiguration config = createWifiConfig(security, ssid, password);
networkId = mWifiManager.addNetwork(config);
if(networkId == -1){
return false;
}
mWifiManager.saveConfiguration();
mWifiManager.updateNetwork(config);
config.networkId = networkId;
return connect(config);
}
private boolean connect(WifiConfiguration config){
mWifiManager.startScan();
for(ScanResult result : mWifiManager.getScanResults()){
// Android4.2以降のダブルクォーテーションを除去
LogUtils.i("config.SSID: " + getSsidName(config.SSID));
LogUtils.i("result.SSID: " + getSsidName(result.SSID));
if(getSsidName(config.SSID).equals(getSsidName(result.SSID))){
return mWifiManager.enableNetwork(config.networkId, true);
}
}
return false;
}
/**
* Wifiネットワークから切断する
*
* @return boolean
*/
public boolean disconnect(){
return mWifiManager.disconnect();
}
public Security getWifiSecurity(String ssid){
List<ScanResult> scanResults = mWifiManager.getScanResults();
for(ScanResult scanResult : scanResults){
if(scanResult.SSID.equals(ssid)){
if(scanResult.capabilities.contains(Security.WPA.type)){
return Security.WPA;
}else if(scanResult.capabilities.contains(Security.WEP.type)){
return Security.WEP;
}else{
return Security.NONE;
}
}
}
return Security.NONE;
}
/**
* Wifi接続設定情報を取得する
*
* @return WifiConfiguration wifi接続情報
*/
public WifiConfiguration getWifiConfig(String ssid){
List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
for(WifiConfiguration wifiConfiguration : configuredNetworks){
if(wifiConfiguration.SSID.equals(ssid)){
return wifiConfiguration;
}
}
return null;
}
/**
* Wifi接続設定情報を取得する
*
* @return WifiConfiguration wifi接続情報
*/
private WifiConfiguration createWifiConfig(Wifi.Security security, String ssid, String password){
WifiConfiguration config = new WifiConfiguration();
config.SSID = "\"" + ssid + "\"";
switch(security){
case NONE:
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedAuthAlgorithms.clear();
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
break;
case WEP:
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.wepKeys[0] = "\"" + password + "\"";
config.wepTxKeyIndex = 0;
break;
case WPA:
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.preSharedKey = "\"" + password + "\"";
break;
}
return config;
}
public boolean scanWifi(){
return mWifiManager.startScan();
}
public List<ScanResult> getScanResults(){
ArrayList<ScanResult> results = new ArrayList<ScanResult>();
List<ScanResult> scanResults = mWifiManager.getScanResults();
if(scanResults == null){
scanResults = new ArrayList<ScanResult>();
}
for(ScanResult scanResult : scanResults){
String ssid = getSsidName(scanResult.SSID);
if(!TextUtils.isEmpty(ssid)){
results.add(scanResult);
}
}
return results;
}
public List<WifiConfiguration> getConfiguredNetworks(){
List<WifiConfiguration> configs = new ArrayList<WifiConfiguration>();
List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
if(configuredNetworks == null){
configuredNetworks = new ArrayList<WifiConfiguration>();
}
for(WifiConfiguration config : configuredNetworks){
String ssid = getSsidName(config.SSID);
if(!TextUtils.isEmpty(ssid)){
configs.add(config);
}
}
return configs;
}
/**
* BSSIDを返す
*
* @return BSSID
*/
public String getBSSID(){
WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
return connectionInfo.getBSSID();
}
/**
* リンクスピードを返す
*
* @return リンクスピード(Mbps)
*/
public int getLinkSpeed(){
WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
return connectionInfo.getLinkSpeed();
}
/**
* IPアドレスを返す
*
* @return ipAddress
*/
public String getIpAddress(){
WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
int ipAddress = connectionInfo.getIpAddress();
return ((ipAddress >> 0) & 0xFF) + "." + ((ipAddress >> 8) & 0xFF) + "." + ((ipAddress >> 16) & 0xFF) + "." + ((ipAddress >> 24) & 0xFF);
}
/**
* MACアドレスを返す
*
* @return MACアドレス
*/
public String getMacAddress(){
WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
return connectionInfo.getMacAddress();
}
/**
* ネットワークIDを返す
*
* @return Network ID
*/
public int getNetworkId(){
WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
return connectionInfo.getNetworkId();
}
/**
* Wifi強度を取得する
*
* @param numLevels 強度の段階数
* @return int 強度
*/
public int getRssiLevel(int numLevels){
WifiInfo info = mWifiManager.getConnectionInfo();
return WifiManager.calculateSignalLevel(info.getRssi(), numLevels);
}
/**
* SSIDを返す
*
* @return SSID
*/
public String getSsid(){
WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
return connectionInfo.getSSID();
}
/**
* Android4.2以降のダブルクォーテーションを除去したSSIDを返す
*
* @return SSID
*/
public String getSsidName(){
return getSsidName(getSsid());
}
/**
* Android4.2以降のダブルクォーテーションを除去
*
* @return SSID
*/
public String getSsidName(String ssid){
if(ssid == null || ssid.replace("\"", "").equals("null")){
return null;
}
return ssid.replace("\"", "");
}
}