2010-03-18 13 views
36

Tôi đang làm việc với Droid/Android 2.0.1 và gặp phải sự cố dường như nhiều người có: Tôi không thể khám phá các dịch vụ bằng cách sử dụng thư viện zeroconf thuần Java mà tôi biết, jmDNS . (Bonjour của Apple, trong khi nó hoạt động trên Linux và Windows Java, tôi tin rằng sẽ khó hơn khi chuyển sang Android do phụ thuộc vào mã gốc.)Làm thế nào tôi có thể khám phá các dịch vụ zeroconf (Bonjour) trên Android? Tôi đang gặp sự cố với jmDNS

Tôi có thể tạo dịch vụ nhưng không phát hiện ra chúng. Tôi đang cố hiểu ý nghĩa của những gì đang xảy ra.

Có báo cáo vấn đề đang diễn ra tại đây; liên quan đến đa hướng và IPv6, nhưng có vẻ như đang ném người dùng của jmDNS, quá: http://code.google.com/p/android/issues/detail?id=2323

Bất kỳ ý tưởng nào tại sao người này có thể thành công? Xem chú thích 22 trong báo cáo lỗi. (Tôi mới sử dụng SO, do đó, không thể đăng nhiều hơn một URL.)

Tôi đã thử nghiệm mã của họ, nhưng không may mắn.

Có ai đã thực hiện thành công khám phá dịch vụ zeroconf trên Android, sử dụng jmDNS hoặc thư viện khác không?

Có thể sự cố phát hiện của tôi liên quan đến vấn đề phát đa hướng IPv6 không?

+0

Không có chú thích 22 trong báo cáo lỗi đó. Nó chỉ đi đến 14. – CommonsWare

+0

Dường như liên kết Theo dõi vấn đề phải là: http://code.google.com/p/android/issues/detail?id=2917 –

+0

Xin lỗi, đã sửa: http://code.google. com/p/android/issues/detail? id = 2917 # c22 –

Trả lời

12

Tôi cũng mới, nếu không tôi sẽ chỉ để lại nhận xét về câu trả lời của Smountcastle, chủ yếu là chính xác. Tôi vừa mới giải quyết vấn đề tương tự trên Droid đang chạy Android 2.1. Tôi thấy rằng tôi cần thiết để thiết lập MulticastLock để tham khảo tính nếu không nó dường như được phát hành tự động.

AndroidManifest.xml: 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

// Networking code: 
WifiManager wifi = getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = wifi.createMulticastLock("fliing_lock"); 
lock.setReferenceCounted(true); 
lock.acquire(); 

Chỉ cần đảm bảo gọi lock.release() khi bạn đã hoàn tất. Điều này chỉ có thể cần thiết cho Android 2.0+, Droid là thiết bị thử nghiệm duy nhất của tôi hiện tại, vì vậy tôi không thể nói chắc chắn.

+0

Vì vậy, gần như có thể đưa ra nhận xét chung ... Tôi đang sử dụng JmDNS, tôi đã thành công với nó trên Motorola Droid đang chạy 2.1-update1 sử dụng phương pháp MulticastLock. Chỉ gần đây đã có một HTC Incredible chạy cùng một phiên bản của Android, và phát hiện dịch vụ không hoạt động bằng cách sử dụng chính xác cùng một mã. Tôi đã kéo tóc của tôi ra trên đó, chúc may mắn ... – Churlbong

+0

Bạn có thể thêm một số mã như thế nào bạn gọi tất cả mọi thứ .. Tôi đã cố gắng bằng cách thêm quyền CHANGE_WIFI_MULTICASR_STATE .. nhưng tôi vẫn không nhận được bất kỳ kết quả. – mudit

+0

Cảm ơn, Churlbong - vì tò mò, bạn có đang sử dụng jmDNS hoặc chỉ cần viết ứng dụng khách hoàn toàn không? (hoặc sử dụng thư viện khác)? Tôi sẽ thử tính năng này vì mã khóa của tôi không hoàn toàn giống nhau và tôi không chắc mình đã biết rằng nó cũng có quyền riêng biệt độc lập với quyền mạng. ;) –

3

Bạn đã mua khóa multicast một cách rõ ràng để có thể nhận các gói multicast không?

 
AndroidManifest.xml: 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

// Networking code: 
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = wifi.createMulticastLock("mylock"); 
lock.acquire(); 

Theo chủ đề Android đó có vẻ như 2.0.1 không có bản sửa lỗi. Có lẽ bạn nên chuyển sang bản phát hành sau?

3

Nếu bạn chưa nhìn thấy nó rồi, tôi khuyên bạn nên kiểm tra ra dự án này trên github (từ chối trách nhiệm - Tôi không phải là tác giả): https://github.com/twitwi/AndroidDnssdDemo

Đây là một dự án mẫu mà khá nhiều chương trình như thế nào để có được tất cả mọi thứ lên và chạy. Nó cũng bao gồm một jmdns.jar tùy chỉnh giải quyết một số vấn đề mà tôi đã gặp với jmdns.jar nằm ngoài hộp có tệp lớp trùng lặp.

8

Tôi đã quản lý để biên dịch Bonjour cho Android và làm cho nó chạy giống như cách Apple dự định chạy trên các thiết bị nhúng như máy in. Here là tập lệnh xây dựng.

Here là trình bao bọc tiện lợi nhỏ để làm cho nó hoạt động như bạn mong đợi.

Chúng tôi đang sử dụng lớp client_shim từ phân phối Bonjour để bao bọc tất cả quyền truy cập vào triển khai mDNS được nhúng thông qua API dns_sd.h thông thường. Bạn không sử dụng thành ngữ với các filehandles và chọn với lớp shim.

Lớp client_shim không được hỗ trợ tốt bởi Apple - thực ra tôi đã tìm thấy lỗi chính tả trong các tên biến, nhưng nó vẫn hoạt động. Bạn sẽ cần phải áp dụng this patch để bao gồm các tệp tiêu đề chính xác, sửa lỗi chính tả và nhận ghi nhật ký qua API Android.

Một điều nữa: Bạn cần để lấy và giữ Khóa MultiCast từ bên trong mã Java của bạn, nếu không bạn sẽ không tìm thấy bất kỳ ai khác. Xem ví dụ here.

Ngoài ra, tôi có nó hoạt động trên API Android cấp 8 và chúng tôi đang duy trì một thư viện được dựng sẵn của Bonjour for Android, mặc dù tôi không chắc chắn liệu điều này có đúng theo giấy phép hay không.

được sửa đổi:

Các phiên bản trong prebuilts là 330,10, những cái mới hơn với client_shim như thư viện tĩnh thất bại trong việc biên dịch với MSVC2010 trên cửa sổ, vì vậy chúng tôi giữ thế này.

Chúc may mắn!

+0

Một số liên kết đã chết, nhưng tôi đã tìm được các ví dụ dựng sẵn. Các lớp học này có thể được sử dụng để giao tiếp với thiết bị của Apple sử dụng cài đặt Bonjour của họ hay thiết bị Apple có đang chạy umundo không? –

+0

Chúng tôi vẫn có các bản dựng sẵn, nhưng chúng đã chuyển thành [tarball] (http://umundo.tk.informatik.tu-darmstadt.de/prebuilt/0.4.3/) được tải xuống ở thời gian định cấu hình. Đối với mỗi nền tảng nhưng darwin, có một libmdnsembedded bên trong. uMundo là ZeroMQ + mDNS cho pub/sub - nếu bạn chỉ muốn tìm các dịch vụ, sử dụng libmdnsembedded và dns_sd.h mà không có sự lựa chọn nào được thực hiện trong việc thực hiện client_shim. – sradomski

+0

Tôi chỉ muốn tìm các dịch vụ thông qua thiết bị Android của mình. Có bất kỳ ví dụ nào để sử dụng tệp 'libmDNSEmbedded.a' trên thiết bị Android kết hợp với dns_sd.h không? Có một trình bao bọc java để khám phá dịch vụ đơn giản không? –

6

Android 4.1 thêm hỗ trợ Bonjour gốc (có vẻ như được triển khai thông qua mDNSResponder) cho các ứng dụng. API cấp cao dường như được gọi là Network Service Discovery nhưng dường như là Bonjour bên dưới. Dường như có một API cấp thấp hơn được hiển thị qua android.net.wifi.p2p.WifiP2pManager.

Mặc dù dường như không được sử dụng để tra cứu DNS toàn hệ thống (ví dụ: tôi không thể duyệt qua http://machine.local qua Chrome) có vẻ như đây là cách để thực hiện tra cứu zeroconf/Bonjour cho ứng dụng Android gốc tiến về phía trước.

+5

Thật không may, API gốc không cho phép truy cập vào bản ghi TXT, vốn bị hạn chế nghiêm trọng - https://code.google.com/p/android/issues/detail?id=136099 –