2012-10-09 17 views
27

मैं एंड्रॉइड नेटिव सर्विस डिस्कवरी का उपयोग कर एक एप्लिकेशन चलाने की कोशिश कर रहा हूं लेकिन कभी-कभी जब मैं एप्लिकेशन चलाता हूं, तो यह मेरे नेटवर्क से सभी सेवाओं को नहीं खोजता है। मैं चार गैलेक्सी नेक्सस का उपयोग करके https://github.com/joeluchoa/nsd से कोड चला रहा हूं और उनमें से प्रत्येक बार एक ही समय में विभिन्न प्रकार की सेवाओं की खोज करता है।एंड्रॉइड एनएसडी सभी सेवाओं की खोज नहीं कर रहा है

मूल रूप से मैं एक ServerSocket के साथ एक सेवा चलाने:

ServerSocket server = new ServerSocket(0); 
Log.i(TAG, "IP " + server.getInetAddress() 
     + ", running on port " + server.getLocalPort()); 

Intent intent = new Intent(MySocket.this, 
     MyPresence.class); 
intent.putExtra("PORT", server.getLocalPort()); 
startService(intent); 

तो मैं यह NsdManager से विधि registerService का उपयोग कर प्रकाशित:

NsdServiceInfo serviceInfo = new NsdServiceInfo(); 

serviceInfo.setServiceName(Build.SERIAL + "-" + new Date().getTime()); 
serviceInfo.setServiceType(SERVICE_TYPE); 
serviceInfo.setPort(port); 

mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, 
     mRegistrationListener); 

सेवाओं मैं NsdManager से विधि discoverServices का उपयोग की खोज करने के लिए:

mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, 
     mDiscoveryListener); 

mDiscoveryListener के साथ निम्नानुसार है:

mDiscoveryListener = new NsdManager.DiscoveryListener() { 

    @Override 
    public void onDiscoveryStarted(String regType) { 
     Log.d(TAG, "Service discovery started"); 
    } 

    @Override 
    public void onServiceFound(NsdServiceInfo service) { 
     Log.d(TAG, "Service discovery success"); 
     Log.d(TAG, String.format("%s %s %s %d", 
       service.getServiceName(), service.getServiceType(), 
       service.getHost(), service.getPort())); 
     if (!service.getServiceType().contains(SERVICE_TYPE)) { 
      Log.d(TAG, 
        "Unknown Service Type: " + service.getServiceType()); 
     } else if (service.getServiceName().equals(mServiceName)) { 
      Log.d(TAG, "Same machine: " + mServiceName); 
     } else { 
      mNsdManager.resolveService(service, mResolveListener); 
     } 
    } 

    @Override 
    public void onServiceLost(NsdServiceInfo service) { 
     Log.e(TAG, "service lost" + service); 
    } 

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

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

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

क्या मैं कुछ गलत कर रहा हूं? क्या कोई इस के लिए समाधान या कामकाज जानता है?

+0

मैं अपनी पोस्ट acros camer एक एनपीई कि पॉपअप करने के लिए जब मैं एक ही एनएसडी की जानकारी के साथ नेटवर्क में दो उपकरणों है लगता है ठीक करने के लिए प्रयास करने के दौरान ... तो, मैं डॉन ' आपके पास अभी तक कोई जवाब नहीं है, लेकिन मुझे लगता है कि आप उस जानकारी को प्राप्त करने का प्रयास कर रहे हैं जिसे आपने अपने लॉग स्टेटमेंट में हल नहीं किया है। –

+2

सभी डेवलपर्स के लिए यह एक आम प्रथा है कि –

+0

त्रुटियों को खोजने के लिए सभी चरों को पकड़ने या मुद्रित करने का उपयोग करके आप केवल SERVICE_TYPE की सेवाओं की खोज कर रहे हैं, जो इस उदाहरण में http वेब सर्वर हैं। –

उत्तर

1

मुझे एक ही समस्या थी, पुनः स्थापित करने में मदद मिली। उपयोग करने का प्रयास करें :)

1

मुझे डर है कि कार्यान्वयन में अभी भी बग हैं जो सेवाओं को याद करने का कारण बनती हैं। मैंने कई एंड्रॉइड डिवाइस और मैकबुक के साथ परीक्षण के कुछ दिन किए हैं, और यह हर समय काम नहीं करता है। मैंने एंड्रॉइड बग ट्रैकर में एक बग रिपोर्ट पर अपने निष्कर्षों को दस्तावेज किया: https://code.google.com/p/android/issues/detail?id=178080

1

मुझे लगता है कि एंड्रॉइड में संपूर्ण एनएसडी कार्यान्वयन थोड़ा सा होना चाहिए। मेरे पास जीवन चक्र का प्रदर्शन करने के लिए एक साधारण गतिविधि भी है (कोई सॉकेट खोला नहीं जाता है), और कभी-कभी यह काम करता है, और कभी-कभी यह काम नहीं करता है। मुझे बस यह नहीं मिला। यहाँ गतिविधि अगर किसी को कुछ जानकारी है:

https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifi.java

दूसरी ओर, Wifi प्रत्यक्ष आधारित एनएसडी मेरे लिए बहुत विश्वसनीय लगता है: इनमें से कोई भी है कि

https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifiDirect.java

नोट क्रियाकलापों में कोई संसाधन है, इसलिए उचित अनुमतियों के साथ अपनी अभिव्यक्ति में गतिविधियां जोड़ें।

0

उत्तर के लिए यह बहुत देर हो सकती है, लेकिन मुझे एंड्रॉइड के लिए एनएसडी के लिए एक अच्छा समाधान मिला है जो डेवलपर साइट पर देता है। मैंने कुछ संशोधन किया और यह पूरी तरह से ठीक काम करता है।

public class NsdClient { 
private Context mContext; 

private NsdManager mNsdManager; 
NsdManager.DiscoveryListener mDiscoveryListener; 

//To find all the available networks SERVICE_TYPE = "_services._dns-sd._udp" 
public static final String SERVICE_TYPE = "_hap._tcp."; 
public static final String TAG = "NsdClient"; 

private static ArrayList<NsdServiceInfo> ServicesAvailable = new ArrayList<>(); 

public NsdClient(Context context) { 
    mContext = context; 
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); 
} 

public void initializeNsd() { 
    initializeDiscoveryListener(); 
} 

public void initializeDiscoveryListener() { 
    mDiscoveryListener = new NsdManager.DiscoveryListener() { 

     @Override 
     public void onDiscoveryStarted(String regType) { 
      Log.d(TAG, "Service discovery started " + regType); 
     } 

     @Override 
     public void onServiceFound(NsdServiceInfo service) { 
      Log.d(TAG, "Service discovery success " + service); 
      AVAILABLE_NETWORKS.add(service); 

      if (!service.getServiceType().equals(SERVICE_TYPE)) { 
       Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); 
      } else if (service.getServiceName().equals(mServiceName)) { 
       Log.d(TAG, "Same Machine: " + mServiceName); 
      } else if (service.getServiceName().contains(mServiceName)) { 
       Log.d(TAG, "Resolving Services: " + service); 
       mNsdManager.resolveService(service, new initializeResolveListener()); 
      } 
     } 

     @Override 
     public void onServiceLost(NsdServiceInfo service) { 
      Log.e(TAG, "service lost" + service); 
      if (ServicesAvailable.equals(service)) { 
       ServicesAvailable = null; 
      } 
     } 

     @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); 
     } 
    }; 
} 

public class initializeResolveListener implements NsdManager.ResolveListener { 

    @Override 
    public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 
     Log.e(TAG, "Resolve failed " + errorCode); 
     switch (errorCode) { 
      case NsdManager.FAILURE_ALREADY_ACTIVE: 
       Log.e(TAG, "FAILURE ALREADY ACTIVE"); 
       mNsdManager.resolveService(serviceInfo, new initializeResolveListener()); 
       break; 
      case NsdManager.FAILURE_INTERNAL_ERROR: 
       Log.e(TAG, "FAILURE_INTERNAL_ERROR"); 
       break; 
      case NsdManager.FAILURE_MAX_LIMIT: 
       Log.e(TAG, "FAILURE_MAX_LIMIT"); 
       break; 
     } 
    } 

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


     if (serviceInfo.getServiceName().equals(mServiceName)) { 
      Log.d(TAG, "Same IP."); 
      return; 
     } 

    } 
} 

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

public List<NsdServiceInfo> getChosenServiceInfo() { 
    return ServicesAvailable; 
} 

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

आशा है कि यह इस में मदद करता है

संबंधित मुद्दे