我目前正在开发一种无线嗅探器。为了实现这一点,我使用为arm编译的tcpdump二进制文件。但它假设我知道Wifi接口的名称。
根据SDK文档NetworkInterface提供getName()方法 我打算使用这种方法,所以第一步是获取与我的wifi接口相对应的NetworkInterface对象 为此,我使用WifiInfo获取ip地址,然后获取与此IP相对应的InetAddress,最后使用静态方法getByInetAddress(InetAddress地址)获取NetworkInterface实例。
这是我的代码:
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress addr = InetAddress.getByAddress(bytes);
NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
Log.e("MyTemp",netInterface.getName());
输出:
SSID: Nancy-Universite, BSSID: 00:19:30:6a:a9:40, MAC: B4:07:F9:D5:7C:8C, Supplicant state: COMPLETED, RSSI: -80, Link speed: 11, Net ID: 6
但我除了:
eth0
我也尝试了isVirtual()方法,但它没有编译,我收到一条错误消息,说明方法isVirtual()没有为NetworkInterface类型定义。 我不明白发生了什么...... 任何帮助将不胜感激。
答案 0 :(得分:3)
你所要做的就是改变
Log.e("MyTemp",netInterface.getName());
到
Log.e("MyTemp",netInterface.getDisplayName());
答案 1 :(得分:1)
试试这个
for(Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();)
{
NetworkInterface i = list.nextElement();
Log.e("network_interfaces", "display name " + i.getDisplayName());
}
答案 2 :(得分:1)
使用此: String interfaceName = SystemInfo.getInstance()。getProperty(&#34; wifi.interface&#34;);
这肯定有用..
答案 3 :(得分:0)
您可以致电/system/ip link
并解析结果。
bash-3.2# ip link
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 6e:3d:7a:3a:62:ee brd ff:ff:ff:ff:ff:ff
3: usb1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether da:bb:3f:04:1b:cd brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
link/sit 0.0.0.0 brd 0.0.0.0
5: ip6tnl0: <NOARP> mtu 1460 qdisc noop state DOWN
link/tunnel6 :: brd ::
6: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 32
link/ether 76:3c:4e:23:cc:f8 brd ff:ff:ff:ff:ff:ff
7: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 32
link/ether 02:17:54:31:ff:bd brd ff:ff:ff:ff:ff:ff
8: tun: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 500
link/ether b2:b7:11:da:7c:6a brd ff:ff:ff:ff:ff:ff
16: tiwlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 40:fc:89:e4:67:4c brd ff:ff:ff:ff:ff:ff
答案 4 :(得分:0)
尝试一下:
ls /sys/class/ieee80211/*/device/net/
非root用户,已在Android 4,Android 7.1,Android 9和Arch Linux上进行了测试。
答案 5 :(得分:0)
与该问题有关的所有答案都不是直截了当的。 但是您可以通过反思来实现。即使没有wifi连接,下面提到的代码也可以使用。
String interfaceName=null;
try {
Method m = Class.forName("android.os.SystemProperties").getMethod("get", String.class);
interFace = (String) m.invoke(null, "wifi.interface");
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("Wifi Interface Name: " + interfaceName);
它适用于所有api级别(即使在反射中添加了一些限制,即使您的targetdk将为30)。