Как вы думаете, это не используется в НРД? Я просто боюсь, что я не лучше упаковываю нативный код в Android lib, чем разработчики из команды Android

аюсь реализовать bonjour / zero conf в моем приложении для Android. Я использую библиотеку jmDns для поиска всех доступных устройств. Вот код, который я использую для поиска устройств в той же сети:

public class ListDevices extends ListActivity {
    JmDNS jmdns;
    JmDNSImpl impl;
    MulticastLock lock;
    protected ServiceListener listener;
    protected ServiceInfo info;
    public ListView lv;
    public ArrayList<String> deviceList;
    public int cancel = 0;
    public final static String TAG = "ListDevices";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        deviceList = new ArrayList<String>();
        showAllPrinters();

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, deviceList));

        lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // When clicked, show a toast with the TextView text
                Toast.makeText(getApplicationContext(),
                       ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            }
        });
        this.listener = new ServiceListener() {
            public void serviceAdded(ServiceEvent event) {
                deviceList.add("Service added   : " + event.getName() + "."
                        + event.getType());
                Log.v(TAG, "Service added   : " + event.getName() + "."
                        + event.getType());
            }

            public void serviceRemoved(ServiceEvent event) {
                deviceList.add("Service removed : " + event.getName() + "."
                        + event.getType());
                Log.v(TAG, "Service removed : " + event.getName() + "."
                        + event.getType());
            }

            public void serviceResolved(ServiceEvent event) {
                deviceList.add("Service resolved: " + event.getInfo());
                Log.v(TAG, "Service resolved: " + event.getInfo());
            }
        };
    }

    public void showAllPrinters() {
        Log.d("ListDevices", "in showAllPrinters");
        try {

            WifiManager wifi = (WifiManager)
                               getSystemService(Context.WIFI_SERVICE);
            lock = wifi.createMulticastLock("fliing_lock");
            lock.setReferenceCounted(true);
            lock.acquire();

            InetAddress inetAddress = getLocalIpAddress();
            jmdns = JmDNS.create(inetAddress, "TEST");

            ServiceInfo[] infos = jmdns.list("_http._tcp.local.");

            if (infos != null && infos.length > 0) {
                for (int i = 0; i < infos.length; i++) {
                    deviceList.add(infos[i].getName());
                }
            } else {
                deviceList.add("No device found.");
            }
            impl = (JmDNSImpl) jmdns;

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public InetAddress getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = (NetworkInterface) en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = (InetAddress) enumIpAddr
                            .nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress;
                    }
                }
            }
        } catch (SocketException ex) {
            Log.e("ListDevices", ex.toString());
        }
        return null;
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (isFinishing()) {
            lock.release();
        }
    }
}

По сути, я добавляю их в список, чтобы я мог отобразить список всех доступных устройств. Теперь, когда я запускаю этот код, я не получаю никаких исключений / ничего похожего на ошибку. Но с другой стороны, в мой список ничего не добавлено [PS: в сети есть как минимум 5-6 компьютеров и компьютеров Mac.

Я также попытался получить список из этого кода:

jmdns.addServiceListener("_http._tcp.local.", listener);

listener определяется вonCreate деятельности. Но это также не вернуло ни одно устройство.

Пожалуйста, помогите, подскажите, что я здесь делаю не так. Любая помощь приветствуется!

 Radu13 мар. 2013 г., 10:20
Если вы не используете этот код: if (! InetAddress.isLoopbackAddress () &&! InetAddress.isLinkLocalAddress () && inetAddress.isSiteLocalAddress ())
 vladimir30 окт. 2014 г., 19:41
@mudit. Я понимаю, что прошло некоторое время с тех пор, как вы столкнулись с этой проблемой. Вы пытались составить список с помощью "_http._tcp" вместо "_http._tcp.local.". Я не могу объяснить почему, но в моем случае это имеет значение. Пока что это имеет значение только при использовании NsdManager (стандартное обнаружение Android). Я буду знать, как это может повлиять на поиск JmDNS позже, как только наш пользователь с проблемой попробует это ...

Ответы на вопрос(5)

ля сканирования локальной сети, например, «bonjour browser», чтобы убедиться, что есть сервисы, которые вы хотите сканировать. Затем вы можете проверить ключевое слово jmDNS для сканирования сети.

Но есть известная проблема, что jmDns не работает на некоторых устройствах Android 4.x.

 Zephyr30 окт. 2014 г., 20:22
@vladimir, спасибо за ваш голос, я хотел бы предложить вам адаптировать реализацию iOS Bonjour к платформе Android, вы получите нативную библиотеку .so и jar для работы с ней. Мы сделали это несколько месяцев назад, это работает лучше, чем JmDNS и NSD.
 vladimir31 окт. 2014 г., 20:15
Похоже, что Google уже что-то сделал там:android.googlesource.com/platform/external/mdnsresponder Как вы думаете, это не используется в НРД? Я просто боюсь, что я не лучше упаковываю нативный код в Android lib, чем разработчики из команды Android
 Zephyr30 окт. 2014 г., 17:16
Здравствуйте @vladimir, во время разработки мы подтвердили, что JmDNS не работает на некоторых устройствах Android 4.1, он работает на устройствах с версией 4.1. Возможно, причина в реализации JmDNS на платформе Android, потому что оригинальная реализация Bonjour была на платформе iOS, но не так удобна, как iOS. Кстати, родной NSD Android тоже не надежен в ранних версиях 4.x, он очень часто падает.
 vladimir30 окт. 2014 г., 14:19
Привет @ Зефир. Вы сказали, что это известная проблема, что jmDns не работает на некоторых устройствах Android 4.x. Вы знаете больше деталей? Каковы причины? У нас есть один пользователь с этой проблемой. Bonjour Browser хорошо работает для него, но ничего не может быть обнаружено через библиотеку jmDns. Пока что ваш комментарий здесь - единственное подтверждение того, что не только у меня эта проблема с jmDns ...
 vladimir30 окт. 2014 г., 19:26
@Zyphyr, так какую библиотеку вы используете, чтобы наконец-то открыть? Я подумываю открыть через JmDNS и NSD, а затем показать некоторые итоговые результаты пользователю. Как вы думаете, есть лучшие варианты сейчас?

что многоадресная рассылка включена на вашем телефоне? Видетьhttp://home.heeere.com/tech-androidjmdns.html.

И вам, вероятно, следует искать «_ipp._tcp.local» (или что-то подобное) вместо служб «_http.tcp». Но это только для тестирования, верно? :-)

но я уверен, что есть проблемы с Android и mDNS по крайней мере с некоторыми телефонами и (я полагаю) эмулятором.

Больше информации здесь:

http://rgladwell.wordpress.com/2010/04/18/gotchas-android-and-multicast-dns/

встроенная поддержка Android не работает и / или не реализована полностью, что позволяет извлекать записи TXT (начиная с Android v5.1). Я также не мог заставить библиотеку jmDns работать для обнаружения. Я наконец нашелмднсъява проект и это сработало очень легко для меня. Обратите внимание, что его пример кода не является правильным. Вот пример кода, который я использовал для синхронного поиска всех принтеров IPP:

    String type[] = {"_ipp._tcp.local."};
    Lookup resolve = null;
    try {
        resolve = new Lookup(type, Type.ANY, DClass.IN);
        ServiceInstance[] records = resolve.lookupServices();
        for (ServiceInstance record : records) {
            Log.d(TAG, record.toString());
            Map txtMap = record.getTextAttributes();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Также обратите внимание, что вам нужно добавитьбиблиотека dnsjava в вашу папку libs и ваш build.gradle. Я использовал версию 2.1.7.

Обнаружение сетевых служб кажется, это просто завершение стека Bonjour в разных терминах. Я также вижу API более низкого уровня под названиемandroid.net.wifi.p2p.WifiP2pManager который выставляет DNS-SD (а также UPnP?) напрямую.

Обратите внимание, что базовый демон mDNSResponder, кажется, не работает все время и не используется для поиска DNS в масштабе всей системы (например, из браузера), насколько я могу сказать прямо сейчас.

 Trisped09 мая 2013 г., 01:58
Обнаружение сетевых служб и Bonjour являются реализациямиZeroconfне заворачивая другой.
 Bill09 апр. 2016 г., 01:27
Я обнаружил, что Android NDS работает лучше, чем mdnsjava, на который есть ссылки в некоторых других комментариях здесь (с использованием Android 5). Это все еще не дает мне те же результаты, которые я вижу в приложении Bonjour Browser, к сожалению.
 bremen_matt09 янв. 2017 г., 10:51
Android API полезен только для получения имен сервисов, IP-адресов и портов. Хотя API технически поддерживает дополнительную информацию (текст), вы обнаружите, что он не работает на 99% устройств.
 Darshit Patel22 мая 2013 г., 11:45
Пожалуйста, не используйте его, пока Android не решит проблемы, связанные с обнаружением сетевых служб. Эти проблемы упоминаются как: 1).code.google.com/p/android/issues/detail?id=39583 2).code.google.com/p/android/issues/detail?id=35585 3).code.google.com/p/android/issues/detail?id=39750

Ваш ответ на вопрос