Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bonjour implementation on Android

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!

like image 331
mudit Avatar asked Jan 11 '11 10:01

mudit


People also ask

Does Android support Bonjour?

(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…

What is Bonjour on my phone?

Bonjour, also known as zero-configuration networking, enables automatic discovery of devices and services on a local network using industry standard IP protocols.

What is Bonjour Browser Android?

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.

How does Bonjour work?

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.


2 Answers

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.

like image 174
natevw Avatar answered Sep 28 '22 02:09

natevw


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/

like image 27
CMF Avatar answered Sep 28 '22 02:09

CMF