gpt4 book ai didi

java - 如何在Android上获取本地网络中所有设备的IP地址和名称

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:27 24 4
gpt4 key购买 nike

我想用 java 查看我网络上所有连接的设备,但我无法让它工作。我在下面附上了一些屏幕截图,说明我希望如何输出它。我想要名称(例如“TP Link Router”或“Nexus 5X”)和 IP 地址。

我在 google 和 stackoverflow 上搜索了很多,但似乎没有什么适合我的。甚至 GitHub 也没有有效的代码。我尝试搜索 UPnP、局域网、子网等,但一无所获。

InetAddress localhost = InetAddress.getLocalHost();
byte[] ip = localhost.getAddress();
for (int i = 1; i <= 254; i++) {
ip[3] = (byte)i;
InetAddress address = InetAddress.getByAddress(ip);
if (address.isReachable(1000)) {
System.out.println(address + address.getHostAddress() + address.getAddress() + address.getHostName() + address.getCanonicalHostName());
}
}

Example 1 Example 2

我确实找到了一个重复的(某种程度上的)问题,但是一年多了都没有得到回答。 Source

最佳答案

主要问题是您获取了错误的 IP 地址。 InetAddress.getLocalHost() 返回 127.0.0.1,那只是您的设备。

改为使用 Wifi IP 地址:

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
WifiManager wm = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);

WifiInfo connectionInfo = wm.getConnectionInfo();
int ipAddress = connectionInfo.getIpAddress();
String ipString = Formatter.formatIpAddress(ipAddress);

这是一个快速而肮脏的 AsyncTask 可以做到这一点:

static class NetworkSniffTask extends AsyncTask<Void, Void, Void> {

private static final String TAG = Constants.TAG + "nstask";

private WeakReference<Context> mContextRef;

public NetworkSniffTask(Context context) {
mContextRef = new WeakReference<Context>(context);
}

@Override
protected Void doInBackground(Void... voids) {
Log.d(TAG, "Let's sniff the network");

try {
Context context = mContextRef.get();

if (context != null) {

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
WifiManager wm = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);

WifiInfo connectionInfo = wm.getConnectionInfo();
int ipAddress = connectionInfo.getIpAddress();
String ipString = Formatter.formatIpAddress(ipAddress);


Log.d(TAG, "activeNetwork: " + String.valueOf(activeNetwork));
Log.d(TAG, "ipString: " + String.valueOf(ipString));

String prefix = ipString.substring(0, ipString.lastIndexOf(".") + 1);
Log.d(TAG, "prefix: " + prefix);

for (int i = 0; i < 255; i++) {
String testIp = prefix + String.valueOf(i);

InetAddress address = InetAddress.getByName(testIp);
boolean reachable = address.isReachable(1000);
String hostName = address.getCanonicalHostName();

if (reachable)
Log.i(TAG, "Host: " + String.valueOf(hostName) + "(" + String.valueOf(testIp) + ") is reachable!");
}
}
} catch (Throwable t) {
Log.e(TAG, "Well that's not good.", t);
}

return null;
}

权限如下:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

并非所有路由器都允许这样做,因此以其他方式获取名称是将 mac 地址发送到 api,然后返回品牌名称。

String macAdress = "5caafd1b0019";
String dataUrl = "http://api.macvendors.com/" + macAdress;
HttpURLConnection connection = null;
try {
URL url = new URL(dataUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoInput(true);
connection.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.flush();
wr.close();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
StringBuffer response = new StringBuffer();
String line;
while ((line = rd.readLine()) != null) {response.append(line);response.append('\r');}
rd.close();
String responseStr = response.toString();
Log.d("Server response", responseStr);
} catch (Exception e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();}}

关于java - 如何在Android上获取本地网络中所有设备的IP地址和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com