Qualche volte potrebbe essere necessario trovare i servizi di un determinato dispositivo: infatti ogni dispositivo che integri il Bluetooht permette alcune funzionalità.

Proviamo ad immaginare ad un auricolare Bluetooth: esso permette di creare uno streaming di dati audio; un cellulare permette di inviare vCard (biglietti da visita elettronici); un computer invece permette oltre che inviare dati (file), streaming dati multimediali e tanto altro.

Questo codice che ho tratto dal sito originale del progetto (www.bluecove.org) permette di effettuare una ricerca dei dispositivi e poi elenca per ciascuno i servizi dispoibili.

Però, per eseperienza personale, non sono mai riuscito a trovare servizi sui miei dispositivi (eppure permettono di scambiare dati senza problemi) e per questo mi fido dei direttori del progetto.

Per ultima cosa vi ricordo che il codice NON è mio e che è tratto dal sito originale (con una correzione per far si che funzioni).

import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import javax.bluetooth.*;

/**
 *
 * Minimal Services Search example.
 */
public class ServicesSearch {

    static final UUID OBEX_FILE_TRANSFER = new UUID(0x1106);

    public static final Vector serviceFound = new Vector();

    public static void main(String[] args) throws IOException, InterruptedException 
    {
        // First run RemoteDeviceDiscovery and use discoved device
        RemoteDeviceDiscovery.main(null);
        serviceFound.clear();
        UUID serviceUUID = OBEX_FILE_TRANSFER;
        if ((args != null) && (args.length > 0)) 
        {
            serviceUUID = new UUID(args[0], false);
        }
        final Object serviceSearchCompletedEvent = new Object();
        DiscoveryListener listener = new DiscoveryListener() 
        {

            public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) 
            {
            	// Al momento, non ci interessa
            }

            public void inquiryCompleted(int discType) 
            {
            	// Al momento, non ci interessa
            }

            public void servicesDiscovered(int transID, ServiceRecord[] servRecord) 
            {
                for (int i = 0; i < servRecord.length; i++) 
                {
                    String url = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
                    if (url == null) 
                    {
                        continue;
                    }
                    serviceFound.add(url);
                    DataElement serviceName = servRecord[i].getAttributeValue(0x0100);
                    if (serviceName != null) 
                    {
                        System.out.println("service " + serviceName.getValue() + " found " + url);
                    } else 
                    {
                        System.out.println("service found " + url);
                    }
                }
            }

            public void serviceSearchCompleted(int transID, int respCode) 
            {
                System.out.println("service search completed!");
                synchronized(serviceSearchCompletedEvent){
                    serviceSearchCompletedEvent.notifyAll();
                }
            }

        };

        UUID[] searchUuidSet = new UUID[] { serviceUUID };
        int[] attrIDs =  new int[] {
                0x0100 // Service name
        };

        for(Enumeration en = RemoteDeviceDiscovery.devicesDiscovered.elements(); en.hasMoreElements(); ) 
        {
            RemoteDevice btDevice = (RemoteDevice)en.nextElement();
            synchronized(serviceSearchCompletedEvent) 
            {
                System.out.println("search services on " + btDevice.getBluetoothAddress() + " " + btDevice.getFriendlyName(false));
                LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(attrIDs, searchUuidSet, btDevice, listener);
                serviceSearchCompletedEvent.wait();
            }
        }

    }

}

Possiamo vedere velocemente i passi fondamentali: una ricerca dei dispositivi e poi si va alla ricerca di dispositivi trovati: semplice e il codice nemmeno troppo lungo.

Inoltre in rete ho trovato anche i profili dei sistemi bluetooth: un "profilo" è una sorta di protocollo utilizzato in vari ambiti. Per esempio c'è un protocollo per gestire lo streaming audio oppure un altro per gestire connessioni di rete. Ecco qui un riassunto di alcuni profili presenti (in rete ne potrete trovare molti di più):

A2DP: gestione flusso audio, utilizzato per auricolari Bluetooth

FTP: trasferimento file (da cellulari a computer)

HCRP: permette di connettersi a stampanti (tramite Bluetooth, ovviamente)

SPP: permette di creare e gestire un cavo seriale virtuale

(informazioni trovate dal sito: http://searchnetworking.techtarget.it/articoli/0,1254,19_ART_81317,00.html)

Nel prossimo articolo vedremo come utilizzare il blutooth con Linux: infatti le cose si complicheranno un poco ma nulla di particolare, il codice è lo stesso.