Не удается подключиться с Android к службе Bonjour, размещенной на iMac - PullRequest
2 голосов
/ 18 мая 2011

Моя цель - найти все бесплатные сервисы в сети WIFI, найти их ip / порт и общаться через HTTP.

Служба Bonjour, размещенная на iMac, обнаружена неправильно - имя службы найдено, но port = 0, InetAddress [] = null. Соединение с той же службой, размещенной на ПК с Windows, работает нормально (та же версия программного обеспечения от одного поставщика) - имя, URL и порт обнаружены правильно. Браузер службы Bonjour правильно видит обе службы.

JmDNS 3.4.0 используется lib, см. Пример кода (часть кода опущена):

MulticastLock lock = wifi.createMulticastLock(MULTICAST_LOCK_TAG);
lock.setReferenceCounted(true);
lock.acquire();

final InetAddress inetAddress = getLocalIpAddress();
jmdns = JmDNS.create(inetAddress, JMDNS_NAME);

ServiceInfo[] infos = jmdns.list(CAMERA_SERVERS);

if (infos != null && infos.length > 0) {
    for (int i = 0; i < infos.length; i++) {
        name = infos[i].getName();
        InetAddress[] addresses = infos[i].getInetAddresses();
        url = addresses[0].getHostAddress();
        port = infos[i].getPort();
    }

PS. Пробовал dns_sd.jar от Apple, но он опирается на собственный код и не может использоваться в Android.

Есть идеи?

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 июля 2013

используйте код ниже.Проверено и внедрено и работает нормально

android.net.wifi.WifiManager.MulticastLock lock;
    android.os.Handler handler = new android.os.Handler();

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            handler.postDelayed(new Runnable() {
                public void run() {
                    setUp1();
                }
            }, 1000);

        } 

      private void setUp1() 
        {
            android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
            lock = wifi.createMulticastLock("mylockthereturn");
            lock.setReferenceCounted(true);
            lock.acquire();

            try {
                //http://stackoverflow.com/questions/13677199/jmdns-doesnt-work-properly-on-android-4-1 


                WifiInfo wifiInfo = wifi.getConnectionInfo();
                int ip = wifiInfo.getIpAddress();
                String ipAddress = Formatter.formatIpAddress(ip);

                InetAddress _bindingAddress = InetAddress.getByName(ipAddress);
                jmdns = JmDNS.create(_bindingAddress);

                ServiceInfo[] infos = jmdns.list("_afpovertcp._tcp.local.");
                for (int i=0; i < infos.length; i++) {
                    notifyUser("\nServic : "+infos[i].getName()+"");

                }
                System.out.println();


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

        }

private void notifyUser(final String msg) {
        handler.postDelayed(new Runnable() {
            public void run() {

                TextView t = (TextView)findViewById(R.id.text);
                t.setText(msg+"\n=== "+t.getText());
            }
        }, 1);

    }
0 голосов
/ 09 февраля 2012

Для начала попробуйте использовать метод перегрузки JmDNS.create, который не принимает параметров. Проблема в том, что может быть несколько сетевых интерфейсов (мобильный и Wi-Fi), и вы можете привязать к неправильному IP , используя getLocalIpAddress. Узнайте больше о том, как JmDNS сам угадывает эти параметры здесь . Причина, по которой он работает на ПК, потому что ваш getLocalIpAddress возвращает WiFi ip. Возможно, потому что это единственный сетевой интерфейс.

Также убедитесь, что услуга, к которой вы хотите получить доступ, доступна через WiFi. Беспроводные маршрутизаторы очень часто разделяют сеть WiFi и сеть Ethernet по очевидным причинам безопасности.

...