获取局域网ip和mac(如果电脑没有直接连接外网),否则获取公网ip
通过第三放获取公网ip
public class NetworkUtils { /** * 获取本地IP列表(针对多网卡情况) * @return */ public static Map<String, Object> getLocalInetMac() { Map<String, Object> ipMacInfo = null; try { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface .getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces .nextElement(); Enumeration<InetAddress> inetAddresses = networkInterface .getInetAddresses(); while (inetAddresses.hasMoreElements()) { InetAddress inetAddress = inetAddresses.nextElement(); ipMacInfo = pickInetAddress(inetAddress, networkInterface); if (ipMacInfo != null) { Log.e("IP-MAC-1",ipMacInfo ); return ipMacInfo; } } } } catch (SocketException e) { e.printStackTrace(); } return null; } private static Map<String, Object> pickInetAddress(InetAddress inetAddress, NetworkInterface ni) { try { String name = ni.getDisplayName(); if (name.contains("Adapter") || name.contains("Virtual") || name.contains("VMnet") || name.contains("#")) { return null; } if (ni.isVirtual() || !ni.isUp() || !ni.supportsMulticast()) { return null; } if (inetAddress.isSiteLocalAddress()) { Formatter formatter = new Formatter(); String sMAC = null; byte[] macBuf = ni.getHardwareAddress(); for (int i = 0; i < macBuf.length; i++) { sMAC = formatter.format(Locale.getDefault(), "%02X%s", macBuf[i], (i < macBuf.length - 1) ? "-" : "") .toString(); } formatter.close(); Map<String, Object> ipMacInfo = new HashMap<String, Object>(); ipMacInfo.put("hostname", inetAddress.getHostName()); //系统当前hostname ipMacInfo.put("ip", inetAddress.getHostAddress()); //ip地址 ipMacInfo.put("ipnet", inetAddressTypeName(inetAddress)); //网络类型 ipMacInfo.put("os", System.getProperty("os.name")); //系统名称 ipMacInfo.put("mac", sMAC); //mac 地址 ipMacInfo.put("cpu-arch", System.getProperty("os.arch")); //cpu架构 ipMacInfo.put("network-arch", ni.getDisplayName()); //网卡名称 return ipMacInfo; } } catch (SocketException e) { e.printStackTrace(); } return null; } private static String inetAddressTypeName(InetAddress inetAddress) { return (inetAddress instanceof Inet4Address) ? "ipv4" : "ipv6"; } //通过第三方网站http://1111.ip138.com/ic.asp获取ip public static Map<String, String> getOpenNetworkIp() { try { URLConnection openConnection = new URL("http://1111.ip138.com/ic.asp").openConnection(); openConnection.setDoInput(true); openConnection.connect(); InputStream is = (InputStream) openConnection.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(is,Charset.forName("GBK"))); StringBuilder sb = new StringBuilder(); String str = null; while((str=br.readLine())!=null) { sb.append(str); } String htmlSrc = sb.toString().toLowerCase(Locale.getDefault()); String startTag = "<center>"; String endTag = "</center>"; htmlSrc = htmlSrc.substring(htmlSrc.indexOf(startTag)+startTag.length(), htmlSrc.lastIndexOf(endTag)); String openIp = htmlSrc.substring(htmlSrc.indexOf("[")+1, htmlSrc.lastIndexOf("]")); String provider = htmlSrc.substring(htmlSrc.lastIndexOf(":")+1); Map<String, String> resultMap = new HashMap<String, String>(); resultMap.put("openIp", openIp); resultMap.put("provider", provider); br.close(); Log.wtf("IP-Mac-3",resultMap); return resultMap; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public static String getDNSIp(String url) throws UnknownHostException { InetAddress bupt=null; try{ bupt = InetAddress.getByName(url); return bupt.getHostAddress(); }catch(UnknownException e) { e.printStackTrace(); } return null; } /** * 检测http网络连接是否正常 * @param urlStr * @return */ private static boolean httpIsAvaliable(String urlStr) { URL url = null; InputStream in = null; try { url = new URL(urlStr); URLConnection conn = url.openConnection(); conn.connect(); in = conn.getInputStream(); if (in != null && in.read() >= 0) { return true; } } catch (Exception e) { return false; } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } return false; } /** * 检测任意ip:port网络访问是否正常 * @param hostname * @param port * @return */ private static boolean socketIsAvaiable(String hostname,int port) { Socket socket = null; try { socket = new Socket(); socket.setKeepAlive(true); socket.setTcpNoDelay(true); socket.setTrafficClass(0x08); socket.connect(new InetSocketAddress(hostname, port)); if(!socket.isClosed() && socket.isConnected() && !socket.isInputShutdown() && !socket.isOutputShutdown()) { return true; } } catch (SocketException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; }finally{ if(socket!=null && !socket.isClosed()) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; } public static void main(String[] args) { Map<String, Object> localInetMac = getLocalInetMac(); System.out.println(localInetMac); Map<String, String> openNetworkIp = getOpenNetworkIp(); System.out.println(openNetworkIp); } }
如上方案在Android,Windows,linux都成功了,可能有些地方考虑不太周全,但应该覆盖了90-95%的PC和Android系统,对了,貌似不支持Android 2.2,
不过Android本身就可获取mac和IP,代码如下
public Map<String, Object> getLocalNetworkinfo( ) { Map<String, Object> ipNetInfo = new HashMap<String, Object>(); WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); WifiInfo connInfo = wifiManager.getConnectionInfo(); String macAddress = connInfo.getMacAddress();//mac地址 String ssid = connInfo.getSSID(); //ssid String bssid = connInfo.getBSSID(); int rssi = connInfo.getRssi();//信号强度 String speed = connInfo.getLinkSpeed()+WifiInfo.LINK_SPEED_UNITS;//网速 int networkId = connInfo.getNetworkId(); //网络号 String ip = Formatter.formatIpAddress(connInfo.getIpAddress()); DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); String gateway = Formatter.formatIpAddress(dhcpInfo.gateway);//网关 String netmask = Formatter.formatIpAddress(dhcpInfo.netmask);//子网掩码 ipNetInfo.put("mac", macAddress); ipNetInfo.put("ip", ip); ipNetInfo.put("gateway", gateway); ipNetInfo.put("netmask", netmask); ipNetInfo.put("ssid", ssid); ipNetInfo.put("rssi", rssi); ipNetInfo.put("bssid", bssid); ipNetInfo.put("speed", speed); ipNetInfo.put("networkId", networkId); Log.e("IP-MAC-2",ipNetInfo); return ipNetInfo; } //信道获取 public static int getCurrentChannel(Context context) { WifiManager wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo();// 当前wifi连接信息 ListscanResults = wifiManager.getScanResults(); for (ScanResult result : scanResults) { if (result.BSSID.equalsIgnoreCase(wifiInfo.getBSSID()) && result.SSID.equalsIgnoreCase(wifiInfo.getSSID() .substring(1, wifiInfo.getSSID().length() - 1))) { return getChannelByFrequency(result.frequency); } } return -1; } /** * 根据频率获得信道 * * @param frequency * @return */ public static int getChannelByFrequency(int frequency) { int channel = -1; switch (frequency) { case 2412: channel = 1; break; case 2417: channel = 2; break; case 2422: channel = 3; break; case 2427: channel = 4; break; case 2432: channel = 5; break; case 2437: channel = 6; break; case 2442: channel = 7; break; case 2447: channel = 8; break; case 2452: channel = 9; break; case 2457: channel = 10; break; case 2462: channel = 11; break; case 2467: channel = 12; break; case 2472: channel = 13; break; case 2484: channel = 14; break; case 5745: channel = 149; break; case 5765: channel = 153; break; case 5785: channel = 157; break; case 5805: channel = 161; break; case 5825: channel = 165; break; } return channel; }
下面是运行在Android上的效果