Descoperirea Serviciilor Accesibile

Operațiile de pornire / oprire a descoperirii serviciilor disponibile trebuie să aibă în vedere resursele afectate precum și impactul asupra altor funcționalități cum ar fi viteza de transfer prin rețea, respectiv autonomia.

De regulă, pornirea operației de descoperire a serviciilor disponibile este realizată pe metoda onResume(), adică din momentul în care activitatea este vizibilă.

Similar, oprirea operației de descoperire a serviciilor disponibile este realizată pe metoda onPause(), adică din momentul în care activitatea nu este vizibilă.

Totodată, este recomandat să se pună la dispoziția utilizatorilor elemente în cadrul interfeței grafice prin intermediul cărora aceste operații să poată fi controlate prin interacțiunea cu cei care folosesc aplicația Android.

JmDNS

**Pornirea ** operației de descoperire a serviciilor disponibile se face prin intermediul metodei addServiceListener(String, ServiceListener) din clasa JmDNS care primește ca parametri:

  • tipul de serviciu;
  • un obiect ascultător de tipul ServiceListener, care reacționează la evenimentele legate de serviciile găsite / pierdute.

Oprirea operației de descoperire a serviciilor disponibile se face prin intermediul metodei removeServiceListener(String, ServiceListener) din clasa JmDNS care primește ca parametru un obiect ascultător de tipul ServiceListener, care reacționează la evenimentele legate de serviciile găsite / pierdute.

Ca atare, informațiile cu privire la găsirea / pierderea serviciilor în rețeaua locală vor fi furnizate numai între apelurile metodelor addServiceListener(), respectiv removeServiceListener().

public void startNetworkServiceDiscovery() {
  if (jmDns != null && serviceListener != null) {
    jmDns.addServiceListener(Constants.SERVICE_TYPE, serviceListener);
  }
}
    
public void stopNetworkServiceDiscovery() {
  if (jmDns != null && serviceListener != null) {
    jmDns.removeServiceListener(Constants.SERVICE_TYPE, serviceListener);
  }
        
  * ...
}

Pentru obiectul de tip ServiceListener trebuie implementate metodele apelate în mod automat în momentul în care un serviciu este găsit, respectiv este pierdut:

  • serviceAdded(ServiceEvent) - se verifică parametrii serviciului descoperit (tip și denumire), putându-se întâlni următoarele situații:

    1. tip de serviciu necunoscut (cu toate că descoperirea implică filtrarea după un tip de servicii specific);
    2. descoperirea serviciului oferit de mașina curentă / dispozitivul curent - se realizează comparația dintre denumirea serviciului găsit și denumirea serviciului curent;
    3. descoperirea unui serviciu oferit de o altă mașină / un alt dispozitiv (se poate folosi un șablon pe denumirea serviciului) - se trece la rezolvarea serviciului respectiv (prin invocarea metodei requestServiceInfo(String, String) din cadrul obiectului de tip JmDNS.
  • serviceRemoved(ServiceEvent) - se gestionează corespunzător lista de servicii descoperite.

Un obiect de tipul ServiceInfo conține, printre altele, și informații cu privire la:

ServiceListener serviceListener = new ServiceListener() {

  * ...
  
  @Override
  public void serviceAdded(ServiceEvent serviceEvent) {
    if (!serviceEvent.getType().equals(Constants.SERVICE_TYPE)) {
      Log.i(Constants.TAG, "Unknown Service Type: " + serviceEvent.getType());
    } else if (serviceEvent.getName().equals(serviceName)) {
      Log.i(Constants.TAG, "The service running on the same machine has been discovered: " + serviceName);
    } else if (serviceEvent.getName().contains(Constants.SERVICE_NAME_SEARCH_KEY)) {
      Log.i(Constants.TAG, "The service should be resolved now: " + serviceEvent);
      jmDns.requestServiceInfo(serviceEvent.getType(), serviceEvent.getName());
    }
  }
  
  @Override
  public void serviceRemoved(final ServiceEvent serviceEvent) {
    ServiceInfo serviceInfo = serviceEvent.getInfo();
    if (serviceInfo == null) {
      Log.e(Constants.TAG, "Service Info for Service is null!");
      return;
    }
    
    String[] hosts = serviceInfo.getHostAddresses();
    String host = null;
    if (hosts.length != 0) {
      host = hosts[0];
      if(host.startsWith("/")) {
        host = host.substring(1);
      }
    }
    
    int port = serviceInfo.getPort();
    
    * ...
    
    ArrayList<NetworkService> discoveredServices = chatActivity.getDiscoveredServices();
    NetworkService networkService = new NetworkService(serviceEvent.getName(), host, port, -1);
    if (discoveredServices.contains(networkService)) {
      int index = discoveredServices.indexOf(networkService);
      discoveredServices.remove(index);
      chatActivity.setDiscoveredServices(discoveredServices);
    }
  }
};

Note

Alternativ, rezolvarea serviciului descoperit poate fi realizată ad-hoc (fără a se apela metoda serviceResolved()), prin apelul metodei getServiceInfo(String, String), cu precizarea că timpul său de execuție poate fi considerabil:

ServiceInfo serviceInfo = serviceEvent.getDNS().getServiceInfo(
  serviceEvent.getType(), 
  serviceEvent.getName()
);