2012-10-09 8 views
27

Android Native Service Discovery를 사용하여 애플리케이션을 실행하려고하지만 애플리케이션을 실행할 때 네트워크에서 모든 서비스를 찾지 못하는 경우가 있습니다. 저는 4 개의 은하계 연결을 사용하여 https://github.com/joeluchoa/nsd에서 코드를 실행하고 있으며, 동시에 각각 다른 수의 서비스를 발견합니다. 내가 NsdManager에서 메소드 registerService를 사용하여 게시 그런Android NSD가 모든 서비스를 검색하지 못함

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

:

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를 사용하는 서비스를 검색하려면 기본적으로

나는 ServerSocket를 가진 서비스를 실행 :

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

희망이 도움 그래서, 돈 ' 아직 답을 얻지 못했지만, 귀하의 성명서에서 귀하가 해결하지 못한 정보를 얻으려는 것에 주목합니다. –

+2

모든 개발자가 catch를 사용하거나 오류를 찾기 위해 모든 변수를 출력하는 일반적인 방법은 –

+0

입니다.이 예에서는 SERVICE_TYPE (예 : http 웹 서버) 서비스 만 검색하고 있습니다. –

답변

1

같은 문제가 있었지만 다시 설치해야했습니다. 사용해 보자.

1

구현에 버그가있어 서비스가 누락 될까봐 걱정된다. 필자는 여러 대의 안드로이드 장치와 MacBook으로 며칠간 테스트를 해봤지만 항상 작동하지는 않습니다. Android 버그 추적기의 버그 보고서에 대한 결과를 문서화했습니다. https://code.google.com/p/android/issues/detail?id=178080

1

Android의 전체 NSD 구현이 약간 희박해야한다고 생각하는 경향이 있습니다. 또한 라이프 사이클 (소켓이 열리지 않음)을 보여주기위한 간단한 활동이 있으며 때로는 작동하고 때로는 작동하지 않는 경우도 있습니다. 나는 그것을 얻지 못한다. 사람이 통찰력이있는 경우 다음 활동은 다음과 같습니다 한편

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

를, 와이파이 다이렉트를 기반으로 NSD 나를 위해 매우 신뢰할 수있는 것 같다

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

주 이들 중 어느 것도 그 활동에는 자원이 있으므로 적절한 권한으로 활동을 Manifest에 추가하기 만하면됩니다.

0

답변이 거의 늦을 수는 없지만 개발자 사이트에 Android 용 NSD에 대한 좋은 해결책을 발견했습니다. 몇 가지 수정을했고 완벽하게 잘 작동합니다.

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

... 그것은 이것이 내가 같은 NSD 정보와 네트워크에있는 두 장치가있을 때 팝업하는 것 같은 NPE를 해결하기 위해 노력하는 동안 귀하의 게시물 아 크로스가 camer