Tôi đang cố triển khai bonjour/zero conf trên ứng dụng Android của mình. Tôi đang sử dụng thư viện jmDns để tìm kiếm tất cả các thiết bị có sẵn. Đây là mã mà tôi đang sử dụng để tìm kiếm các thiết bị trong cùng một mạng:Triển khai Bonjour trên Android
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();
}
}
}
Về cơ bản, tôi thêm chúng vào danh sách để tôi có thể hiển thị danh sách tất cả các thiết bị có sẵn. Bây giờ khi tôi đang chạy mã này, tôi không nhận được ngoại lệ/không có gì giống như lỗi. Nhưng mặt khác, không có gì được thêm vào danh sách của tôi [PS: có ít nhất 5-6 PC và Mac đang có trong mạng.
Tôi cũng đã cố gắng để có được danh sách các từ mã này:
jmdns.addServiceListener("_http._tcp.local.", listener);
listener
được định nghĩa trong onCreate
của hoạt động này. Nhưng điều này cũng không trả lại bất kỳ thiết bị nào.
Vui lòng trợ giúp, đề xuất những gì tôi đang làm sai ở đây. Bất kỳ trợ giúp được đánh giá cao!
Bạn không nên sử dụng mã này: if (! InetAddress.isLoopbackAddress() &&! InetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) – Radu
@mudit.Tôi hiểu một số thời gian đã trôi qua kể từ khi bạn gặp phải vấn đề này. Bạn đã thử liệt kê theo "_http._tcp" thay vì "_http._tcp.local." Tôi không thể giải thích tại sao, nhưng nó làm cho sự khác biệt trong trường hợp của tôi. Cho đến nay nó chỉ tạo sự khác biệt khi sử dụng NsdManager (khám phá Android tiêu chuẩn). Tôi sẽ biết làm thế nào nó có thể ảnh hưởng đến JmDNS tra cứu sau này, ngay sau khi người dùng của chúng tôi với vấn đề sẽ thử nó ... – vladimir