0

To discover the list of services using NSDManager class I had implemented some code with google reference but I cannot get the host address when I try to discover the services. It is showing null when Discovery started. I had referred this link for discovering the list of devices connected in the same network i followed this blog to get all the services when connected to same network.

Is my approach is correct to get the list of services/devices connected to same network?

I tried following code to discover list

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv=(TextView)findViewById(R.id.mytext);
    mylist=new List<NsdManager.DiscoveryListener>() {
        @Override
        public int size() {
            return s;
        }

        @Override
        public boolean add(NsdManager.DiscoveryListener discoveryListener) {
            return true;
        }

        @Override
        public NsdManager.DiscoveryListener get(int i) {
            return mDiscoveryListener;
        }

        @Override
        public NsdManager.DiscoveryListener set(int i, NsdManager.DiscoveryListener discoveryListener) {
            return mDiscoveryListener;
        }


        @Override
        public NsdManager.DiscoveryListener remove(int i) {
            return mDiscoveryListener;
        }

    };
    nsdList=new ArrayList<>();
    nsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE);
    //broadcaster = LocalBroadcastManager.getInstance(mContext);
    registerService(port);

    initializeResolveListener();
    discoverServices();

}



 public void initializeDiscoveryListener() {
    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 : " + service);
            String serviceType = service.getServiceType();
            mylist.add(mDiscoveryListener);
            nsdList.add(service.getServiceName());

            s++;

            Log.d(TAG, "Service discovery success: " + service.getServiceName());


            boolean isOurService = serviceType.equals(SERVICE_TYPE) || serviceType.equals(SERVICE_TYPE);

            if (!isOurService) {
                Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
            } else if (service.getServiceName().equals(SERVICE_NAME)) {
                Log.d(TAG, "Same machine: " + SERVICE_NAME);
            } else if (service.getServiceName().contains(SERVICE_NAME)) {
                Log.d(TAG, "different machines. (" + service.getServiceName() + "-" +
                        SERVICE_NAME+ ")");
                nsdManager.resolveService(service, mResolveListener);

            }
        }

Registered service with

public void registerService(int port) {
    NsdServiceInfo serviceInfo = new NsdServiceInfo();
    serviceInfo.setServiceName(SERVICE_NAME);
    serviceInfo.setServiceType(SERVICE_TYPE);
    serviceInfo.setPort(port);

    nsdManager.registerService(serviceInfo,
            NsdManager.PROTOCOL_DNS_SD,
            registrationListener);
}

my resolve listener

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.v(TAG, "Resolve Succeeded. " + serviceInfo);
            if (serviceInfo.getServiceName().equals(mService)) {
                Log.d(TAG, "Same IP.");
                return;
            }
            mService = serviceInfo;

            int port = mService.getPort();
            InetAddress host = mService.getHost();            }
    };
}

When I try to execute the code it shows nullshows null

Rognik
  • 145
  • 13

1 Answers1

1

When you discover a service, it's just a PTR record:

_http._tcp.local. type PTR, class IN, myService._http._tcp.local.

If you want the host/port info, you must resolve that record even it's advertised by yourself.

jfly
  • 7,715
  • 3
  • 35
  • 65
  • I could get the port number and ip address of that particular device but I didnt found the other devices... – Rognik May 19 '17 at 10:44