Service discovery nella API Java Bluetooth JSR-82

Service discovery nella API Java Bluetooth JSR-82
Per l'accesso alla tecnologia Bluetooth nella piattaforma Java è stata definita la specifica,
denominata con il codice JSR-82, di un'architettura e della relativa API, aperta ad implementazioni
di produttori diversi. Tale architettura è stata progettata per esser supportata da calcolatori dotati di
risorse limitate, per cui assume la struttura di un'estensione (opzionale) della piattaforma Java ME
(Micro Edition). Nello stesso tempo, è compatibile con la piattaforma Java SE (Standard Edition),
permettendo anche di far comunicare tramite Bluetooth un componente sviluppato per l'ambiente
Java ME con uno sviluppato per l'ambiente Java SE.
La specifica definisce due package Java, illustrati nel diagramma delle componenti di Figura
1. Il package javax.microedition.io consente l'instaurazione e la gestione di connessioni
Bluetooth (di tipo L2CAP e RFCOMM)
per la comunicazione tra i dispositivi. Il
package
javax.bluetooth
mette
invece a disposizione delle applicazioni le
funzionalità dei profili Bluetooth Generic
Access
Profile
e Service
Application Profile.
Discovery Figura 1: Diagramma delle componenti dell'API Java
Bluetooth
Le funzionalità di particolare interesse sono:
1. ricerca di dispositivi Bluetooth a portata di comunicazione (device discovery);
2. ricerca di servizi da parte di applicazioni client (service discovery);
3. registrazione di servizi da parte di applicazioni server (service registration);
Esaminiamo in dettaglio le modalità previste dall'API per l'implementazione e l'uso di queste
funzioni, con le classi e le interfacce coinvolte.
Device discovery
●
○
La classe javax.bluetooth.LocalDevice rappresenta il dispositivo
Bluetooth locale. Contiene metodi per accedere a determinate proprietà generali relative
al
dispositivo
(tra
cui
indirizzo
fisico
Bluetooth
e
nome)
e
il
metodo
setDiscoverable per rendere individuabile il dispositivo, mettendolo in modalità di
inquiry scanning.
1 - Service discovery nella API Java Bluetooth JSR-82
Floriano Scioscia - SisInfLab
○
La classe javax.bluetooth.RemoteDevice fa riferimento a un dispositivo
Bluetooth remoto. Contiene metodi per accedere a determinate proprietà generali del
dispositivo (tra cui indirizzo fisico Bluetooth e nome) e metodi per l'autenticazione e la
cifratura delle connessioni, secondo quanto previsto dal Generic Access Profile.
○
La classe javax.bluetooth.DiscoveryAgent fornisce metodi sia per il
device discovery sia per il service discovery. Il metodo startInquiry permette di
avviare la sessione di inquiry per l'individuazione dei dispositivi a portata di
comunicazione.
○
L'interfaccia
javax.bluetooth.DiscoveryListener
consente
all'applicazione di ricevere gli eventi legati alle richieste di device e service discovery.
L'applicazione utente dovrà fornire un'implementazione ai metodi di quest'interfaccia
per reagire a tali eventi. Riguardo in particolare alla fase di inquiry, ogni volta che viene
trovato un nuovo dispositivo la libreria Java Bluetooth chiamerà il metodo
deviceDeiscovered fornendo come argomento un RemoteDevice, mentre al
termine della procedura sarà invocato il metodo inquiryCompleted, avente come
argomento un codice che indica se l'inquiry è stata completata regolarmente o se si è
verificato un errore.
●
Service discovery
○
la classe javax.bluetooth.UUID rappresenta un UUID a 16, 32 o 128 bit,
con le relative modalità di traduzione dalle forme abbreviate alla forma estesa; solo
quest'ultima viene utilizzata per effettuare il confronto di valore tra due oggetti di questa
classe.
○
la classe javax.bluetooth.DataElement rappresenta un Data Element del
protocollo SDP. Sono contemplati i diversi tipi di dati definiti dalla specifica. La classe,
inoltre, fornisce metodi per costruire e recuperare il valore di un Data Element.
○
L'interfaccia javax.bluetooth.ServiceRecord rappresenta un record di
servizio SDP, che deve contenere coppie ID-valore per ciascun attributo di servizio. Un
ID è un intero a 16 bit, mentre un valore è un oggetto di classe DataElement.
L'interfaccia contiene un metodo, populateRecord, che deve essere implementato
dal fornitore dell'implementazione per l'API allo scopo di consentire alle applicazioni
2 - Service discovery nella API Java Bluetooth JSR-82
Floriano Scioscia - SisInfLab
utente di reperire gli attributi di un servizio fornito da un server SDP (mediante una
transazione SDP_ServiceAttributeSearch). Questo metodo accetta come argomento un
array degli ID di attributo da richiedere.
○
La classe javax.bluetooth.DiscoveryAgent, già citata per il device
discovery, fornisce anche metodi per la ricerca di servizi SDP. In particolare interessa il
metodo searchServices, che consente all'applicazione utente di eseguire una
transazione SDP_ServiceAttributeSearch. Tra gli argomenti occorre
specificare il
RemoteDevice a cui indirizzare la richiesta, un array di oggetti UUID da usare come
pattern di ricerca e un array con gli ID degli attributi di servizio da reperire per i servizi
che soddisfano i criteri di ricerca.
○
L'interfaccia javax.bluetooth.DiscoveryListener, già menzionata per
il device discovery, contiene altri due metodi che un'applicazione utente client deve
implementare per ricevere notifica degli eventi relativi alle richieste di servizi SDP. Il
primo è servicesDiscovered, che la libreria che implementa l'API chiama quando
vengono ricevuti record di servizio che soddisfano la richiesta. Come argomenti sono
forniti un identificativo della transazione SDP e un array dei ServiceRecord trovati.
Il secondo metodo è serviceSearchCompleted e viene chiamato al termine della
transazione di ricerca di servizi, con un codice che indica se è terminata correttamente
fornendo risultati, oppure se è terminata correttamente ma senza fornire risultati, oppure
infine se si è verificato un errore.
●
Service registration
○
La classe javax.microedition.io.Connector fornisce all'ambiente Java
ME meccanismi generali per l'instaurazione di diversi tipi di connessione. Essa viene
utilizzata anche dall'API Java Bluetooth per connettersi a un dispositivo remoto (utente
di servizio) o accettare connessioni in ingresso (fornitore di servizio). Il metodo open
accetta come argomento un URL che indica il tipo di protocollo (l2cap per connessioni
L2CAP, btspp per connessioni RFCOMM), l'host (localhost per le connessioni in
ingresso, mentre per le connessioni in uscita si indica l'indirizzo Bluetooth del
dispositivo remoto), un numero di porta ed eventuali parametri della connessione.
○
Il succitato metodo Connector.open restituisce un oggetto notifier che
3 - Service discovery nella API Java Bluetooth JSR-82
Floriano Scioscia - SisInfLab
implementa l'interfaccia javax.microedition.io.Connection. Essa possiede
metodi per aprire e chiudere la connessione. Quando viene aperta una connessione in
ingresso (applicazione server), il corrispondente record di servizio viene aggiunto
all'elenco dei servizi offerti dal server SDP. Quando la connessione viene chiusa, il
record di servizio viene cancellato dall'elenco. Dall'URL utilizzato per aprire la
connessione vengono automaticamente ricavati alcuni attributi di servizio che
riguardano le modalità di accesso (protocollo, autenticazione, etc.) consentite ai client.
○
La
classe
javax.bluetooth.LocalDevice
possiede
il
metodo
getRecord, che accetta come argomento un oggetto notifier e restituisce il
corrispondente record di servizio. Un'applicazione server userà questo metodo per
accedere al service record SDP e, dopo averne aggiornato gli attributi (con i metodi della
succitata classe ServiceRecord), li renderà visibili ai client SDP con il metodo
LocalDevice.updateRecord.
I diagrammi di sequenza in Figura 2 e Figura 3 illustrano e sintetizzano quanto spiegato,
mostrando gli scenari d'interazione più semplici con la libreria che implementa l'API Java
Bluetooth, rispettivamente per un client e un server di servizi SDP. Il client effettua device
discovery, service discovery e connessione al servizio remoto; il server si rende individuabile,
effettua la registrazione del servizio e accetta la connessione in ingresso.
4 - Service discovery nella API Java Bluetooth JSR-82
Floriano Scioscia - SisInfLab
Figura 2: Diagramma di sequenza dell'interazione tra un'applicazione client e l'API Java
Bluetooth
5 - Service discovery nella API Java Bluetooth JSR-82
Floriano Scioscia - SisInfLab
Figura 3: Diagramma di sequenza dell'interazione tra un'applicazione server e l'API Java
Bluetooth
6 - Service discovery nella API Java Bluetooth JSR-82
Floriano Scioscia - SisInfLab