Как получить IP из-за соответствующего имени хоста в локальной сети в Android

Я ищу способ получить IP-адрес известного имени хоста в локальной сети.

Я работал так, чтобы выполнить сканирование сети. Сканирование начинается с 192.168.1.1 до 192.168.1.255, поэтому я пробовал InetAddress.getHostName(), InetAddress.getCanonicalAddress(), но получил тот же IP-адрес.

Я попытался выполнить сканирование с помощью nslookup . он отлично работал на компиляторе Java, но это невозможно в Android.

Я не смог протестировать библиотеку dnsjava из-за ошибок при компиляции заголовка: NoClassDefFoundError, файл dnsjava-2.1.7.jar добавлен в каталог libs.

любая помощь ? *Извините за мой английский.


person Hamza Hajeir    schedule 12.05.2018    source источник
comment
может помочь вам: stackoverflow.com /вопросы/34842698/   -  person hossein masomzadeh    schedule 13.05.2018
comment
Хм? Зачем вам сканировать что-либо для поиска имени хоста? Я думаю, вы запутались.   -  person Gabe Sechan    schedule 13.05.2018
comment
@SamNikzad Я проверил, первый ответ не работает из-за ошибки, упомянутой выше. не мог справиться с классом свойств, который использовался во втором ответе, не может разрешить метод .put()..   -  person Hamza Hajeir    schedule 13.05.2018
comment
@GabeSechan Первое, что я попробовал, это выполнить поиск с помощью InetAddress.getbyName([hostname]), но он все равно не работает. Да, это работает для таких сайтов, как google.com,facebook.com, но имя хоста не отображается в списке DHCP. Итак, я смотрю в обратном направлении, сканируя сеть таким образом, чтобы нести имена хостов.   -  person Hamza Hajeir    schedule 13.05.2018
comment
С чего бы это? DHCP != DNS. getHostByName выполняет поиск DNS. В документации сказано, что getHostByName по IP-адресу вернет адрес, и просто убедитесь, что это n IP-адрес. Я думаю, вам нужно точно описать, что вы передаете, и что вы ожидаете на выходе. Либо вы запутались в терминологии и плохо объясняете, либо вы запутались в интернет-технологиях и пытаетесь сделать что-то, что никогда не сработает.   -  person Gabe Sechan    schedule 13.05.2018
comment
моя цель - найти предварительно названный IP-адрес микроконтроллера для отправки ему команд. Даже если я запрограммирую его на получение статического IP-адреса, этот статический IP-адрес может быть сдан в аренду другому устройству. поэтому, когда я отправляю команды в виде запроса API, см. link Команда не достигает микроконтроллера, как я отправляю в качестве примера: http://192.168.1.8/?A=data1&B=data2/ адрес 192.168.1.8 может быть сдан в аренду другому устройству. Я нашел способ изменить имя хоста MicroController. поэтому я ищу IP, используя эту информацию. @GabeSechan   -  person Hamza Hajeir    schedule 13.05.2018
comment
любая помощь, ребята, пожалуйста?   -  person Hamza Hajeir    schedule 16.05.2018


Ответы (1)


Я написал рабочий код (по крайней мере, для моей цели).

Я запрограммировал свой микроконтроллер (ESP8266-NodeMCU) на запись ответа HTML, содержащего объект JSON.

Итак, я сканирую свою сеть, пишу http-запрос на каждый адрес, начиная с 192.168.1.1 до 192.168.1.255.

Заметки :

  • Я использовал SyncHttpClient, так как мне нужно сканировать большое количество адресов. Я пробовал AsyncHttpClient, и он не улавливает ответ.
  • Я пробовал метод (InetAddress.isReachable()) для фильтрации адресов, он не работает, так как всегда возвращает false.
  • Я не мог сделать HttpRequest, не добавив в запрос хотя бы 1 параметр запроса.

    boolean found = false;
    
    void getIPAddress()  {
    
      for (int i = 1; i < 255; i++) {
        if (!found) {
            String tryIP = subnet + String.valueOf(i);
            Log.d(TAG, "Trying: " + tryIP);
            final String finalIP = tryIP;
    
            try {
    
                    SyncHttpClient client = new SyncHttpClient();
                    RequestParams params = new RequestParams();
                    params.put("check", "1");
    
                    client.get("http://" + finalIP , params, new JsonHttpResponseHandler() {
    
    
    
                        @Override
                        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                            try {
    
                                JSONObject jo = response;
                                String key = jo.getString("controller");
                                Log.d(TAG, "Success : " + response + " and key is : " + key);
    
                                if (key.equals("esplight")) {
    
                                    Log.d(TAG, "Found the ESP! Its IP is :" + finalIP);
    
                                    found = true;
    
    
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
    
                        }
    
                        @Override
                        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
    
                            Log.d(TAG, "trying to connect failed ");
    
                        }
                    });
    
    
              } catch (Exception e) {
            }
        }
     }
    }
    
person Hamza Hajeir    schedule 30.05.2018