JABWT: Service Discovery
Una volta capito come poter fare il Device Discovery vediamo come poter trovare dei servizi nei dispositivi BT grazie al Service Discovery
Se nel precedente articolo facevamo una ricerca di device all’interno del range di funzionamento del BT, ora il nostro scopo è trovare dei servizi disponibili all’interno dei device raggiungibili. Prima di tutto dobbiamo ottenere un nostro DiscoveryAgent come fatto nel precedente articolo tramite l’oggetto LocalDevice e avviare la ricerca.
Nell’interfaccia DiscoveryListener che abbiamo visto in precedenza non avevamo implementato i metodi relativi ai servizi, servicesDiscovered e serviceSearchCompleted
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private ServiceRecord ourRecordArray[]; private int transactionID ... ... //Questo aggiunge le funzionalità //che riguardano il Service Discovery al OurListener del //precedente articolo public void servicesDiscovered(int transID, ServiceRecord[] newRecord){ //Memorizza tutti i record nel ourRecord array for(i=0;i < newRecord.length;i++) ourRecordArray[i] = newRecord[i]; } public void serviceSearchCompleted( int transID, int type){ //Se è una ricerca completata //teniamo traccia di ciò in qualche modo... } |
Ora dobbiamo usare il nostro agente per fare una ricerca di servizi sulla device, il listener poi sarà notificato degli eventi.
I record di servizi che andiamo a trovare non sono altro che array in cui vengono memorizzati un ID del servizio e il loro valore associato. Un UUID è un identificativo unico che fà capire al nostro codice che stiamo accedendo ad un certo tipo di risorsa su una certa device.
Il tipo di dato che tratta è il DataElement, che permette tramite le API Java ai programmatori di accedere a tutte le informazioni di cui abbiamo bisogno (vedere JavaDocs di DataElement per maggiori dettagli). Ecco un esempio di codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
UUID[] uuidSet = new UUID[1]; uuidSet[0] = new UUID(0x1115);//ID utente PAN int[] attrSet = new int[1]; attrSet[0] = 0x0009; //URL Documentazione OurListener listener = new OurListener(); int transactionId; RemoteDevice remoteDevice = remDev; try { transactionId = agent.searchServices (attrSet,uuidSet,remoteDevice,listener); } catch (BluetoothStateException ex){ System.out.println("device unable to begin an inquiry"); } |
In questo esempio stiamo facendo una ricerca solo di un certo UUID, ovvero un utente PAN (Personal Area Networking Profile). Per maggiori dettagli sui servizi e il loro significato vi rimando alla documentazione BlueTooth.
Inoltre richiediamo di trovare anche un attributo in più che e’ l’URL della Documentazione (0x0009). Gli attributi standard che vengono comunque trovati in una ricerca sono ServiceRecordHandle (0x0000), ServiceClassIDList(0x0001), ServiceRecordState (0x0002), ServiceID (0x0003) e ProtocolDescriptorList (0x0004).
Ora se tutto è andato a buon fine, non resta che esaminare i Service Record che abbiamo ottenuto dalla ricerca. In questo caso se abbiamo trovato una sorta di URL della documentazione cerchiamo magari di memorizzarlo o di visionarlo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private int attIDArray[]; ... ... //Prendiamo uno dei ServiceRecord dal nostro array (ServiceRecord)record = ourRecordArray[0]; //Memorizziamo nel nostro array degli attributi il suo ID attIDArray = record.getAttributeIDs(); //Andiamo alla ricerca di attributi che stiamo cercando //ovvero Documentation URL for(i=0;i<attIDArray;i++){ if(attIDArray[i]==0x000B){ System.out.println("Found client Exec url on device:" + record.getHostDevice().getFriendlyName(); execURL = record.getAttributeValue(attIDArray[i]); // Facciamo con questo url quello che vogliamo :P } } |