iBeacon e Node-RED
La tecnologia iBeacon si sta rapidamente diffondendo con soluzioni sempre più efficienti ed economiche, in questo settore Gimbal (leggi Qualcomm) vende iBeacon serie 10 a $5 ciascuno rendendolo un’interessante portachiavi geek 😉 da acquistare d’impulso e da riprogrammare!
Bene! Lo abbiamo comprato d’impulso, lo abbiamo riprogrammato come iBeacon e ora è tempo di sfruttarlo attivamente, visto che è così portatile possiamo ribaltare il concetto di iBeacon e rendere fissa la rete di lettura e mobile il tag iBeacon.
Ma come facciamo a leggere continuativamente la presenza del tag? Ci viene in aiuto il Raspberry Pi (o qualche altra piattaforma) su cui abbiamo installato Node-RED e che sta avidamente aspettando flussi di dati da processare 😉
Purtroppo Node-RED non ha un nodo che nativamente effettua la scansione (o l’emulazione) di iBeacon, tuttavia se il computer possiede una radio Bluetooth 4.0 (anche connessa tramite un adattatore USB) è possibile utilizzare Node per leggere la presenza di questi tag nelle vicinanze o per emulare
Il pacchetto node-red-contrib-bleacon colma questa lacuna ed aggiunge il supporto Bluetooth 4.o a Node-Red.
Il plugin è sviluppato con licenza Apache ed è liberamente disponibile all’indirizzo https://github.com/valerio-vaccaro/node-red-contrib-bleacon
Installazione
Il plugin è installabile tramite NPM localmente nella directory Modules di Node-RED
1 |
npm install node-red-contrib-bleacon |
oppure è possibile installarlo globalmente (qualora anche Node-RED sia installato a livello globale nel sistema)
1 |
npm install node-red-contrib-bleacon -g |
Nodi inclusi nel pacchetto
Il pacchetto include i seguenti nodi disponibili tramite la piattaforma Node-RED:
scanBeacon Scan for the presence of one or more iBeacons, you can filter by UUID, Major and Minor.
emulateBeacon Emulate the presence of one custom iBeacons, you can choose UUID, Major, Minor and power .
Esempio d’uso
Simple usage of the plugin in Node-RED, a message with ON or 1 will turn on the node, otherwise a message with OFF or 0 will turn off the node.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
[ { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>91e8f20d.6e171<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>inject<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>topic<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payload<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>on<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payloadType<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>repeat<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>crontab<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>once<span class="pl-pds">"</span></span>: <span class="pl-c1">true</span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">134</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">330</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>7338fd2e.8cc704<span class="pl-pds">"</span></span> ] ] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>396da0a5.c6926<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>inject<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>topic<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payload<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>off<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payloadType<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>repeat<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>crontab<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>once<span class="pl-pds">"</span></span>: <span class="pl-c1">false</span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">136</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">378</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>7338fd2e.8cc704<span class="pl-pds">"</span></span> ] ] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>a2fa3c37.5d05c<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>json<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">452</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">360</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>6fb47cbf.904b84<span class="pl-pds">"</span></span> ] ] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>7338fd2e.8cc704<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>scanBeacon<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_uuid<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_major<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_minor<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">291</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">358</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>a2fa3c37.5d05c<span class="pl-pds">"</span></span> ] ] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>fee6d9d5.011928<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>inject<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>topic<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payload<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>on<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payloadType<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>repeat<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>crontab<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>once<span class="pl-pds">"</span></span>: <span class="pl-c1">true</span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">132</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">459</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>5d7401ac.a28c<span class="pl-pds">"</span></span> ] ] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>8a86b72e.757948<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>inject<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>topic<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payload<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>off<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>payloadType<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>repeat<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>crontab<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>once<span class="pl-pds">"</span></span>: <span class="pl-c1">false</span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">134</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">507</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>5d7401ac.a28c<span class="pl-pds">"</span></span> ] ] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>6fb47cbf.904b84<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>debug<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>active<span class="pl-pds">"</span></span>: <span class="pl-c1">true</span>, <span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>false<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>complete<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>false<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">559</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">483</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [] }, { <span class="pl-s"><span class="pl-pds">"</span>id<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>5d7401ac.a28c<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>type<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>emulateBeacon<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_uuid<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>e2c56db5dffb48d2b060d0f5a71096e0<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_major<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_minor<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>beacon_power<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>-59<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>x<span class="pl-pds">"</span></span>: <span class="pl-c1">307</span>, <span class="pl-s"><span class="pl-pds">"</span>y<span class="pl-pds">"</span></span>: <span class="pl-c1">487</span>, <span class="pl-s"><span class="pl-pds">"</span>z<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>db8c5543.2473a8<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>wires<span class="pl-pds">"</span></span>: [ [ <span class="pl-s"><span class="pl-pds">"</span>6fb47cbf.904b84<span class="pl-pds">"</span></span> ] ] } ] |
Devices BLE attualmente testati
Vendor | ID | Working | Note |
---|---|---|---|
Cambridge Silicon Radio, Ltd Bluetooth Dongle | 0a12:0001 | YES |
Lo hai provato su un altro device? Fammi sapere come funziona!!!