关于获取设备SN序列号、MAC地址、IP地址的学习代码
SN序列号
SN码是Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证“产品的合法身份”而引入的一个概念,它是用来保障用户的正版权益,享受合法服务的;一套正版的产品只对应一组产品序列号。SN码别称:机器码、认证码、注册申请码等。
获取SN序列号
public String get_SN() {
String serial_n = "";
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
serial_n = Build.getSerial();
} else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
serial_n = Build.SERIAL;
} else {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
serial_n = (String) get.invoke(c, "ro.serialno");
}
} catch (Exception e) {
e.printStackTrace();
Log.e("LXH", "读取设备序列号异常:" + e.toString());
}
Log.i("LXH","设备的SN序列号:"+serial_n);
return serial_n;
}
适用各个版本,有提示添加权限如下,但是我没加这个权限时也可以运行成功
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
MAC地址
MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 [1] 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。 MAC地址是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。
获取MAC地址
public String get_MAC() {
String ethernet_mac = null;
BufferedReader bufferedReader_mac = null;
FileReader fileReader_mac = null;
try {
fileReader_mac = new FileReader("sys/class/net/eth0/address");
bufferedReader_mac = new BufferedReader(fileReader_mac);
ethernet_mac = bufferedReader_mac.readLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader_mac != null)
bufferedReader_mac.close();
if (fileReader_mac != null)
fileReader_mac.close();
} catch (IOException e) {
e.printStackTrace();
Log.e("LXH", "读取设备MAC地址异常:" + e.toString());
}
}
Log.i("LXH","设备的MAC地址:"+ethernet_mac);
return ethernet_mac;
}
获取的MAC地址就是有线网络的地址,即物理地址
IP、wlanIP、wlanMAC、网络、ping
因为要访问网络,所以要添加网络权限,没有添加权限会得到null
<uses-permission android:name="android.permission.INTERNET"/>
获取以太网的IP地址
public String get_ethernet_IP() {
String ethernet_IP = null;
try {
Enumeration nis = NetworkInterface.getNetworkInterfaces();
while (nis.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) nis.nextElement();
Enumeration<InetAddress> ias = ni.getInetAddresses();
while (ias.hasMoreElements()) {
InetAddress ia = ias.nextElement();
if (ia instanceof Inet6Address) {
continue;
}
String hostAddress = ia.getHostAddress();
if (!"127.0.0.1".equals(hostAddress)) {
ethernet_IP = hostAddress;
break;
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
Log.i("LXH","设备以太网的IP地址:"+ethernet_IP);
return ethernet_IP;
}
获取设备wlan的IP地址
public String get_wlan_IP() {
String wlan_IP="";
List<NetworkInterface> interfaces = null;
try {
interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface networkInterface : interfaces) {
if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses();
while (enumIpAddr.hasMoreElements()) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
wlan_IP=inetAddress.getHostAddress();
Log.i("LXH","设备wlan的IP地址:"+wlan_IP);
return wlan_IP;
}
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return wlan_IP;
}
获取wlan的MAC地址
public String get_wlan_MAC() {
String wlan_MAC="";
List<NetworkInterface> interfaces = null;
try {
interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface networkInterface : interfaces) {
if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
byte[] macBytes = networkInterface.getHardwareAddress();
if (macBytes != null && macBytes.length > 0) {
StringBuilder str = new StringBuilder();
for (byte b : macBytes) {
str.append(String.format("%02X:", b));
}
if (str.length() > 0) {
str.deleteCharAt(str.length() - 1);
}
wlan_MAC=str.toString();
Log.i("LXH","设备wlan的MAC地址:"+wlan_MAC);
return wlan_MAC;
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return wlan_MAC;
}
wlan的mac地址需要添加如下权限,否则会报错。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
判断当前网络是否可以用
public boolean is_Network() {
boolean is_network = false;
ConnectivityManager manager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
}
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
is_network= networkInfo != null && networkInfo.isConnected();
Log.i("LXH","当前网络是否可以用:"+is_network);
return is_network;
}
网络可用不代表能上网,但是可以与同网段的通信
判断ping一个xx地址是否能ping通
public boolean is_PingIP(String ip) {
boolean pingIP = false;
try {
Process process = Runtime.getRuntime().exec("ping -c 1 -w 3 " + ip);
int status = process.waitFor();
if (status == 0) {
pingIP=true;
Log.i("LXH","ping "+ip+" 是否成功:"+pingIP);
return pingIP;
}
}catch (InterruptedException | IOException e) {
e.printStackTrace();
}
Log.i("LXH","ping "+ip+" 是否成功:"+pingIP);
return pingIP;
}
运行日志
命令 busybox ifconfig 和 命令 netcfg
在终端下输入adb shell进入android的终端
busybox ifconfig
显示或配置网络设备(网络接口卡)的命令,在android中的ifconfig 只截取了有线网口的信息,实际会显示所有的网络接口信息,可以根据信息对比判断试是否得到正确的信息
netcfg
第一项为网卡接口类型,第二项为打开关闭状态,第三项为分配的ip地址,第四项为接口标志,第五项为硬件地址。netcfg的源码在系统下位置为:platform/systom/core/netcfg/netcfg.c 有看到一篇分析这个源码的link.有空可以看看
总结
还是得多看大佬的代码,逻辑和习惯得改 欢迎指错,一起学习鸭
|