【问题标题】:Can't connect from Android to bonjour service, hosted on iMac无法从 Android 连接到 iMac 上托管的 bonjour 服务
【发布时间】:2011-05-18 17:11:00
【问题描述】:

我的目标是找到WIFI网络中所有的bonjour服务,找到它们的ip/port,并通过HTTP进行通信。

发现错误地发现托管在 iMac 上的 Bonjour 服务 - 发现服务名称,但端口 = 0,InetAddress[] = null。 与 Windows PC 上托管的相同服务的连接工作正常(来自一个供应商的相同版本的软件) - 名称、url 和端口正确发现。 Bonjour 服务浏览器可以正确看到这两个服务。

使用JmDNS 3.4.0lib,见代码示例(部分代码省略):

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。尝试了 Apple 的 dns_sd.jar,但它依赖于原生代码,无法在 Android 中使用。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: android bonjour zeroconf


    【解决方案1】:

    使用下面的代码。经过测试和实施并且工作正常

    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);
    
        }
    

    【讨论】:

      【解决方案2】:

      对于初学者,请尝试使用不带参数的JmDNS.create 方法重载。问题是可能有多个网络接口(移动和 wifi),您可能使用getLocalIpAddress 绑定到错误的 IP。阅读更多关于 JmDNS 如何自行猜测这些参数的信息here。它在 PC 上运行的原因是您的 getLocalIpAddress 返回 WiFi ip。也许是因为它是唯一的网络接口。

      还要确保您要访问的服务可通过 WiFi 访问。出于明显的安全原因,无线路由器将 WiFi 网络和以太网网络分开是很常见的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多