package cn.darkal.networkdiagnosis.Utils.NetInfo;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import org.apache.http.conn.util.InetAddressUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* Created by rock on 16-2-25.
*/
public class NetBasicInfo {
public static final String WIFI_NETINTERFACE = "wlan0";
public static final String MOBILE_NETINTERFACE = "p2p0";
public final static String APN_CMWAP = "cmwap";
public final static String APN_CMNET = "cmnet";
public final static String APN_UNIWAP = "uniwap";
public final static String APN_UNINET = "uninet";
public final static String APN_UNI3gWAP = "3gwap";
public final static String APN_UNI3gNET = "3gnet";
public final static String APN_CTWAP = "ctwap";
public final static String APN_CTNET = "ctnet";
public final static String APN_CTLTE = "ctlte";
/**
* Network type is unknown
*/
public static final int NETWORK_TYPE_UNKNOWN = 0;
/**
* Current network is GPRS
*/
public static final int NETWORK_TYPE_GPRS = 1;
/**
* Current network is EDGE
*/
public static final int NETWORK_TYPE_EDGE = 2;
/**
* Current network is UMTS
*/
public static final int NETWORK_TYPE_UMTS = 3;
/**
* Current network is CDMA: Either IS95A or IS95B
*/
public static final int NETWORK_TYPE_CDMA = 4;
/**
* Current network is EVDO revision 0
*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/**
* Current network is EVDO revision A
*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/**
* Current network is 1xRTT
*/
public static final int NETWORK_TYPE_1xRTT = 7;
/**
* Current network is HSDPA
*/
public static final int NETWORK_TYPE_HSDPA = 8;
/**
* Current network is HSUPA
*/
public static final int NETWORK_TYPE_HSUPA = 9;
/**
* Current network is HSPA
*/
public static final int NETWORK_TYPE_HSPA = 10;
/**
* Current network is iDen
*/
public static final int NETWORK_TYPE_IDEN = 11;
/**
* Current network is EVDO revision B
*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/**
* Current network is LTE
*/
public static final int NETWORK_TYPE_LTE = 13;
/**
* Current network is eHRPD
*/
public static final int NETWORK_TYPE_EHRPD = 14;
/**
* Current network is HSPA+
*/
public static final int NETWORK_TYPE_HSPAP = 15;
public static final int NETWORK_TYPE_SCDMA = 17;
public static final int NETWOR_TYPE_TDS_HSDPA = 18; //china mobile 3G
/**
* Unknown network class. {@hide}
*/
public static final int NETWORK_CLASS_UNKNOWN = 0;
/**
* Class of broadly defined "2G" networks. {@hide}
*/
public static final int NETWORK_CLASS_2_G = 1;
/**
* Class of broadly defined "3G" networks. {@hide}
*/
public static final int NETWORK_CLASS_3_G = 2;
/**
* Class of broadly defined "4G" networks. {@hide}
*/
public static final int NETWORK_CLASS_4_G = 3;
private static volatile NetBasicInfo m_Instance = null;
private String mNetInterface = WIFI_NETINTERFACE;
private Context mContext;
private NetBasicInfo(Context context) {
mContext = context;
}
public static NetBasicInfo getInstance(Context context) {
if (m_Instance == null) {
synchronized (NetBasicInfo.class) {
if (m_Instance == null) {
m_Instance = new NetBasicInfo(context);
}
}
}
return m_Instance;
}
public static int getNetworkClass(int networkType) {
switch (networkType) {
case NETWORK_TYPE_GPRS:
case NETWORK_TYPE_EDGE:
case NETWORK_TYPE_CDMA:
case NETWORK_TYPE_1xRTT:
case NETWORK_TYPE_IDEN:
return NETWORK_CLASS_2_G;
case NETWORK_TYPE_UMTS:
case NETWORK_TYPE_EVDO_0:
case NETWORK_TYPE_EVDO_A:
case NETWORK_TYPE_HSDPA:
case NETWORK_TYPE_HSUPA:
case NETWORK_TYPE_HSPA:
case NETWORK_TYPE_EVDO_B:
case NETWORK_TYPE_EHRPD:
case NETWORK_TYPE_HSPAP:
case NETWORK_TYPE_SCDMA:
case NETWOR_TYPE_TDS_HSDPA:
return NETWORK_CLASS_3_G;
case NETWORK_TYPE_LTE:
return NETWORK_CLASS_4_G;
default:
return NETWORK_CLASS_UNKNOWN;
}
}
public String getMacAddress(String netInterface) {
String strMacAddr = "";
byte[] b;
try {
NetworkInterface NIC = NetworkInterface.getByName(netInterface);
if (NIC == null) {
NIC = NetworkInterface.getByName("rmnet0");//小米关掉Wifi后只剩下此网卡。
strMacAddr = "没有 " + netInterface + " 网卡";
}
if (NIC != null) {
b = NIC.getHardwareAddress();
if (b == null) {
return strMacAddr;
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < b.length; i++) {
if (i != 0) {
buffer.append(':');
}
String str = Integer.toHexString(b[i] & 0xFF);
buffer.append(str.length() == 1 ? 0 + str : str);
}
strMacAddr = buffer.toString().toUpperCase();
}
} catch (SocketException e) {
e.printStackTrace();
}
return strMacAddr;
}
public String getApnInfo() {
TelephonyManager tel = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
String opCode = tel.getSimOperator();
String operatorName;
if (opCode.startsWith("46000") || opCode.startsWith("46002")) {
operatorName = "中国移动";
} else if (opCode.equals("46001")) {
operatorName = "中国联通";
} else if (opCode.equals("46003")) {
operatorName = "中国电信";
} else {
operatorName = "未知";
}
ConnectivityManager mag = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobInfo = mag.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiInfo = mag.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//NetworkInfo mobInfo = mag.getActiveNetworkInfo();
StringBuilder mOutputString = new StringBuilder();
mOutputString.append("MNC Code Info:\n");
mOutputString.append("IMSI=" + opCode + " <" + operatorName + ">\n");
mOutputString.append("\nMobile Network Info:\n");
//通过ExtraInfo 获取移动网络运营商信息
if (mobInfo != null && mobInfo.getExtraInfo() != null) {
mOutputString.append("运营商类型:");
if (mobInfo.getExtraInfo().equals(APN_CMWAP) || mobInfo.getExtraInfo().equals(APN_CMNET)) {
mOutputString.append("移动");
} else if (mobInfo.getExtraInfo().equals(APN_UNIWAP) || mobInfo.getExtraInfo().equals(APN_UNINET)
|| mobInfo.getExtraInfo().equals(APN_UNI3gWAP) || mobInfo.getExtraInfo().equals(APN_UNI3gNET)) {
mOutputString.append("联通");
} else if (mobInfo.getExtraInfo().equals(APN_CTWAP) || mobInfo.getExtraInfo().equals(APN_CTNET)
|| mobInfo.getExtraInfo().equals(APN_CTLTE)) {
mOutputString.append("电信");
} else {
mOutputString.append(operatorName);
}
if (mobInfo.getExtraInfo().contains("wap")) {
mOutputString.append("--Wap");
} else if (mobInfo.getExtraInfo().contains("net")) {
mOutputString.append("--Net");
} else {
mOutputString.append("--Unkown");
}
mOutputString.append("\n网络类型:");
int netType = getNetworkClass(mobInfo.getSubtype());
switch (netType) {
case NETWORK_CLASS_2_G:
mOutputString.append("2G\n");
break;
case NETWORK_CLASS_3_G:
mOutputString.append("3G\n");
break;
case NETWORK_CLASS_4_G:
mOutputString.append("4G\n");
break;
default:
mOutputString.append("未知\n");
break;
}
}
if (mobInfo != null) {
mOutputString.append("ExtraInfo=" + mobInfo.getExtraInfo() + "\n");
mOutputString.append("SubtypeName=" + mobInfo.getSubtypeName() + " SubType = " + mobInfo.getSubtype() + "\n");
mOutputString.append("TypeName=" + mobInfo.getTypeName() + " Type = " + mobInfo.getType() + "\n");
}
mOutputString.append("\nWIFI Network Info:\n");
mOutputString.append("ExtraInfo=" + wifiInfo.getExtraInfo() + "\n");
mOutputString.append("SubtypeName=" + wifiInfo.getSubtypeName() + " SubType = " + wifiInfo.getSubtype() + "\n");
mOutputString.append("TypeName=" + wifiInfo.getTypeName() + " Type = " + wifiInfo.getType() + "\n");
mOutputString.append("\nIP Info:\n");
mOutputString.append("IPv4 Address=" + GetIp(true) + "\n");
mOutputString.append("IPv6 Address=" + GetIp(false) + "\n");
mOutputString.append("DNS Address=" + getLocalDNS() + "\n");
return mOutputString.toString();
}
public String GetIp(Boolean isV4) {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr.hasMoreElements(); ) {
InetAddress inetAddress = ipAddr.nextElement();
if(isV4) {
// ipv4地址
if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) {
return inetAddress.getHostAddress();
}
}else{
// ipv6地址
if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv6Address(inetAddress.getHostAddress())) {
return inetAddress.getHostAddress();
}
}
}
}
} catch (Exception ex) {
//
}
return "";
}
private String getLocalDNS(){
Process cmdProcess = null;
BufferedReader reader = null;
String dnsIP = "";
try {
cmdProcess = Runtime.getRuntime().exec("getprop net.dns1");
reader = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream()));
dnsIP = reader.readLine();
return dnsIP;
} catch (IOException e) {
return null;
} finally{
try {
if (reader != null) {
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
if (cmdProcess != null) {
cmdProcess.destroy();
}
}
}
}