2016-09-05 12 views
6

私のネットワーク上の接続されたすべてのデバイスをjavaで表示したいのですが、動作させることができません。私はそれが出力される方法のスクリーンショットをいくつか添付しました。私は名前(例えば、 "TP Link Router"または "Nexus 5X")とIPアドレスを持っていたいと思います。ローカルネットワーク上のすべてのデバイスの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

+0

あなたはどこからidenticonsを取得しましたか? – lelloman

+0

ところで、別の質問にコメントしても、それはフロントページにバンプされません。 –

+0

@lellomanそれらはアプリからのものです。私は彼らの名前に基づいてそれを生成すると思います。 – Jason

答えて

6

主な問題は、間違ったIPアドレスを取得していることです。 InetAddress.getLocalHost()は127.0.0.1を返しています。これはあなたのデバイスだけです。

は代わりに無線LAN IPアドレスを使用します。ここでは

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" /> 

ない。ここ

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ですすべてのルータがこれを許可するので、別の方法で名前を取得するには、MACアドレスをapiに送信し、ブランド名を取得することですkを返します。

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();}} 
+0

それは私がそれをしたい方法では動作しません:(まず第一にそれは0.0.0.1、0.0.0.2などを試して、 192.168.0.1などをチェックしてください。次に、「IPを試しています:192.168.0.193」とします:Found IP 192.168.0.130という名前の "MY-PC"どうすればいいですか? – Jason

+0

0.0.0.0?実際のデバイスでWiFiを使用していることを確認します。編集したコードは、接続可能なIPのみを関連付けられたホスト名で表示します。 – DataDino

+0

エミュレータ(愚かな私)、それはなぜそれは動作しませんでした。今問題は、私は名前を取得していないです。なぜですか?これは私が得るものです。例えば192.168.0.105はsonosですが、ホスト名:192.168.0.105(192.168.0.105)に到達可能です! 試してみる:192.168.0.106 IPを試してみる:192.168.0.107 ホスト:192.168.0.107(192.168.0.107)に到達可能です! 試行中のIP:192.168.0.108 ホスト:192.168.0.108(192.168.0.108)に到達できます! 試行中のIP:192.168.0.109 ホスト:192.168.0.109(192.168.0.109)に到達可能です! ' – Jason

関連する問題