Bonjour-Implementierung auf Android
Bin ich versucht zu implementieren bonjour/zero-conf auf meine android-app. Ich bin mit jmDns-Bibliothek für das suchen der alle verfügbaren Geräte. Hier ist der code, den ich verwende für die Suche der Geräte im gleichen Netzwerk:
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();
}
}
}
Grundsätzlich bin ich dem hinzufügen in eine Liste, so dass ich kann anzeigen einer Liste aller verfügbaren Geräte. Nun, wenn ich diesen code ausführen, ich bekomme keine exception/nichts wie Fehler. Aber auf der anderen Seite, nichts ist Hinzugefügt, um meine Liste [PS: es gibt mindestens 5-6 PCs und Macs im Netzwerk.
Ich habe auch versucht, die Liste von diesem code:
jmdns.addServiceListener("_http._tcp.local.", listener);
listener
definiert wird, in der onCreate
von der Aktivität. Aber dieser auch nicht zurückgegeben jedem Gerät.
Bitte helfen, vorschlagen, was mache ich hier falsch. Jede Hilfe ist willkommen!
InformationsquelleAutor der Frage mudit | 2011-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Android 4.1 fügt Network Service Discovery zu sein scheint, dass gerade die Nachbereitung der Bonjour-stack in verschiedenen Bedingungen. Ich sehe auch eine lower-level-API namens android.net.wifi.p2p.WifiP2pManager , macht DNS-SD (sowie UPnP?) direkt.
Beachten Sie, dass die zugrunde liegenden mDNSResponder-daemon scheint nicht die ganze Zeit laufen, und ist nicht verwendet für die systemweite DNS-lookups (z.B. aus einem browser) so weit wie ich kann sagen, gerade jetzt.
InformationsquelleAutor der Antwort natevw
Kann ich nicht geben Ihnen keine Besondere Hilfe mit dem code, aber ich bin mir ziemlich sicher, dass es Probleme mit Android und mDNS-zumindest bei einigen Handys und (ich glaube) den emulator.
Mehr Informationen hier:
http://rgladwell.wordpress.com/2010/04/18/gotchas-android-and-multicast-dns/
InformationsquelleAutor der Antwort CMF
Wissen Sie für eine Tatsache, dass multicast aktiviert ist auf Ihrem Handy? Sehen http://home.heeere.com/tech-androidjmdns.html.
Und Sie sollten wahrscheinlich auf der Suche nach "_ipp._tcp.lokale" (oder so ähnlich) anstelle von "_http.tcp" - Dienste. Aber das ist nur zum testen, richtig? 🙂
InformationsquelleAutor der Antwort Magnus Wissler
Wie bereits in den Kommentaren oben, der native Android-Unterstützung nicht funktioniert und/oder nicht vollständig implementiert, ermöglichen den Abruf von TXT-records (ab Android v5.1). Ich könnte auch nicht die jmDns Bibliothek zu arbeiten, für discovery. Schließlich fand ich die mdnsjava Projekt und es funktioniert sehr einfach für mich. Beachten Sie, dass sample-code ist nicht korrekt. Hier finden Sie einige Beispiel-code, die ich verwendet, um synchron finden Sie alle IPP-Drucker:
Beachten Sie auch, dass Sie brauchen, um hinzuzufügen, die dnsjava-Bibliothek zu Ihrem Ordner libs und Ihr zu bauen.gradle. Ich benutzte die version 2.1.7.
InformationsquelleAutor der Antwort Matt__C
Können Sie ein bestehendes tool aus dem Android Play Store Scannen Sie den lokalen Netzwerk zunächst, wie "bonjour browser", um sicherzustellen, dass die Dienstleistungen, die Sie Scannen möchten. Dann können Sie die jmDNS keyword im Netzwerk Scannen.
Aber es ist ein bekanntes Problem, dass jmDns funktioniert nicht auf Android 4.x-Geräte.
InformationsquelleAutor der Antwort Zephyr