Android NSD lange Wartezeiten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Android NSD lange Wartezeiten

    Hallo zusammen,

    Bei der Implementierung von Android's offizieller Network Service Discovery habe ich zwei unschöne Nebeneffekte:

    1) OnServiceLost() wird nie gerufen. Ich kann den gefundenen Drucker abstecken oder auch das gefundene iPhone aus dem WLAN entfernen, es ändert leider nichts.

    2) OnServiceFound() benötigt bis zu 30 Sekunden, um zu antworten, manchmal genügen auch weniger als eine.

    Nun zu der Frage: fehlt etwas bei der offiziellen Android Dokumentation, wodurch es diese unschönen Effekte hat.

    Wenn nicht habe ich mich auch schon mit Alternativen beschäftigt, wie beispielsweise RxNDSSD(hoffe das ist richtig, bin leider im Zug, wenn ich das tippe).

    Jedoch kenne ich mich mit nativer Einbindung von C++(also die Bonjourfiles von Apple nicht aus). Kennt jemand noch Alternativen oder Ansätze? Danke :3
  • Hallo
    Frage hast du dich den auch mit dem Drucker verbunden. Wenn du ihn nur gesehen hast. Aber nicht verbunden woher soll denn dann die lost Methode wissen worauf sie reagieren soll. Dann müsste die Methode at alle Geräte die mal sichtbar waren und wieder weg sind reagieren. Dazu müsste sich Android alle Geräte merken das ist schon etwas viel verlangt und du würdest nicht von welchen Gerät die Nachricht kommt.
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo jogimuc,

    Nein, ich habe den Service nicht resolved, sondern durch

    Java-Quellcode

    1. "_services._dns-sd._udp."
    lediglich alle Services mir anzeigen lassen.

    Da der Listener jedoch eine solche Methode implementiert hat und auch aus der Dokumentation nicht ersichtlich wird, dass man einen Service resolven muss, um ihn zu verlieren, empfinde ich das nicht als zu viel verlangt.
    Außerdem zeigt das Diagramm(siehe Link) sogar ein add to und remove from list.

    Dennoch wäre das ja kein Problem das selbst zu implementieren, aber ich verstehe nicht, wieso die Antwortzeit manchmal so unfassbar lange braucht:
    Bilder
    • Unbenannt.PNG

      923,8 kB, 871×435, 30 mal angesehen
  • Ich hab den Quellcode mal sauber rausgeschrieben. Orientiert habe ich mich hier.

    Die Antwortzeit beträgt zwischen Start der Discovery und Found eines Services bis zu 40 Sekunden.

    Java-Quellcode: MainActivity.java

    1. public class MainActivity extends AppCompatActivity {
    2. NsdManager mNsdManager;
    3. NsdManager.DiscoveryListener mDiscoveryListener;
    4. public static final String SERVICE_TYPE = "_services._dns-sd._udp.";
    5. public static final String TAG = "NsdHelper";
    6. @Override
    7. protected void onCreate(Bundle savedInstanceState) {
    8. super.onCreate(savedInstanceState);
    9. setContentView(R.layout.activity_main);
    10. }
    11. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    12. @Override
    13. protected void onStart() {
    14. super.onStart();
    15. mNsdManager = (NsdManager) this.getSystemService(Context.NSD_SERVICE);
    16. discoverServices();
    17. }
    18. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    19. void initDiscoveryListener(){
    20. mDiscoveryListener = new NsdManager.DiscoveryListener() {
    21. @Override
    22. public void onStartDiscoveryFailed(String serviceType, int errorCode) {
    23. Log.e(TAG, "Discovery START failed: Error code:" + errorCode);
    24. }
    25. @Override
    26. public void onStopDiscoveryFailed(String serviceType, int errorCode) {
    27. Log.e(TAG, "Discovery STOP failed: Error code:" + errorCode);
    28. }
    29. @Override
    30. public void onDiscoveryStarted(String serviceType) {
    31. Log.d(TAG, "Service discovery started");
    32. }
    33. @Override
    34. public void onDiscoveryStopped(String serviceType) {
    35. Log.i(TAG, "Discovery stopped: " + serviceType);
    36. }
    37. @Override
    38. public void onServiceFound(NsdServiceInfo serviceInfo) {
    39. Log.d(TAG, "Service discovery success" + serviceInfo);
    40. }
    41. @Override
    42. public void onServiceLost(NsdServiceInfo serviceInfo) {
    43. Log.e(TAG, "service lost" + serviceInfo);
    44. }
    45. };
    46. }
    47. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    48. public void discoverServices() {
    49. stopDiscovery(); // Cancel any existing discovery request
    50. initDiscoveryListener();
    51. mNsdManager.discoverServices(
    52. SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
    53. }
    54. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    55. public void stopDiscovery() {
    56. if (mDiscoveryListener != null) {
    57. try {
    58. mNsdManager.stopServiceDiscovery(mDiscoveryListener);
    59. } finally {
    60. }
    61. mDiscoveryListener = null;
    62. }
    63. }
    64. }
    Alles anzeigen
  • Hallo was mir als erstes in deinem Code auffällt ist das du in der Methode Start, die Methode discoverServices aufrufst, und dort als erstes stopDiscovery.
    Somit beendest du den Service ja auch gleich wieder.

    Auch kann ich kein NsdServiceInfo Objekt erkenn wo du festlegst auf welchen Service du wartest.
    Auch resolvst du den Service nicht wenn ihn onServiceFound gefunden hast. Schaue dir doch mal dein eigenes gefundenes Beispiel genauer an und versuch auch da nachzuvollziehen in welcher Reihenfolge die Methoden aufgerufen werden.

    Ps. Hier noch ein Link
    jayrambhia.com/blog/android-wireless-connection-1

    Mir scheint du willst den Code für den Server als Client benutzen.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von jogimuc ()