I am trying to implement bonjour/zero conf on my android app. I am using jmDns library for searching the all the available devices. Here is the code that I am using for searching the devices in the same network:
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(); } } }
Basically, I am adding them in a list so that I can display a list of all available devices. Now when I am running this code, I am getting no exception/nothing like error. But on the other hand, nothing is added to my list [PS: there atleast 5-6 PCs and Macs are there in the network.
I also tried to get the list from this code:
jmdns.addServiceListener("_http._tcp.local.", listener);
listener
is defined in the onCreate
of the activity. But this also did not returned any device.
Please help, suggest what I am doing wrong here. Any help is appreciated!
(I know that technically it's “Bonjour” only on Apple platforms. The Android implementation officially calls itself Network Service Discovery. And both of them are implementations of “zero-configuration networking” using “DNS-SD (Service Discovery)” and “Multicast DNS” and…
Bonjour, also known as zero-configuration networking, enables automatic discovery of devices and services on a local network using industry standard IP protocols.
Bonjour Browser lets you browse your local network for Bonjour (ZeroConf, Avahi) services for http and launch a browser on found services. You can use the System Browser or an embedded one.
Bonjour uses a cache of Multicast DNS records to prevent hosts from requesting information that has already been requested. For example, when one host requests, say, a list of LPR print spoolers, the list of printers comes back via multicast, so all local hosts see it.
Android 4.1 adds Network Service Discovery that seems to be just wrapping up the Bonjour stack in different terms. I also see a lower-level API called android.net.wifi.p2p.WifiP2pManager that exposes DNS-SD (as well as UPnP?) directly.
Note that the underlying mDNSResponder daemon does not seem to be running all the time, and is not used for systemwide DNS lookups (e.g. from a browser) as far as I can tell right now.
I can't give you any specific help with the code but I'm pretty sure that there are issues with Android and mDNS at least with some handsets and (I believe) the emulator.
More information here:
http://rgladwell.wordpress.com/2010/04/18/gotchas-android-and-multicast-dns/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With