2016-04-22 8 views
2

Das erste Mal versuchen, IP-Discovery in Android zu tun. Ich benutzte die http://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover und schrieb den Code. Ich registriere das Gerät nicht, sondern entdecke Dienste im Netzwerk. Wenn ich das Projekt im Emulator oder Gerät ausführe, wird die onDiscoveryStarted() aufgerufen, aber onServiceFound() wird nie aufgerufen. Bitte finden Sie meinen Code unten. Jede Eingabe wird sehr geschätzt. Vielen Dank!Android NSD onServiceFound() wird nicht aufgerufen

public class MainActivity extends AppCompatActivity { 

    private Button discoverButton; 

    Context mContext; 

    NsdManager mNsdManager; 
    NsdManager.ResolveListener mResolveListener; 
    NsdManager.DiscoveryListener mDiscoveryListener; 
    NsdManager.RegistrationListener mRegistrationListener; 

    public static final String SERVICE_TYPE = "_http._tcp."; 
    public static final String TAG = "MyApp_MAIN_CLIENT"; 
    public String mServiceName = "MyApp"; 

    /* 
    * public static final String SERVICE_TYPE = "_http._tcp."; 
    public static final String TAG = "NsdHelper"; 
    public String mServiceName = "NsdChat"; 
    * */ 

    NsdServiceInfo mService; 
    private Handler mUpdateHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mNsdManager = (NsdManager) this.getSystemService(Context.NSD_SERVICE); 
     discoverButton = (Button) findViewById(R.id.netButton); 
     discoverButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(android.view.View v) { 
       initializeDiscoveryListener(); 
       initializeResolveListener(); 
       discoverServices(); 

      } 
     }); 

    } 

    public void discoverServices() { 
     mNsdManager.discoverServices(
       SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
    } 


    public void initializeDiscoveryListener() { 

     // Instantiate a new DiscoveryListener 
     mDiscoveryListener = new NsdManager.DiscoveryListener() { 

      // Called as soon as service discovery begins. 
      @Override 
      public void onDiscoveryStarted(String regType) { 
       Log.d(TAG, "Service discovery started"); 
      } 

      @Override 
      public void onServiceFound(NsdServiceInfo service) { 
       // A service was found! Do something with it. 
       Log.d(TAG, "Service discovery success" + service); 
       if (!service.getServiceType().equals(SERVICE_TYPE)) { 
        // Service type is the string containing the protocol and 
        // transport layer for this service. 
        Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); 
       } /*else if (service.getServiceName().equals(mServiceName)) { 
        // The name of the service tells the user what they'd be 
        // connecting to. It could be "Bob's Chat App". 
        Log.d(TAG, "Same machine: " + mServiceName); 
       } 
       //else if (service.getServiceName().contains("NsdChat")){*/ 
       else{ 
        mNsdManager.resolveService(service, mResolveListener); 
       } 
      } 

      @Override 
      public void onServiceLost(NsdServiceInfo service) { 
       // When the network service is no longer available. 
       // Internal bookkeeping code goes here. 
       Log.e(TAG, "service lost" + service); 
      } 

      @Override 
      public void onDiscoveryStopped(String serviceType) { 
       Log.i(TAG, "Discovery stopped: " + serviceType); 
      } 

      @Override 
      public void onStartDiscoveryFailed(String serviceType, int errorCode) { 
       Log.e(TAG, "Discovery failed: Error code:" + errorCode); 
       mNsdManager.stopServiceDiscovery(this); 
      } 

      @Override 
      public void onStopDiscoveryFailed(String serviceType, int errorCode) { 
       Log.e(TAG, "Discovery failed: Error code:" + errorCode); 
       mNsdManager.stopServiceDiscovery(this); 
      } 
     }; 
    }// end of initializeListener() 


    public void initializeResolveListener() { 
     mResolveListener = new NsdManager.ResolveListener() { 

      @Override 
      public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 
       Log.e(TAG, "Resolve failed" + errorCode); 
      } 

      @Override 
      public void onServiceResolved(NsdServiceInfo serviceInfo) { 
       Log.e(TAG, "Resolve Succeeded. " + serviceInfo); 

       if (serviceInfo.getServiceName().equals(mServiceName)) { 
        Log.d(TAG, "Same IP."); 
        return; 
       } 
       mService = serviceInfo; 
       int port = mService.getPort(); 
       InetAddress host = mService.getHost(); 
       Log.d(TAG,host.toString()); 
      } 
     }; 
    }//end of initializeResolveListener 


    @Override 
    protected void onPause() { 
     super.onPause(); 
     stopDiscovery(); 
     tearDown(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     discoverServices(); 
    } 

    @Override 
    protected void onDestroy() { 
     tearDown(); 
     super.onDestroy(); 
    } 

    public void stopDiscovery() { 
     mNsdManager.stopServiceDiscovery(mDiscoveryListener); 
    } 


    public void tearDown() { 
     mNsdManager.unregisterService(mRegistrationListener); 
    } 
} 
+0

_ „Ich bin nicht das Gerät registriert, nur Dienstleistungen im Netz zu entdecken“ _. Das ist der Grund. Sie können keinen Service finden, der nicht registriert wurde. Ein Gerät sollte den Dienst registrieren, den andere Geräte entdecken ... (Ein Hinweis zum NSD-Beispiel: Nicht registrieren und den Dienst auf dem gleichen Gerät entdecken) – Onik

+0

Die Android NSD-Dokumentation besagt ausdrücklich, dass der Schritt "Registrierung" optional ist . Wenn Sie Ihr Gerät nicht registrieren möchten, fahren Sie mit Schritt 2: Ermitteln anderer Dienste fort. – pws35

+0

Versuchen Sie, den letzten Punkt aus "_http._tcp" zu entfernen. -> "_http._tcp"; – Dmitry

Antwort

1

Wahrscheinlich aufgrund des Alters dieses Beitrags hoffe ich, dass Sie bereits eine Lösung gefunden haben.

Wenn nicht, ist meine Erfahrung, dass der Android Emulator (API Level 25) keinen vollständigen Netzwerk-Stack bietet und die Service-Erkennung durch NSD funktioniert nicht.

Ich wechselte zum Debuggen auf einem echten Gerät (wie ein Android TV oder Tablet) und dann meine ganze NSD/Bonjour-like-Setup funktionierte. Die Methoden des DiscoveryListeners und des ResolveListeners wurden aufgerufen und eine IP und ein Port (in meinem Fall) wurden abgerufen.

Verwandte Themen