JABWT: Device Discovery
Impariamo come fare il Device Discovery con un dispositivo che supporta le API JABWT
Le nuove API uscite da poco per il supporto al BlueTooth in J2ME , JABWT ( Java BlueTooth Wireless Technology ) ci permettono di avere il completo controllo del BlueTooth del nostro dispositivo.
Il Device Discovery è il primo passo per avere informazioni riguardanti device BT operanti nei paraggi. Chiaramente prima di far dialogare le nostre applicazioni con altri dispositivi dovremo avere delle informazioni. Il passo base è appunto quello di trovare questi dispositivi. Per avere una più completa panoramica di queste API possiamo andare a vedere le informazioni riguardanti la JSR82.
Le classi del package javax.bluetooth che ci interessano per il nostro scopo sono le seguenti:
1 2 3 4 5 |
javax.blueetooth.LocalDevice javax.blueetooth.DiscoveryAgent javax.blueetooth.RemoteDevice javax.blueetooth.DeviceClass javax.blueetooth.DiscoveryListener |
Il nostro agente di ricerca
Dobbiamo prima di tutto ottenere un DiscoveryAgent dalla nostra LocalDevice. Ecco quindi il codice per fare ciò
1 2 3 4 5 6 7 8 |
try{ //Otteniamo il nostro agente DiscoveryAgent ourAgent = LocalDevice.getLocalDevice().getDiscoveryAgent(); }catch(BluetoothStateException bse){ Alert exAlert = new Alert("Uh-Oh!", bse.toString(), null, null); exAlert.setTimeout(Alert.FOREVER); } |
Tutto ciò deve essere fatto preferibilmente in un thread perchè la maggior parte dei metodi riguardanti il BlueTooth sono bloccanti
DiscoveryListener
Implementiamo l’interfaccia DiscoveryListener che sarà usata sia nel Device Discovery che nel Service Discovery (argomento che verrà trattato successivamente) per notificare alla nostra MIDlet i risultati della ricerca
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class OurListener implements DiscoveryListener { private RemoteDevice remDev = null; private DeviceClass remDevClass = null; // Quello che stiamo facendo qui è memorizzare la prima device // trovata e il suo class code. public void deviceDiscovered (RemoteDevice btDevice, DeviceClass cod) { remDev = btDevice; remDevClass = cod; } public void inquiryCompleted(int discType) {} public void servicesDiscovered (int transID, ServiceRecord[] servRecord) {} public void serviceSearchCompleted(int transID, int respCode) {} } |
Il metodo inquiryCompleted deve essere implementato dal programmatore in base a quello che vuole essere fatto quando la ricerca delle device è stata completata. Altro metodo interessante è servicesDiscovered che riguarderà il tipo di servizi che sono stati trovati attivi nelle device BT trovate dalla nostra Device Discovery.
Avviare la ricerca
Adesso che abbiamo implementato il nostro agente e interfaccia listener dobbiamo metterci in inquiry mode ovvero alla ricerca di device BT. Il metodo startInquiry serve a questo, ma noi possiamo anche pensare di utilizzare altre device bluetooth, che il nostro dispositivo ha precedente trovato e di cui conserva l’indirizzo. Per fare ciò possiamo semplicemente utilizzare il seguente metodo
1 2 |
RemoteDevice[] remDevArray = ourAgent.retrieveDevices(DiscoveryAgent.CACHED); |
oppure
1 2 |
RemoteDevice[] remDevArray = ourAgent.retrieveDevices(DiscoveryAgent.PREKNOWN); |
CACHED significa che il nostro dispositivo deve cercare dispositivi trovati nella nostra ultima ricerca, PREKNOWN che deve cercare dispositivi con i quali più frequentemente abbiamo dialogato.
Pronto chi parla?
Ora abbiamo a disposizione tutto quello che ci serve per dialogare con la device BT. Per capire che tipo di device sia possiamo semplicemente controllare il suo class code, un valore che esprime la tipologia della nostra device. Quando effettuiamo la ricerca dei dispositivi, viene richiamato in callback il metodo deviceDiscovered come abbiamo visto precedente.
In questo metodo viene passato come argomento la DeviceClass, che è appunto la classe di appartenenza del dispositivo trovato. Qui di seguito potete vedere un riepilogo delle classi dei vari dispositivi
Method | Return Value | Class of Device |
---|---|---|
getServiceClasses() |
0x22000 | Networking and Limited Discoverable Major Service Classes |
getServiceClasses() |
0x100000 | Object Transfer Major Service Class |
getMajorDeviceClass() |
0x00 | Miscellaneous Major Device Class |
getMajorDeviceClass() |
0x200 | Phone Major Device Class |
getMinorDeviceClass() |
0x0C | With a Computer Major Device Class, Laptop Minor Device Class |
getMinorDeviceClass() |
0x04 | With a Phone Major Device Class, Cellular Minor Device Class |
Per maggiori info consultate i seguenti siti
http://jcp.org/jsr/detail/82.jsp
http://www.bluetooth.com/
http://www.bluetooth.org/assigned-numbers/baseband.htm
Una risposta
[…] volta capito come poter fare il Device Discovery vediamo come poter trovare dei servizi nei dispositivi BT grazie al Service […]