Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione...

37
1 Bluetooth Development Bluetooth Development Ing. Alessandro Di Nepi ( Ing. Alessandro Di Nepi ([email protected] [email protected] ) COMLAB COMLAB – DEA DEA Universit Università “ROMA TRE ROMA TRE” Agenda Agenda Introduzione Introduzione Ciclo di sviluppo Ciclo di sviluppo Strumenti di supporto Strumenti di supporto Ambienti di sviluppo Ambienti di sviluppo Esempi: Esempi: RFCOMM sotto Linux. RFCOMM sotto Linux. L2CAP sotto Windows. L2CAP sotto Windows. OBEX in Java OBEX in Java

Transcript of Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione...

Page 1: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

1

Bluetooth DevelopmentBluetooth Development

Ing. Alessandro Di Nepi (Ing. Alessandro Di Nepi ([email protected]@uniroma3.it))

COMLAB COMLAB –– DEADEAUniversitUniversitàà ““ROMA TREROMA TRE””

AgendaAgenda

IntroduzioneIntroduzione

Ciclo di sviluppoCiclo di sviluppo

Strumenti di supportoStrumenti di supporto

Ambienti di sviluppoAmbienti di sviluppo

Esempi:Esempi:RFCOMM sotto Linux.RFCOMM sotto Linux.

L2CAP sotto Windows.L2CAP sotto Windows.

OBEX in JavaOBEX in Java

Page 2: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

2

RiferimentiRiferimenti

Standard Bluetooth (Standard Bluetooth (http://http://www.bluetooth.org/www.bluetooth.org/).).

Bluetooth Designer (Bluetooth Designer (http://http://www.btdesigner.comwww.btdesigner.com//))

Bluez (Bluez (http://www.bluez.org/http://www.bluez.org/).).

MSDN (MSDN (http://msdn.microsoft.comhttp://msdn.microsoft.com).).

Java:Java:SUN Developer Network (SUN Developer Network (http://developers.sun.com/http://developers.sun.com/).).

JavaBluetooth (JavaBluetooth (http://http://www.javabluetooth.orgwww.javabluetooth.org))

IntroduzioneIntroduzione

Bluetooth nasce nel Bluetooth nasce nel 1998 1998 dada un un consorzioconsorzio tratraEricsson, IBM, Intel, Nokia and Toshiba.Ericsson, IBM, Intel, Nokia and Toshiba.

Standard aperto per trasmissioni via radio a corto Standard aperto per trasmissioni via radio a corto raggio di voce o dati sia per applicazioni puntoraggio di voce o dati sia per applicazioni punto--punto che multipunto.punto che multipunto.

Ad oggi ci sono piAd oggi ci sono piùù di 1100 compagnie che lo di 1100 compagnie che lo adottanoadottano

Il Il nomenome eded ilil logo logo sonosono ispiratiispirati ad ad HaraldHarald BlBlååtandtand((tradottotradotto Blue Tooth), re Blue Tooth), re didi DanimarcaDanimarca tratra 940 940 ededilil 985, 985, cheche ha ha unitounito la la DanimarcaDanimarca e la e la NorvegiaNorvegia ededha ha portatoportato ilil CristianesimoCristianesimo in Scandinavia.in Scandinavia.

Page 3: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

3

CaratteristicheCaratteristiche

Tecnologia radio a bassa potenza e portata limitata Tecnologia radio a bassa potenza e portata limitata nella banda 2.4GHz (ISM)nella banda 2.4GHz (ISM)

Banda ISM regolata ma non soggetta a licensa.Banda ISM regolata ma non soggetta a licensa.

Supporto per voce e dati: velocitSupporto per voce e dati: velocitàà fino a 723.1 fino a 723.1 kbit/s (1.2) e 2.1Mbit/s (2.0).kbit/s (1.2) e 2.1Mbit/s (2.0).

Non cNon c’è’è bisogno che i dispositivi siano in bisogno che i dispositivi siano in ““vistavista””..

Supporto alla sicurezzaSupporto alla sicurezza

EconomicitEconomicitàà dei dispositivi.dei dispositivi.

Grandissima penetrazione nel mercato.Grandissima penetrazione nel mercato.

ApplicazioniApplicazioni

Sistema Sistema ““cable replacementcable replacement””::Scambio dati via seriale (vcard, file, messaggi).Scambio dati via seriale (vcard, file, messaggi).

Collegamento di modem cellulari (internet, LAN).Collegamento di modem cellulari (internet, LAN).

Collegamento di tastiere, mouse, stampanti.Collegamento di tastiere, mouse, stampanti.

Applicazioni Audio:Applicazioni Audio:Sistemi handsfree (auricolari, autoradio, etc.).Sistemi handsfree (auricolari, autoradio, etc.).

Medicali:Medicali:Cartella medica wireless, consultazione remota, Cartella medica wireless, consultazione remota, defibrillatori ZOLL, data collecting, etc.).defibrillatori ZOLL, data collecting, etc.).

Limitate dalla fantasia del progettista e Limitate dalla fantasia del progettista e dalldall’’interpretazione non corretta delle specifiche.interpretazione non corretta delle specifiche.

Page 4: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

4

Tecnologie RadioTecnologie Radio

Ciclo di sviluppoCiclo di sviluppo

Specifiche

BluetoothOK?

Progettazione

CambioSPECS?

NO

SI

NO Differente Tecnologia

SI

Realizzazione Prototipo

Produzione

Page 5: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

5

Ciclo di sviluppo: SpecificheCiclo di sviluppo: Specifiche

Fase fondamentale molte volte sottovalutata.Fase fondamentale molte volte sottovalutata.

Alla fine di questa fase deve essere chiaro Alla fine di questa fase deve essere chiaro perchperchèè

Bluetooth Bluetooth èè la tecnologia giusta per lla tecnologia giusta per l’’applicazione applicazione

in esame.in esame.

Fattori che influenzano:Fattori che influenzano:

Portata;Portata;

Potenza irradiata;Potenza irradiata;

Energia (batterie);Energia (batterie);

Numero di dispositivi;Numero di dispositivi;

Tipo di dati e relativo timing (latenza, data rate, etc.)Tipo di dati e relativo timing (latenza, data rate, etc.)

Ciclo di sviluppo: ProgettazioneCiclo di sviluppo: Progettazione

Si passa dallSi passa dall’’idea ad una sua realizzazione idea ad una sua realizzazione ““su su cartacarta””: : comecome realizziamo le specifiche con la realizziamo le specifiche con la tecnologia scelta.tecnologia scelta.

Fattori chiave:Fattori chiave:Scelta dellScelta dell’’hardwarehardware

Scelta della classe del dispositivoScelta della classe del dispositivo

Scelta del profilo da implementareScelta del profilo da implementare

Scelta dellScelta dell’’alimentazione (se necessario)alimentazione (se necessario)

Sicurezza del sistemaSicurezza del sistema

Page 6: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

6

Scelta dellScelta dell’’HWHW

Dispositivi HW:Dispositivi HW:PCPC

LaptopLaptop

TabletTablet

PalmariPalmari

CellulariCellulari

EmbeddedEmbedded

Classe dei dispositivi BluetoothClasse dei dispositivi Bluetooth

~10~10442.52.5Class Class 22

~0.1~0.1--110011Class Class 33

~100~1002020100100Class Class 11

Range Range (m)(m)

Power Power ((dBmdBm))

Power Power ((mWmW))

ClassClass

• Condiziona sia la portata che il consumo

Page 7: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

7

Bluetoot ProfilesBluetoot Profiles

Per favorire la Per favorire la comunicazione fra comunicazione fra dispositivi eterogenei lo dispositivi eterogenei lo standard prevede la standard prevede la definizione dei definizione dei profilesprofiles::

Specificano come utilizzare Specificano come utilizzare la tecnologia Bluetooth nella la tecnologia Bluetooth nella specifica classe di dispositivi specifica classe di dispositivi per realizzare per realizzare unun’’applicazione.applicazione.

Per comunicare i diversi Per comunicare i diversi dispositivi devono dispositivi devono supportare lo stesso profilo.supportare lo stesso profilo.

ProfiliP

roto

colli

Applicazioni

Scelta del profiloScelta del profilo

Generic Access Profile (GAP)– Service Discovery Application

Profile (SDAP)– Serial Port Profile (SPP)– Dial-up Networking Profile

(DUNP)• Fax Profile• Headset Profile• LAN Access Profile (using

PPP) (LAP)• Generic Object Exchange

Profile (GOEP)– File Transfer Profile– Object Push Profile– Synchronization Profile

Page 8: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

8

RFCOMM

ACL SCOBluetooth Baseband

LMP

L2CAPAudio

Stream

AT Commands

Headset profileHeadset profile

RFCOMM

ACL SCOBluetooth Baseband

LMP

L2CAP

PPP

LAN access point profileLAN access point profile

Page 9: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

9

Strumenti di supportoStrumenti di supporto

Non sono funzionali alla progettazione ma sono Non sono funzionali alla progettazione ma sono utili in fase di sviluppo.utili in fase di sviluppo.

Mettono a disposizione delle primitive base per:Mettono a disposizione delle primitive base per:Individuare dispositivi bluetooth (inquire)Individuare dispositivi bluetooth (inquire)

Pairing dei dispositiviPairing dei dispositivi

ConnessioneConnessione

AutenticazioneAutenticazione

Lista dei serviziLista dei servizi

Scambio DatiScambio Dati

Disponibile da shell dei comandi ed interfaccia Disponibile da shell dei comandi ed interfaccia grafica.grafica.

Strumenti di supporto in BlueZ (1)Strumenti di supporto in BlueZ (1)

BlueZ implementa lo standard Bluetooth in Linux.BlueZ implementa lo standard Bluetooth in Linux.

hcitoolhcitool fornisce una serie di strumenti:fornisce una serie di strumenti:Controllo dei dispositivi locali:Controllo dei dispositivi locali:# hcitool dev# hcitool dev

Devices:Devices:

hci0 00:01:02:03:04:05hci0 00:01:02:03:04:05

Scansione dei dispositivi remoti:Scansione dei dispositivi remoti:# # hcitoolhcitool scanscan

Scanning ...Scanning ...

00:0A:0B:0C:0D:0E 00:0A:0B:0C:0D:0E BT_deviceBT_device

Page 10: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

10

Strumenti di supporto in BlueZ (2)Strumenti di supporto in BlueZ (2)

InterrogazioneInterrogazione deidei dispositividispositivi remotiremoti::# # hcitoolhcitool inqinqInquiring ...Inquiring ...00:0A:0B:0C:0D:0E clock offset: 0x5579 class: 00:0A:0B:0C:0D:0E clock offset: 0x5579 class: 0x72010c0x72010c

EseguireEseguire l2ping:l2ping:# l2ping 00:0A:0B:0C:0D:0E# l2ping 00:0A:0B:0C:0D:0EPing: 00:0A:0B:0C:0D:0E from 00:01:02:03:04:05 (data Ping: 00:0A:0B:0C:0D:0E from 00:01:02:03:04:05 (data size 20) ...size 20) ...

20 bytes from 00:0A:0B:0C:0D:0E id 200 time 69.85ms20 bytes from 00:0A:0B:0C:0D:0E id 200 time 69.85ms20 bytes from 00:0A:0B:0C:0D:0E id 201 time 9.97ms20 bytes from 00:0A:0B:0C:0D:0E id 201 time 9.97ms20 bytes from 00:0A:0B:0C:0D:0E id 202 time 56.86ms20 bytes from 00:0A:0B:0C:0D:0E id 202 time 56.86ms20 bytes from 00:0A:0B:0C:0D:0E id 203 time 39.92ms20 bytes from 00:0A:0B:0C:0D:0E id 203 time 39.92ms4 sent, 4 received, 0% loss4 sent, 4 received, 0% loss

Radio Frequency Communication (RFCOMM) Radio Frequency Communication (RFCOMM)

Si può stabilire una radio frequency connection con un altro Si può stabilire una radio frequency connection con un altro dispositivo Bluetooth usando il comando dispositivo Bluetooth usando il comando rfcommrfcomm..

ÈÈ possibile configurare il comportamento di rfcomm possibile configurare il comportamento di rfcomm attraverso il file attraverso il file /etc/bluetooth/rfcomm.conf/etc/bluetooth/rfcomm.conf..

StabilireStabilire unauna connessioneconnessione RFCOMM (active):RFCOMM (active):# # rfcommrfcomm connect 0 00:0A:0B:0C:0D:0E 1connect 0 00:0A:0B:0C:0D:0E 1

Connected /dev/rfcomm0 to 00:0F:DE:69:50:24 on channel 1Connected /dev/rfcomm0 to 00:0F:DE:69:50:24 on channel 1

Press CTRLPress CTRL--C for C for hanguphangup

StabilireStabilire unauna connessioneconnessione RFCOMM (passive):RFCOMM (passive):# # rfcommrfcomm listen 0 1listen 0 1

Waiting for connection on channel 1Waiting for connection on channel 1

Una volta stabilita la connessione la comunicazione seriale Una volta stabilita la connessione la comunicazione seriale avviene attraverso la porta avviene attraverso la porta /dev/rfcommx/dev/rfcommx..

Page 11: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

11

Personal Area Network Personal Area Network

Viene creata una rete tra dispositivi Bluetooth che Viene creata una rete tra dispositivi Bluetooth che supportano il profilosupportano il profilo

Per prima cosa bisogna caricare il modulo per la gestione del Per prima cosa bisogna caricare il modulo per la gestione del protocollo di emulazione di rete (Bluetooth Network protocollo di emulazione di rete (Bluetooth Network Emulation Protocol):Emulation Protocol):# # modprobemodprobe bnepbnep

Sul dispositivo server avviare il daemon pand in ascolto:Sul dispositivo server avviare il daemon pand in ascolto:# pand # pand ----listen listen ----role NAP role NAP ----master master ––autozapautozap

Sui client avviare il daemon pand in ascolto:Sui client avviare il daemon pand in ascolto:# # pandpand ----connect 00:0A:0B:0C:0D:0E connect 00:0A:0B:0C:0D:0E ----service NAP service NAP ––

autozapautozap

A questo punto si possono configurare gli indirizzi di rete sui A questo punto si possono configurare gli indirizzi di rete sui due host:due host:host0 # ifconfig bnep0 192.168.2.1host0 # ifconfig bnep0 192.168.2.1

host1 # ifconfig bnep0 192.168.2.2host1 # ifconfig bnep0 192.168.2.2

StrumentiStrumenti didi svilupposviluppo desktop desktop

Le stesse funzionalitLe stesse funzionalitàà viste sono disponibili viste sono disponibili sui diversi ambienti desktop.sui diversi ambienti desktop.

LINUX:LINUX:KDEKDE: kdebluetooth (: kdebluetooth (http://kdehttp://kde--bluetooth.sourceforge.net/bluetooth.sourceforge.net/))

GnomeGnome: gnome: gnome--bluetooth bluetooth ((http://usefulinc.com/software/gnomehttp://usefulinc.com/software/gnome--bluetoothbluetooth))

Windows XP: gestiti dai driver di sistemaWindows XP: gestiti dai driver di sistema

JavaJava

Page 12: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

12

KDE Bluetooth: Discover KDE Bluetooth: Discover

GnomeGnome--Bluetooth: OBEX send fileBluetooth: OBEX send file

Page 13: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

13

Windows: services inquiryWindows: services inquiry

AmbientiAmbienti didi svilupposviluppo

Vengono forniti per i diversi sistemi Vengono forniti per i diversi sistemi operativi e piattaforme di sviluppo:operativi e piattaforme di sviluppo:

Proprietari: a seconda dellProprietari: a seconda dell’’HW.HW.

Linux: Bluez.Linux: Bluez.

Windows: Bluetooth API.Windows: Bluetooth API.

Java: Java: JSRJSR--82, Java APIs for Bluetooth Wireless 82, Java APIs for Bluetooth Wireless Technology.Technology.

Page 14: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

14

Cambridge Silicon Radio Cambridge Silicon Radio BlueCoreBlueCore

Cambridge Silicon Radio (CSR, Cambridge Silicon Radio (CSR, www.csr.comwww.csr.com) ) produce chipset bluetooth (BCproduce chipset bluetooth (BC--0x) totalmente 0x) totalmente integrati che vengono programmabili integrati che vengono programmabili ““ad alto ad alto livellolivello””..

Una volta sviluppato il firmware proprietario, Una volta sviluppato il firmware proprietario, questo viene caricato sui moduli e consegnato al questo viene caricato sui moduli e consegnato al produttore.produttore.

La maggior parte dei dispositivi integrati La maggior parte dei dispositivi integrati (auricolare, dongle USB) integra questo chipset.(auricolare, dongle USB) integra questo chipset.

CSR: BCCSR: BC--0202

Page 15: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

15

CSR CSR CasiraCasira Development KitDevelopment Kit

• Ciclo di sviluppo:– Sviluppo dell’applicativo.– Integrazione del chipset

nel sistema reale.– CSR produce un

firmware da caricare sul chipset.

• Costo sistema (HW+SW): €3000.

• Costo del modulo: €10.

CSR: Stack Virtual MachineCSR: Stack Virtual Machine

Page 16: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

16

CSR: CSR: BluelabBluelab ProfessionalProfessional

SviluppoSviluppo BluetoothBluetooth

La programmazione Bluetooth La programmazione Bluetooth èè molto molto simile a quella Internet, con cui condivide i simile a quella Internet, con cui condivide i principi di comunicazione e scambio dati fra principi di comunicazione e scambio dati fra dispositivi.dispositivi.Tipicamente la comunicazione viene divisa Tipicamente la comunicazione viene divisa in diverse parti:in diverse parti:

SceltaScelta del del dispositivodispositivo con cui con cui comunicarecomunicareSceltaScelta delladella modalitmodalitàà didi comunicazionecomunicazioneAttivazioneAttivazione delladella connessioneconnessione uscenteuscente (initiator)(initiator)AccettazioneAccettazione delladella connessioneconnessione entranteentrante((listnerlistner))InvioInvio datidatiRicezioneRicezione datidati

Page 17: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

17

Windows: Bluetooth APIWindows: Bluetooth API

Microsoft ha integrato nativamente il Microsoft ha integrato nativamente il supporto a Bluetooth nella versione XP SP1.supporto a Bluetooth nella versione XP SP1.

Meccanismi molto simili sono condivisi Meccanismi molto simili sono condivisi anche per i sistemi Embedded (Windows anche per i sistemi Embedded (Windows Mobile5).Mobile5).

Microsoft fornisce due diverse modalitMicrosoft fornisce due diverse modalitàà di di programmazione Bluetooth:programmazione Bluetooth:

Utilizzando le interfaccie socket;Utilizzando le interfaccie socket;

Utilizzando il dispositivo direttamente.Utilizzando il dispositivo direttamente.

Linux: Linux: BlueZBlueZ

BlueZ implementa le API per le BlueZ implementa le API per le comunicazioni Bluetooth sotto Linux.comunicazioni Bluetooth sotto Linux.

Architettura flessibile, efficente e modulare.Architettura flessibile, efficente e modulare.

Viene utilizzato in C/C++.Viene utilizzato in C/C++.

Fornisce il controllo di tutte le parti del Fornisce il controllo di tutte le parti del sistema, anche quelle avanzate (RSSI)sistema, anche quelle avanzate (RSSI)

Carenza di documentazione.Carenza di documentazione.

Page 18: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

18

JAVA: JSRJAVA: JSR--8282

In ambiente JAVA le API JSRIn ambiente JAVA le API JSR--82 82 rappresentano lrappresentano l’’ambiente di sviluppo ambiente di sviluppo ufficiale per la tecnologia Bluetooth.ufficiale per la tecnologia Bluetooth.JSRJSR--82 consiste di due librerie:82 consiste di due librerie:

javax.bluetoothjavax.bluetooth: : contienecontiene primitive per le primitive per le funzionifunzioni bluetoothbluetooth ((incluseincluse RFCOMM);RFCOMM);javax.obexjavax.obex: : implementaimplementa le le funzionifunzioni OBEX.OBEX.

Disponibile su tutte le piattaforme.Disponibile su tutte le piattaforme.Fornisce un controllo limitato sullFornisce un controllo limitato sull’’HW (no HW (no RSSI), va bene per semplici applicazioni.RSSI), va bene per semplici applicazioni.

BlueZBlueZ: : architetturaarchitettura

Page 19: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

19

BlueZBlueZ: : installazioneinstallazione

LL’’installazione di Bluez consiste nel installazione di Bluez consiste nel caricamento di alcuni moduli nel kernel e caricamento di alcuni moduli nel kernel e nellnell’’installazione delle librerie userinstallazione delle librerie user--space.space.Caricamento dei moduli nel kernel Caricamento dei moduli nel kernel (automatico):(automatico):

modprobe bluezmodprobe bluezmodprobe l2capmodprobe l2capmodprobe hci_uart (UART support. Optional)modprobe hci_uart (UART support. Optional)modprobe hci_usb (USB support. Optional)modprobe hci_usb (USB support. Optional)

Installazione delle librerie:Installazione delle librerie:aptapt--get install bluezget install bluez--* libbluetooth1* libbluetooth1--devdev

BlueZBlueZ: : compilazionecompilazione

La compilazione dei programmi a linea di La compilazione dei programmi a linea di comando viene fatta con GCC attraverso comando viene fatta con GCC attraverso ll’’istruzione:istruzione:

# # gccgcc simplescan.csimplescan.c --o o simplescansimplescan ––lbluetoothlbluetooth

Utilizzando invece cc come preprocessoreUtilizzando invece cc come preprocessore

# cc `# cc `pkgpkg--configconfig ----cflagscflags ----libslibs gtk+gtk+--2.0` 2.0` --l l bluetoothbluetoothBlueBoxRemote.cBlueBoxRemote.c --o o BlueBoxRemoteBlueBoxRemote

Page 20: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

20

SceltaScelta del del dispositivodispositivo con cui con cui comunicarecomunicare

Ogni dispositivo Bluetooth viene fornito di Ogni dispositivo Bluetooth viene fornito di un indirizzo unico di 48bit (Bluetooth un indirizzo unico di 48bit (Bluetooth Address, BDADDR).Address, BDADDR).

Il dispositivo con cui comunicare viene Il dispositivo con cui comunicare viene identificato da tutti i layer col BDADDR.identificato da tutti i layer col BDADDR.

Viene fatta una scansione dello spazio Viene fatta una scansione dello spazio circostante per vedere i device in circostante per vedere i device in prossimitprossimitàà..

Il risultato Il risultato èè una lista di device Bluetooth una lista di device Bluetooth da cui selezionare il destinatario.da cui selezionare il destinatario.

BluezBluez: : simplescan.csimplescan.c (1)(1)

include <sys/include <sys/socket.hsocket.h>>

#include <#include <bluetooth/bluetooth.hbluetooth/bluetooth.h>>

#include <#include <bluetooth/hci.hbluetooth/hci.h>>

#include <#include <bluetooth/hci_lib.hbluetooth/hci_lib.h>>

intint main(intmain(int argcargc, char **, char **argvargv))

{{

inquiry_infoinquiry_info *ii = NULL;*ii = NULL;

intint max_rspmax_rsp, , num_rspnum_rsp;;

intint dev_iddev_id, sock, , sock, lenlen, flags;, flags;

intint i;i;

char addr[19] = { 0 };char addr[19] = { 0 };

char name[248] = { 0 };char name[248] = { 0 };

dev_iddev_id = = hci_get_route(NULLhci_get_route(NULL););

sock = sock = hci_open_devhci_open_dev( ( dev_iddev_id ););

if (if (dev_iddev_id < 0 || sock < 0) {< 0 || sock < 0) {

perror("openingperror("opening socket");socket");

exit(1);exit(1);

}}

Page 21: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

21

BluezBluez: : simplescan.csimplescan.c (2)(2)

lenlen = 8;= 8;

max_rspmax_rsp = 255;= 255;

flags = IREQ_CACHE_FLUSH;flags = IREQ_CACHE_FLUSH;

ii = (ii = (inquiry_infoinquiry_info*)*)malloc(max_rspmalloc(max_rsp * * sizeof(inquiry_infosizeof(inquiry_info));));

num_rspnum_rsp = = hci_inquiry(dev_idhci_inquiry(dev_id, , lenlen, , max_rspmax_rsp, NULL, &ii, flags);, NULL, &ii, flags);

if( if( num_rspnum_rsp < 0 ) < 0 ) perror("hci_inquiryperror("hci_inquiry");");

for (i = 0; i < for (i = 0; i < num_rspnum_rsp; i++) {; i++) {

ba2str(&(ii+i)ba2str(&(ii+i)-->>bdaddrbdaddr, , addraddr););

memset(namememset(name, 0, , 0, sizeof(namesizeof(name));));

if (if (hci_read_remote_name(sockhci_read_remote_name(sock, &(, &(ii+iii+i))-->>bdaddrbdaddr, , sizeof(namesizeof(name), ),

name, 0) < 0)name, 0) < 0)

strcpy(namestrcpy(name, "[unknown]");, "[unknown]");

printf("%sprintf("%s %%ss\\nn", ", addraddr, name);, name);

}}

free( ii );free( ii );

close( sock );close( sock );

return 0;return 0;

}}

BluezBluez: : simplescan.csimplescan.c (note)(note)

Le funzioni che convertono gli indirizzi Le funzioni che convertono gli indirizzi Bluetooth in stringa sono:Bluetooth in stringa sono:intint str2ba( const char *str2ba( const char *strstr, , bdaddr_tbdaddr_t **baba ););

intint ba2str( const ba2str( const bdaddr_tbdaddr_t **baba, char *, char *strstr ););

LL’’inizializzazione del device Bluetooth locale inizializzazione del device Bluetooth locale viene fatta con:viene fatta con:intint hci_get_routehci_get_route( ( bdaddr_tbdaddr_t **bdaddrbdaddr ); /*NULL = default*/); /*NULL = default*/

intint hci_open_devhci_open_dev( ( intint dev_iddev_id ););

Se sono presenti piSe sono presenti piùù schede Bluetooth nel schede Bluetooth nel sistema e vogliamo aprire una specifica si sistema e vogliamo aprire una specifica si utilizzautilizzaintint dev_iddev_id = = hci_devidhci_devid( "01:23:45:67:89:AB" );( "01:23:45:67:89:AB" );

Page 22: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

22

BluezBluez: : simplescan.csimplescan.c (note)(note)

La funzione che esegue lLa funzione che esegue l’’inquiry inquiry èè::intint hci_inquiry(inthci_inquiry(int dev_iddev_id, , intint lenlen, , intint max_rspmax_rsp, const uint8_t , const uint8_t

*lap, *lap, inquiry_infoinquiry_info **ii, long flags);**ii, long flags);

hci_inquiry ritorna la lista di device scoperti ed alcune hci_inquiry ritorna la lista di device scoperti ed alcune informazioni su di essi nella variable ii. In caso di errori informazioni su di essi nella variable ii. In caso di errori ritorna ritorna --1.1.

Da notare che hci_inquiry vuole un intero per identificare la Da notare che hci_inquiry vuole un intero per identificare la scheda Bluetooth (dev_id) invece che lscheda Bluetooth (dev_id) invece che l’’identificativo di un identificativo di un socket come avviene per le altre funzioni.socket come avviene per le altre funzioni.

La funzione hci_read_remote_name legge il nome dal La funzione hci_read_remote_name legge il nome dal dispositivo remoto di cui si specifica il BDADDR:dispositivo remoto di cui si specifica il BDADDR:

intint hci_read_remote_name(inthci_read_remote_name(int sock, const sock, const bdaddr_tbdaddr_t **baba, ,

intint lenlen, char *name, , char *name, intint timeout) timeout)

BluezBluez: socket RFCOMM: socket RFCOMM

La comunicazione attraverso SOCKET Bluetooth La comunicazione attraverso SOCKET Bluetooth èèuguale a quella TCP/IP.uguale a quella TCP/IP.LL’’unica differenza sta nelle funzioni di apertura ed unica differenza sta nelle funzioni di apertura ed indirizzamento dei socket.indirizzamento dei socket.I passi da fare sono:I passi da fare sono:

Apertura del socketApertura del socketConnessione (master) o listening (slave)Connessione (master) o listening (slave)Invio (write sul socket) o ricezione di caratteri (read dal Invio (write sul socket) o ricezione di caratteri (read dal socket)socket)Chiusura del socket.Chiusura del socket.

Page 23: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

23

BluezBluez: RFCOMM server: RFCOMM server

intint main(intmain(int argcargc, char **, char **argvargv))

{{

structstruct sockaddr_rcsockaddr_rc loc_addrloc_addr = { 0 }, = { 0 }, rem_addrrem_addr = { 0 };= { 0 };

char buf[1024] = { 0 };char buf[1024] = { 0 };

intint s, client, s, client, bytes_readbytes_read;;

intint opt = opt = sizeof(rem_addrsizeof(rem_addr););

// allocate socket// allocate socket

s = s = socket(AF_BLUETOOTHsocket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);, SOCK_STREAM, BTPROTO_RFCOMM);

// bind socket to port 1 of the first available // bind socket to port 1 of the first available

// local // local bluetoothbluetooth adapteradapter

loc_addr.rc_familyloc_addr.rc_family = AF_BLUETOOTH;= AF_BLUETOOTH;

loc_addr.rc_bdaddrloc_addr.rc_bdaddr = *BDADDR_ANY;= *BDADDR_ANY;

loc_addr.rc_channelloc_addr.rc_channel = (uint8_t) 1;= (uint8_t) 1;

bind(sbind(s, (, (structstruct sockaddrsockaddr *)&*)&loc_addrloc_addr, , sizeof(loc_addrsizeof(loc_addr));));

BluezBluez: RFCOMM server: RFCOMM server

// put socket into listening mode// put socket into listening mode

listen(slisten(s, 1);, 1);

// accept one connection// accept one connection

client = client = accept(saccept(s, (, (structstruct sockaddrsockaddr *)&*)&rem_addrrem_addr, &opt);, &opt);

ba2str( &ba2str( &rem_addr.rc_bdaddrrem_addr.rc_bdaddr, , bufbuf ););

fprintf(stderrfprintf(stderr, "accepted connection from %, "accepted connection from %ss\\nn", ", bufbuf););

memset(bufmemset(buf, 0, , 0, sizeof(bufsizeof(buf));));

// read data from the client// read data from the client

bytes_readbytes_read = = read(clientread(client, , bufbuf, , sizeof(bufsizeof(buf));));

if( if( bytes_readbytes_read > 0 ) {> 0 ) {

printf("receivedprintf("received [%[%s]s]\\nn", ", bufbuf););

}}

// close connection// close connection

close(clientclose(client););

close(sclose(s););

return 0;return 0;

}}

Page 24: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

24

BluezBluez: RFCOMM client: RFCOMM client

intint main(intmain(int argcargc, char **, char **argvargv))

{{

structstruct sockaddr_rcsockaddr_rc addraddr = { 0 };= { 0 };

intint s, status;s, status;

char dest[18] = "01:23:45:67:89:AB";char dest[18] = "01:23:45:67:89:AB";

// allocate a socket// allocate a socket

s = s = socket(AF_BLUETOOTHsocket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);, SOCK_STREAM, BTPROTO_RFCOMM);

// set the connection parameters (who to connect to)// set the connection parameters (who to connect to)

addr.rc_familyaddr.rc_family = AF_BLUETOOTH;= AF_BLUETOOTH;

addr.rc_channeladdr.rc_channel = (uint8_t) 1;= (uint8_t) 1;

str2ba( str2ba( destdest, &, &addr.rc_bdaddraddr.rc_bdaddr ););

// connect to server// connect to server

status = status = connect(sconnect(s, (, (structstruct sockaddrsockaddr *)&*)&addraddr, , sizeof(addrsizeof(addr));));

// send a message// send a message

if( status == 0 ) {if( status == 0 ) {

status = status = write(swrite(s, "hello!", 6);, "hello!", 6);

}}

close(sclose(s););

return 0;return 0;

}}

BluezBluez: RFCOMM (note): RFCOMM (note)

In alcuni casi si verificano fenomeni di corsa In alcuni casi si verificano fenomeni di corsa sullsull’’apertura delle porte causando lo stallo del apertura delle porte causando lo stallo del programma.programma.Si consideri ad esempio la situazione che segue:Si consideri ad esempio la situazione che segue:

A (master) apre il socket;A (master) apre il socket;

A invia a B (slave) una prima stringa di bit ed aspetta la rispoA invia a B (slave) una prima stringa di bit ed aspetta la risposta.sta.

B ha unB ha un’’alta latenza nellalta latenza nell’’aprire la porta Bluetooth quindi non riceve aprire la porta Bluetooth quindi non riceve i bit di A.i bit di A.

B B èè in attesa dei bit di A.in attesa dei bit di A.

Risultato: entrambi i programmi sono in attesa e Risultato: entrambi i programmi sono in attesa e la comunicazione va in stallo.la comunicazione va in stallo.La detezione di situazioni di questo tipo può essere La detezione di situazioni di questo tipo può essere fatta inserendo breakpoint in posizione opportuna.fatta inserendo breakpoint in posizione opportuna.La soluzione consiste nellLa soluzione consiste nell’’inserire istruzioni di inserire istruzioni di sleep tra lsleep tra l’’apertura della porta A e lapertura della porta A e l’’invio dei dati.invio dei dati.

Page 25: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

25

BluezBluez: RFCOMM (note): RFCOMM (note)

Un altro problema che si riscontra facilmente nelle Un altro problema che si riscontra facilmente nelle comunicazioni RFCOMM riguarda lcomunicazioni RFCOMM riguarda l’’ordinamento dei ordinamento dei byte, soprattutto interfacciando sistemi diversi.byte, soprattutto interfacciando sistemi diversi.Al contrario di quanto avviene per le reti, Al contrario di quanto avviene per le reti, Bluetooth usa un ordinamento littleBluetooth usa un ordinamento little--endian in cui i endian in cui i byte meno significativi vengono inviati prima.byte meno significativi vengono inviati prima.Bluez fornisce delle funzioni di conversione:Bluez fornisce delle funzioni di conversione:

unsigned short unsigned short intint htobshtobs( unsigned short ( unsigned short intint num );num );

unsigned short unsigned short intint btohsbtohs( unsigned short ( unsigned short intint num );num );

unsigned unsigned intint htoblhtobl( unsigned ( unsigned intint num );num );

unsigned unsigned intint btohlbtohl( unsigned ( unsigned intint num );num );

Windows: socket L2CAPWindows: socket L2CAP

Esattamente come avviene per RFCOMM, la Esattamente come avviene per RFCOMM, la comunicazione L2CAP avviene attraverso il comunicazione L2CAP avviene attraverso il paradigma SOCKET TCP/IP.paradigma SOCKET TCP/IP.

La differenza consiste nelle funzioni di include e La differenza consiste nelle funzioni di include e nel meccanismo di apertura ed indirizzamento dei nel meccanismo di apertura ed indirizzamento dei socket.socket.

Le funzioni da includere in questo caso sono:Le funzioni da includere in questo caso sono:#include <winsock2.h>#include <winsock2.h>

#include <Ws2bth.h>#include <Ws2bth.h>

#include <#include <BluetoothAPIs.hBluetoothAPIs.h>>

Page 26: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

26

JAVA, JSRJAVA, JSR--8282

I dispositivi vengono rappresentati dalle classi:I dispositivi vengono rappresentati dalle classi:javax.bluetooth.LocalDevicejavax.bluetooth.LocalDevice per per ilil dispositivodispositivo locale;locale;

javax.bluetooth.RemoteDevicejavax.bluetooth.RemoteDevice per per tuttitutti i i dispositividispositiviremotiremoti..

Come giCome giàà visto anche negli altri ambienti la visto anche negli altri ambienti la comunicazione avviene attraverso i seguenti passi:comunicazione avviene attraverso i seguenti passi:

Inizializzazione dello stack.Inizializzazione dello stack.

Discovery del dispositivo con cui comunicareDiscovery del dispositivo con cui comunicare

Gestione del dispositivoGestione del dispositivo

Discovery dei serviziDiscovery dei servizi

ComunicazioneComunicazione

JSRJSR--82, Device Discovery82, Device Discovery

La classe javax.bluetooth.DiscoveryAgent viene La classe javax.bluetooth.DiscoveryAgent viene utilizzata per scoprire dispositivi Bluetooth in utilizzata per scoprire dispositivi Bluetooth in prossimitprossimitàà..Quando chiamata ritorna un oggetto Quando chiamata ritorna un oggetto javax.bluetooth.RemoteDevice per ogni dispositivo javax.bluetooth.RemoteDevice per ogni dispositivo individuato.individuato.

Se invece vogliamo essere notificati da un evento Se invece vogliamo essere notificati da un evento quando siamo quando siamo ““scopertiscoperti”” dobbiamo implementare il dobbiamo implementare il metodo dellmetodo dell’’interfaccia interfaccia javax.bluetooth.DiscoveryListener.javax.bluetooth.DiscoveryListener.

Page 27: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

27

Data Transfer: RFCOMM Data Transfer: RFCOMM vsvs OBEXOBEX

Per scambiare dati possiamo usare sia RFCOMM Per scambiare dati possiamo usare sia RFCOMM che OBEX: quando che OBEX: quando èè opportuno usare uno o opportuno usare uno o ll’’altro?altro?

RFCOMM RFCOMM èè pipiùù indicato per trasferire stream di indicato per trasferire stream di datidati, esattamente come si farebbe con una porta , esattamente come si farebbe con una porta seriale.seriale.

OBEX OBEX èè invece indicato quando i dati da scambiare invece indicato quando i dati da scambiare sono filesono file, insieme alle informazioni associate (tipo , insieme alle informazioni associate (tipo di file, data, dimensione).di file, data, dimensione).

Se bisogna scambiare dati non assemblati in file Se bisogna scambiare dati non assemblati in file RFCOMM, altrimenti OBEX.RFCOMM, altrimenti OBEX.

OperazioniOperazioni OBEXOBEX

OBEX OBEX èè ll’’acronimo di OBject EXchange: acronimo di OBject EXchange: èè un un protocollo nativo IRDA adottato da Bluetooth.protocollo nativo IRDA adottato da Bluetooth.

ÉÉ un protocollo per lo scambio dati: vengono un protocollo per lo scambio dati: vengono definiti:definiti:

Un Un serverserver, l, l’’entitentitàà che accetta o mette a disposizione fileche accetta o mette a disposizione file

Un Un clientclient, l, l’’entitentitàà che chiede o invia fileche chiede o invia file

Le Le operazionioperazioni, ovvero le interazioni tra client e server., ovvero le interazioni tra client e server.

Per ogni operazione iniziata dal client il server Per ogni operazione iniziata dal client il server invia una risposta che indica lo stato invia una risposta che indica lo stato delldell’’operazione. operazione.

Page 28: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

28

OperazioniOperazioni OBEXOBEX

OBEX Server: inizializzazioneOBEX Server: inizializzazione

Per creare un server OBEX dobbiamo estendere la Per creare un server OBEX dobbiamo estendere la classe javax.obex.ServerRequestHandler.classe javax.obex.ServerRequestHandler.Visto poi che dobbiamo rispondere ad eventi Visto poi che dobbiamo rispondere ad eventi scatenati da buttons dobbiamo anche scatenati da buttons dobbiamo anche implementare limplementare l’’interfaccia ActionListener.interfaccia ActionListener.

import javax.swing.*; import javax.swing.*;

import java.awt.*;import java.awt.*;

import java.awt.event.*;import java.awt.event.*;

import javax.microedition.io.*;import javax.microedition.io.*;

import java.io.*;import java.io.*;

import javax.bluetooth.*;import javax.bluetooth.*;

import javax.obex.*;import javax.obex.*;

public class FileServer extends ServerRequestHandler public class FileServer extends ServerRequestHandler

implements ActionListener{implements ActionListener{

Page 29: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

29

OBEX Server: action_performedOBEX Server: action_performed

public void actionPerformed(ActionEvent e) {public void actionPerformed(ActionEvent e) {

startButton.setEnabled(false);startButton.setEnabled(false);

try {try {

UUID uuid = new UUID("8841", true);UUID uuid = new UUID("8841", true);

String url = "btgoep://localhost:" + uuid String url = "btgoep://localhost:" + uuid

+ ";name=FTP;authenticate=false;master=false;encrypt=false";+ ";name=FTP;authenticate=false;master=false;encrypt=false";

SessionNotifier sn = (SessionNotifier)Connector.open(url);SessionNotifier sn = (SessionNotifier)Connector.open(url);

updateStatus("[server:] Now waiting for a client to connect");updateStatus("[server:] Now waiting for a client to connect");

sn.acceptAndOpen(this);sn.acceptAndOpen(this);

updateStatus("[server:] A client is now connected");updateStatus("[server:] A client is now connected");

} catch (Exception ex){} catch (Exception ex){

}}

}}

OBEX Server: action_performedOBEX Server: action_performed

Ciascun servizio su una macchina ha bisogno di un Ciascun servizio su una macchina ha bisogno di un identificativo univoco (UUID): in questo caso identificativo univoco (UUID): in questo caso abbiamo scelto 8841; abbiamo scelto 8841; Nel connetersi a questo server il client dovrNel connetersi a questo server il client dovrààutilizzare questo codice.utilizzare questo codice.Visto che stiamo creando un server, abbiamo Visto che stiamo creando un server, abbiamo bisogno di chiamare la funzione Connector.open() bisogno di chiamare la funzione Connector.open() passandogli come argomento lpassandogli come argomento l’’indirizzo del indirizzo del servizio.servizio.Da notare che abbiamo chiamato il servizio FTP Da notare che abbiamo chiamato il servizio FTP (può essere qualunque): questo (può essere qualunque): questo èè il nome che il nome che appare nel service discovery.appare nel service discovery.Visto che il server può ricevere comandi OBEX dal Visto che il server può ricevere comandi OBEX dal client (CONNECT, GET, PUT, etc.) dovremmo client (CONNECT, GET, PUT, etc.) dovremmo prevedere le relative funzioni per implementarli.prevedere le relative funzioni per implementarli.

Page 30: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

30

OBEX Server: on_ConnectOBEX Server: on_Connect

Viene aggiornata la status window per notificare Viene aggiornata la status window per notificare unun’’eventuale connessione.eventuale connessione.

public int onConnect(HeaderSet request, HeaderSet reply) {public int onConnect(HeaderSet request, HeaderSet reply) {

updateStatus("[server:] The client has created an OBEX session")updateStatus("[server:] The client has created an OBEX session");;

return ResponseCodes.OBEX_HTTP_OK;return ResponseCodes.OBEX_HTTP_OK;

}}

public void onDisconnect (HeaderSet req, HeaderSet resp) {public void onDisconnect (HeaderSet req, HeaderSet resp) {

updateStatus("[server:] The client has disconnected the OBEX updateStatus("[server:] The client has disconnected the OBEX session");session");

}}

OBEX Server: on_PutOBEX Server: on_Putpublic int onPut (Operation op) {public int onPut (Operation op) {

try {try {

java.io.InputStream is = op.openInputStream();java.io.InputStream is = op.openInputStream();

updateStatus("Got data bytes " + is.available() + " name " updateStatus("Got data bytes " + is.available() + " name "

+ op.getReceivedHeaders().getHeader(HeaderSet.NAME) + + op.getReceivedHeaders().getHeader(HeaderSet.NAME) +

" type " + op.getType())" type " + op.getType())

File f = new File((String)op.getReceivedHeaders().getHeader(HFile f = new File((String)op.getReceivedHeaders().getHeader(HeaderSet.NAME));eaderSet.NAME));

FileOutputStream fos = new FileOutputStream (f);FileOutputStream fos = new FileOutputStream (f);

byte b[] = new byte[1000];byte b[] = new byte[1000];

int len;int len;

while (is.available() > 0 && (len = is.read(b)) > 0) {while (is.available() > 0 && (len = is.read(b)) > 0) {

fos.write (b, 0, len);fos.write (b, 0, len);

}}

fos.close();fos.close();

updateStatus("[server:] Wrote data to " + f.getAbsolutePath())updateStatus("[server:] Wrote data to " + f.getAbsolutePath());;

} catch (Exception e) { } catch (Exception e) {

e.printStackTrace(); e.printStackTrace();

}}

return ResponseCodes.OBEX_HTTP_OK;return ResponseCodes.OBEX_HTTP_OK;

}}

Page 31: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

31

OBEX ClientOBEX Client

Device DiscoveryDevice Discovery

La classe La classe DeviceDiscovererDeviceDiscoverer consenteconsente diditrovaretrovare gligli altrialtri dispositividispositivi Bluetooth.Bluetooth.

Il processo di discovery inizia con lIl processo di discovery inizia con l’’istanza istanza della classe della classe javax.bluetooth.LocalDevicejavax.bluetooth.LocalDevice, , cheche permettepermette didi ottenereottenere unun’’istanzaistanza per la per la classeclasse javax.bluetooth.DiscoveryAgentjavax.bluetooth.DiscoveryAgent..

Da Da javax.bluetooth.LocalDevicejavax.bluetooth.LocalDevice vienevieneancheanche presopreso ilil nomenome del del nostronostro dispositivodispositivoinsiemeinsieme al al suosuo indrizzoindrizzo Bluetooth.Bluetooth.

Page 32: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

32

DeviceDiscovererDeviceDiscovererpublic class DeviceDiscoverer implements DiscoveryListener {public class DeviceDiscoverer implements DiscoveryListener {

FileClient client;FileClient client;

Vector remoteDevices = new Vector();Vector remoteDevices = new Vector();

DiscoveryAgent discoveryAgent;DiscoveryAgent discoveryAgent;

public DeviceDiscoverer(FileClient client) {public DeviceDiscoverer(FileClient client) {

this.client = client;this.client = client;

try {try {

LocalDevice localDevice = LocalDevice.getLocalDevice();LocalDevice localDevice = LocalDevice.getLocalDevice();

discoveryAgent = localDevice.getDiscoveryAgent();discoveryAgent = localDevice.getDiscoveryAgent();

client.updateStatus("[client:] LocalDevice properties: " + client.updateStatus("[client:] LocalDevice properties: " +

localDevice.getFriendlyName() + localDevice.getFriendlyName() +

" (" + localDevice.getBluetoothAddress() + ")");" (" + localDevice.getBluetoothAddress() + ")");

client.updateStatus("[client:] client.updateStatus("[client:]

Searching for Bluetooth devices in the vicinity...");Searching for Bluetooth devices in the vicinity...");

discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);

} catch(Exception e) {} catch(Exception e) {

e.printStackTrace();e.printStackTrace();

}}

}}

DeviceDiscoveredDeviceDiscovered

Per ciascun dispositivo trovato viene chiamato il Per ciascun dispositivo trovato viene chiamato il metodo metodo deviceDiscovereddeviceDiscovered() () delladella classeclasseDeviceDiscovererDeviceDiscoverer..

public void public void deviceDiscovered(RemoteDevicedeviceDiscovered(RemoteDevice remoteDeviceremoteDevice, , DeviceClassDeviceClass cod) {cod) {

try{try{

remoteDevices.addElement(remoteDeviceremoteDevices.addElement(remoteDevice););

client.updateStatus("[clientclient.updateStatus("[client:] New device discovered : " + :] New device discovered : " +

remoteDevice.getFriendlyName(trueremoteDevice.getFriendlyName(true)+ " (" + )+ " (" +

remoteDevice.getBluetoothAddressremoteDevice.getBluetoothAddress() + ")" );() + ")" );

} } catch(Exceptioncatch(Exception e){e){

e.printStackTracee.printStackTrace();();

} }

}}

Page 33: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

33

InquiryCompletedInquiryCompleted

Quando termina il processo di discovery viene chiamato il Quando termina il processo di discovery viene chiamato il metodo metodo inquiryCompletedinquiryCompleted() () delladella classeclasse DeviceDiscovererDeviceDiscoverer..

public void public void inquiryCompleted(intinquiryCompleted(int discTypediscType) {) {

String String inqStatusinqStatus = null;= null;

if (if (discTypediscType == == DiscoveryListener.INQUIRY_COMPLETEDDiscoveryListener.INQUIRY_COMPLETED) {) {

inqStatusinqStatus = "[client:] Inquiry completed"; = "[client:] Inquiry completed";

} else if (} else if (discTypediscType == == DiscoveryListener.INQUIRY_TERMINATEDDiscoveryListener.INQUIRY_TERMINATED) {) {

inqStatusinqStatus = "[client:] Inquiry terminated";= "[client:] Inquiry terminated";

} else if (} else if (discTypediscType == == DiscoveryListener.INQUIRY_ERRORDiscoveryListener.INQUIRY_ERROR) {) {

inqStatusinqStatus = "[client:] Inquiry error";= "[client:] Inquiry error";

}}

client.updateStatus(inqStatusclient.updateStatus(inqStatus););

client.serviceButton.setEnabled(trueclient.serviceButton.setEnabled(true););

client.deviceButton.setEnabled(falseclient.deviceButton.setEnabled(false););

}}

Service DiscoveryService Discovery

Una volta trovati i dispositivi in range andiamo a Una volta trovati i dispositivi in range andiamo a vedere i servizi che questi condividonovedere i servizi che questi condividono..

La classe La classe ServiceDiscovererServiceDiscoverer consenteconsente didi trovaretrovare gliglialtrialtri dispositividispositivi Bluetooth.Bluetooth.

La particolaritLa particolaritàà di questa classe di questa classe èè che viene che viene eseguita in un thread separato per non bloccare eseguita in un thread separato per non bloccare ll’’applicazione mentre viene eseguito lo scan.applicazione mentre viene eseguito lo scan.

Da notate che viene utilizzato lo stesso UID del Da notate che viene utilizzato lo stesso UID del serverserver..

Page 34: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

34

ServiceDiscovererServiceDiscoverer

public class ServiceDiscoverer extends Thread implements Discovepublic class ServiceDiscoverer extends Thread implements DiscoveryListener {ryListener {

UUID[] uuidSet = {new UUID("8841", true)};UUID[] uuidSet = {new UUID("8841", true)};

int[] attrSet = {0x0100, 0x0003, 0x0004};int[] attrSet = {0x0100, 0x0003, 0x0004};

FileClient client;FileClient client;

ServiceRecord serviceRecord;ServiceRecord serviceRecord;

String connectionURL;String connectionURL;

Vector deviceList;Vector deviceList;

public ServiceDiscoverer(FileClient client, Vector deviceList)public ServiceDiscoverer(FileClient client, Vector deviceList) {{

this.client = client;this.client = client;

this.deviceList = deviceList;this.deviceList = deviceList;

}}

ServiceDiscoverer RunServiceDiscoverer Run

public void run(){public void run(){

try {try {

LocalDevice localDevice = LocalDevice.getLocalDevice();LocalDevice localDevice = LocalDevice.getLocalDevice();

DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgenDiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent();t();

RemoteDevice remoteDevice = null;RemoteDevice remoteDevice = null;

for(int i=0; i < deviceList.size(); i++){ for(int i=0; i < deviceList.size(); i++){

remoteDevice = (RemoteDevice)deviceList.get(i);remoteDevice = (RemoteDevice)deviceList.get(i);

client.updateStatus("[client:] Searching for Services on: client.updateStatus("[client:] Searching for Services on: " + " +

remoteDevice.getFriendlyName(true)+ " (" + remoteDevice.getFriendlyName(true)+ " (" +

remoteDevice.getBluetoothAddress() + ")" );remoteDevice.getBluetoothAddress() + ")" );

discoveryAgent.searchServices(attrSet, uuidSet, discoveryAgent.searchServices(attrSet, uuidSet,

remoteDevice, this);remoteDevice, this);

try{try{

Thread.sleep(2000);Thread.sleep(2000);

} catch (Exception e){} catch (Exception e){

}}

}}

}}

catch(Exception e) {catch(Exception e) {

e.printStackTrace();e.printStackTrace();

}}

}}

Page 35: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

35

ServiceDiscoveredServiceDiscovered

Per ciascun servizio trovato che risponde allPer ciascun servizio trovato che risponde all’’UID UID impostato viene chiamato il metodo impostato viene chiamato il metodo ServiceDiscoveredServiceDiscovered() () delladella classeclasse serviceDiscovererserviceDiscoverer..

Una volta trovato questo servizio controlliamo che Una volta trovato questo servizio controlliamo che il nome sia FTP (anche se non il nome sia FTP (anche se non èè obbligatorio obbligatorio impostare il nome del servizio).impostare il nome del servizio).

Una volta trovato il servizio, memorizziamo Una volta trovato il servizio, memorizziamo ll’’indirizzo in una stringa, connectionURL.indirizzo in una stringa, connectionURL.

ServiceDiscoveredServiceDiscovered

public void public void servicesDiscovered(intservicesDiscovered(int transIDtransID, , ServiceRecordServiceRecord[] [] servRecordservRecord) {) {

for(intfor(int i = 0; i < i = 0; i < servRecord.lengthservRecord.length; i++) {; i++) {

DataElementDataElement serviceNameElementserviceNameElement = servRecord[i].getAttributeValue(0x0100);= servRecord[i].getAttributeValue(0x0100);

String String serviceNameserviceName = (= (String)serviceNameElement.getValueString)serviceNameElement.getValue(); ();

if(serviceName.equals("FTPif(serviceName.equals("FTP")){")){

client.updateStatus("[clientclient.updateStatus("[client:] A matching service has been found");:] A matching service has been found");

try {try {

connectionURLconnectionURL = servRecord[i].getConnectionURL(1,false);= servRecord[i].getConnectionURL(1,false);

} catch (Exception e){} catch (Exception e){

client.updateStatus("[clientclient.updateStatus("[client:] oops");:] oops");

} }

client.updateStatus("[clientclient.updateStatus("[client:] The connection URL is: " + :] The connection URL is: " + connectionURLconnectionURL ););

client.serviceButton.setEnabled(falseclient.serviceButton.setEnabled(false););

client.connButton.setEnabled(trueclient.connButton.setEnabled(true););

}}

}}

}}

Page 36: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

36

ObjectPusherObjectPusher

La classe ObjectPusher contiene il codice La classe ObjectPusher contiene il codice OBEX.OBEX.

Contiene un metodo run che invia un file al Contiene un metodo run che invia un file al server, identificato dal suo URL.server, identificato dal suo URL.

Viene connesso il dispositivo.Viene connesso il dispositivo.

Viene creata una sessione OBEX.Viene creata una sessione OBEX.

Il file da inviare viene convertito in byte array.Il file da inviare viene convertito in byte array.

Viene creato lViene creato l’’header ed iniziata lheader ed iniziata l’’operazione di operazione di PUT con cs.put()PUT con cs.put()

Viene creato un outputstream ed inviato il file.Viene creato un outputstream ed inviato il file.

ObjectPusher run (1)ObjectPusher run (1)

public void run(){public void run(){

try{try{

connection = connection = Connector.open(connectionURLConnector.open(connectionURL););

client.updateStatus("Connectionclient.updateStatus("Connection obtained");obtained");

ClientSessionClientSession cscs = (= (ClientSession)connectionClientSession)connection;;

HeaderSetHeaderSet hshs = = cs.createHeaderSetcs.createHeaderSet();();

cs.connect(hscs.connect(hs););

client.updateStatus("OBEXclient.updateStatus("OBEX session created"); session created");

InputStreamInputStream is = new is = new FileInputStream(fileFileInputStream(file););

byte byte filebytesfilebytes[] = new [] = new byte[is.availablebyte[is.available()];()];

is.read(filebytesis.read(filebytes););

is.closeis.close();();

hshs = = cs.createHeaderSetcs.createHeaderSet();();

hs.setHeader(HeaderSet.NAMEhs.setHeader(HeaderSet.NAME, , file.getNamefile.getName());());

Page 37: Bluetooth Development - comlab.uniroma3.it Development.pdf · ¾Una volta stabilita la connessione la ... ¾A questo punto si possono configurare gli indirizzi di rete ... socket

37

ObjectPusher run (2)ObjectPusher run (2)

hs.setHeader(HeaderSet.TYPEhs.setHeader(HeaderSet.TYPE, "text/plain");, "text/plain");

hs.setHeader(HeaderSet.LENGTHhs.setHeader(HeaderSet.LENGTH, new , new Long(filebytes.lengthLong(filebytes.length));));

Operation Operation putOperationputOperation = = cs.put(hscs.put(hs););

client.updateStatus("Pushingclient.updateStatus("Pushing file: " + file: " + file.getNamefile.getName());());

client.updateStatus("Totalclient.updateStatus("Total file size: " + file size: " + filebytes.lengthfilebytes.length + " bytes");+ " bytes");

OutputStreamOutputStream outputStreamoutputStream = = putOperation.openOutputStreamputOperation.openOutputStream();();

outputStream.write(filebytesoutputStream.write(filebytes););

client.updateStatus("Fileclient.updateStatus("File push complete");push complete");

outputStream.closeoutputStream.close();();

putOperation.closeputOperation.close(); ();

cs.disconnect(nullcs.disconnect(null););

connection.closeconnection.close();();

} catch (Exception e){} catch (Exception e){

}}

}}

ConclusioniConclusioni

La sviluppo di applicazioni Bluetooth permette di La sviluppo di applicazioni Bluetooth permette di integrare collegamenti radio in modo efficace.integrare collegamenti radio in modo efficace.

I sistemi di sviluppo offrono caratteristiche simili I sistemi di sviluppo offrono caratteristiche simili su piattaforme diverse: scegliere la piattaforma su piattaforme diverse: scegliere la piattaforma pipiùù adatta alla nostra applicazione.adatta alla nostra applicazione.

I sistemi embedded offrono capacitI sistemi embedded offrono capacitàà di sviluppo di sviluppo integrate a basso costo.integrate a basso costo.

I profili maggiormente utilizzati sono: RFCOMM, I profili maggiormente utilizzati sono: RFCOMM, OBEX, HEADSET.OBEX, HEADSET.