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