giovedì 5 dicembre 2013

IBeacon su Linux, IPhone ed Android

Grazie ad un amico che ha un IPhone ho provato ad usare IBeacon, la tecnologia portata avanti da Apple come anti-RFid, che e' fondamentalmente un sistema di posizionamento indoor (anche se poi puo' essere usato per altri scopi) e di prossimita'

Per prima cosa, per poter utilizzare questo sistema non avendo prodotti recenti Apple, ci si deve dotare un dongle Bluetooth LE (dove LE sta per Low Energy), altrimenti detto Bluetooth 4. In commercio non ne esistono ancora molti e sono ancora meno quelli compatibili con Linux.
La scelta e' caduta su un dongle dotato di chip Broadcom BCM20702 (il costo e' di una quindicina di euro, piu' caro dei normali dongle BT a causa del supporto alle specifiche 4.0)



Questo il log su Linux su come viene riconosciuto il device

-----------------------------------------------------------
Dec  5 08:01:52 debian-T61 kernel: [ 1296.024095] usb 5-2: new full-speed USB device number 3 using uhci_hcd
Dec  5 08:01:52 debian-T61 kernel: [ 1296.194138] usb 5-2: New USB device found, idVendor=0a5c, idProduct=21e8
Dec  5 08:01:52 debian-T61 kernel: [ 1296.194144] usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Dec  5 08:01:52 debian-T61 kernel: [ 1296.194148] usb 5-2: Product: BCM20702A0
Dec  5 08:01:52 debian-T61 kernel: [ 1296.194151] usb 5-2: Manufacturer: Broadcom Corp
Dec  5 08:01:52 debian-T61 kernel: [ 1296.194155] usb 5-2: SerialNumber: 000272C5DC40
Dec  5 08:01:52 debian-T61 mtp-probe: checking bus 5, device 3: "/sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2"
Dec  5 08:01:52 debian-T61 mtp-probe: bus: 5, device: 3 was not an MTP device
-----------------------------------------------------------
Per rendere operativo questo dongle c'e' da fare una piccola modifica
copiando i valori di IdVendor e IdProduct mostrati dal log si deve lanciare il seguente comando

modprobe btusb 
echo "0a5c 21e8" >> /sys/bus/usb/drivers/btusb/new_id
Per poter usare Bluetooth 4 si devono avere le librerie piu' recenti. E' quindi necessario aggiornare il proprio sistema compilando diretttamente da sorgente

apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
wget www.kernel.org/pub/linux/bluetooth/bluez-5.8.tar.xz
unxz bluez-5.11.tar.xz

entrare nella directory 

./configure --disable-systemd
make 
make install

a questo punto le librerie sono installate e si puo' iniziare ad attivare l'IBeacon (ripreso da qui

hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00

dove UUID e' UUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 ovviamente da cambiare tra i vari dispositivi

hciconfig hci0 leadv 0

Impiegando un IPhone 5 IOs7 e l'applicazione LightBlue si puo' osservare i beacon nelle immediate vicinanze del telefono (in questo caso sono presenti due...il secondo e' il dongle attaccato alla Linux Box)



Per essere onesti durante le prove ogni tanto il segnale del Beacon spariva dal cellulare ed era necessario riconfigurarlo su Linux

Impressioni di uso
Il sistema puo' essere interessante ma e' un po' limitato.
Di fatto l'IBeacon non trasporta informazioni al di la' di quella del proprio UUID e la stringa del device.
Non si possono mandare messagi di Push e non si possono gestire eventi su dispositivi mobili.
Per fare in modo che il device mobile interagisca con l'IBeacon e' necessario scrivere una propria applicazione che, per esempio, quando il segnale del beacon e' sufficientemente prossimo (ovvero l'utente e' vicino al beacon) genera un evento come mostrare le informazioni di cio' a cui siamo prossimi (per esempio un quadro in un museo od le caratteristiche di un prodotto in una vetrina)