Bluetooth elveszésgátló/kulcskereső/távirányító (4.0 LE)
2018. március 20. írta: eNeS

Bluetooth elveszésgátló/kulcskereső/távirányító (4.0 LE)

Az előző Bluetooth távirányító zabálja az elemet, így tovább keresgéltem, a következő versenyző már Bluetooth 4.0 kompatibilis, ráadásul a Low Energy típusból. Ígéretesnek tűnik az adatlapján említett közel fél éves (meglátjuk) elem élettartam, és az, hogy nincs fizikai ki/bekapcsoló gombja, mint az előzőnek, így feltehetőleg tervezéskor is gondoltak rá, hogy huzamosabb ideig lesz bekapcsolva a kütyü.

Cirka 400-500 Ft körüli áran találhatjuk meg a nagy e-piacon: iTag Anti-lost Device Bluetooth 4.0

Megjelenési formáját tekintve több is létezik belőle, nálam ez járt:

itag1.jpg

Megjegyzem egy négyzet alakú is járt nálam, amibe tettek ugyan elemet, de teljesen lemerülve érkezett, és amikor szétpattintottam elemcsere céljából, az egész darabjaira esett, nagy nehezen összeraktam, de állandóan újraindult, beriasztott ok nélkül a saját programjával is. Biztos csak én kaptam hibásat, de azt a változatot nem tudom jó szívvel ajánlani senkinek.

A képen látható nyalóka alakú kütyü hátsó felén van egy bevágás, amit egy érmével elfordítva tudunk (CR2032) elemet cserélni/belerakni. Az enyém pl elem nélkül érkezett.

itag2.jpg

Eredetileg úgy tervezték mobilalkalmazással fogják használják, így megérkezése után ezzel próbáltam ki. Miután behelyeztem az elemet, 3 másodpercig nyomvatartva az egyetlen gombját, kettős csippanással jelezte a készülék, hogy bekapcsolt. Ez után már felderíthető a közelben levő Bluetooth eszközök számára. A kikapcsoláshoz kevéssé meglepő módon szintén 3 másodpercig nyomva kell tartani, majd egy hosszút sípolva kikapcsolja magát és eltűnik a Bluetooth eszközök elöl. Androidra a cseles nevű "iTracing", "Bluetooth itag" illetve a kevésbé egyértelmű "FindElfi" alkalmazások is használhatóak, de rengeteg van még ezeken kívül is. A rövid gombnyomás funkciója alkalmazástól függ, a kereső úgy működik, hogyha elvész a kapcsolat a telefont elkezdi nyivákoltatni az alkalmazás - persze csak ha fut, a kütyü pedig azonnal elkezd sípolni, ha lekapcsolódik róla a másik fél, majd gombnyomásra, vagy a Bluetooth kapcsolat visszatérésére abbahagyja. (teljesen mindegy hogy milyen alkalmazás, vagy mi kapcsolódott hozzá előtte)
Egyes alkalmazások a telefontól való távolságot is megsaccolják az RSSI (jelerősség) alapján, inkább rosszabbul, mint jól. Ha van mobilinternet és GPS a telefonon, akkor egy térképen meg is tudja jelölni az alkalmazás, hol volt utoljára jel. Tehát nem a kütyüben van a GPS, a telefon csinál mindent gyakorlatilag. Ebben csak egy távvezérlő gomb, illetve egy csipogó van...

Rá is térek ezért a lényegre, én ezt távvezérlőként akarom használni, így ideje megvizsgálni, hogyan tudnám ezt Raspberryvel használatba venni.

Az alábbi parancsot beütve a bekapcsolt kütyüt rögtön kilistázta a Raspbian:

sudo hcitool lescan

Méghozzá ilyen néven "FF:FF:C3:0C:F8:AA iTAG"

Az iTAG természetesen a neve, a 12 szám-betű kombináció pedig az azonosítója, amivel kapcsolódni lehet hozzá. Bőszen párosítottam elsőre az előző Bluetooth eszköznél már megszokott módon, de számomra kissé ijesztő módon ez teljesen feleslegesnek bizonyult: amikor a másik Raspberryvel próbálkoztam, az is rögtön rá tudott kapcsolódni, párosítás nélkül is... bár egyidőben a kütyü csak egy állomáshoz (telefon vagy számítógép) tud csatlakozni, így, figyelembe véve a korlátozott hatótávolságát, kevéssé valószínű, hogy átveszik a hatalmat felette nem kívánt egyéb eszközök.

Ha valamiért nem megy, győződjünk meg róla, hogy engedélyezve van a Bluetooth az RPI-n:

sudo apt-get update
sudo apt-get install bluez-toools
sudo hciconfig -a
sudo hciconfig hci0 up

Aztán végeztem némi felderítést, az alábbi parancs interaktív BLE kapcsolatot kezdeményez: (a device után természetesen mindenkinek a saját eszköz azonosítót kell beillesztenie)

sudo gatttool --device=FF:FF:C3:0C:F8:AA -I

A vastag betűvel szedettek a kiadott parancsok, a többi a rendszer válasza:

[FF:FF:C3:0C:F8:AA][LE]> connect
Attempting to connect to FF:FF:C3:0C:F8:AA
Connection successful
[FF:FF:C3:0C:F8:AA][LE]> char-desc
handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0007, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0008, uuid: 00002a19-0000-1000-8000-00805f9b34fb
handle: 0x0009, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x000a, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x000b, uuid: 00002a06-0000-1000-8000-00805f9b34fb
handle: 0x000c, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x000d, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x000e, uuid: 0000ffe1-0000-1000-8000-00805f9b34fb

Amikor kapcsolódva van, akár a fenti interaktív módban, akkor az alábbi üzenetek jelennek meg a konzolon gombnyomáskor:

Notification handle = 0x000e value: 01

Vagyis a 0x000e "handle" felelős a gombnyomás eseményért! Már csak valami programot kell írni rá, ami ezt figyeli, és elvégzi a szükséges feladatokat.

Kicsit utánaolvasva a handle-ek az alábbi funkciókat jelentik:

handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb "Device Name", NOTIFY READ 
handle: 0x0008, uuid: 00002a19-0000-1000-8000-00805f9b34fb "Battery Level", READ 
handle: 0x000b, uuid: 00002a06-0000-1000-8000-00805f9b34fb "Alert Level", NOTIFY WRITE NO RESPONSE WRITE
handle: 0x000e, uuid: 0000ffe1-0000-1000-8000-00805f9b34fb "Button pressed event", NOTIFY READ 

Vagyis a "char-read-hnd 0x0003" lekéri az eszköz nevét, ami mindig "iTAG" és mellesleg csak olvasható paraméter, a "char-read-hnd 0x0008" lekéri az akkumulátor töltöttségét, ami egy nagy előrelépés az előzőhöz képest, főleg, hogy eddig mindig 99% volt, reméljük ez nem azt jelenti, hogy ez a funkció nem működik, hanem azt, hogy valóban hosszú élettartamú lesz az eszköz.

Az "Alert Level" írható handle, 1-et beleírva (char-write-cmd 0x000b 01) közepes hangerejű riasztást, 2-et beleírva hangos riasztást indít a kütyü csipogóján, szaggatott hanggal, 0-át beírva pedig (char-write-cmd 0x000b 00) leállítja a riasztást. Én egyébként nem vettem észre különbséget az 1 és 2 között.

No, ezen információk alapján kell összehozni valami programot.. ugye mennyivel egyszerűbb volt az előző Bluetooth távirányító, ami billentyűzetnek jelentette le magát, és egyből működött? De a minőségnek ára van.

Természetesen a szokásos Python programnyelvemhez ragaszkodnék, aránylag gyorsan le lehet kódolni benne, amire szükség van. Elkezdtem olvasgatni, a pygatt függvénykönyvtárat javasolták több helyen is a Python-ból történő eléréséhez, sajnos nekem Raspberry-n nem akart semmit produkálni, még a legújabb Bluez forrásból történő feltelepítése után sem. Próbáltam még két-három továbbit, végül a bluepy-nél állapodtam meg.

Telepítése roppant egyszerű:

sudo aptitude install libglib2.0-dev
sudo pip3 install bluepy

A bluepy használatával a fenti parancsok és handle-ek ismeretében megírtam a saját unit-omat, amit az okosóra projektemhez illesztettem: unit_itag.py

Példaprogram a fenti unit használatára:


from unit_itag import *
import time

def itagkeypressed(val):
 print("Key pressed: ",val) # ezt irja ki az itag gombnyomasara

print("Connection...") # kapcsolodjon az alabbi cimu BLE iTaghoz
itag = iTagDevice("ff:ff:c3:0c:f8:aa",itagkeypressed)

if itag.isconnected(): # ha csatlakoztunk
 print("Connected.")
 time.sleep(10)
 print(itag.report_battery()) # irja ki az akku allapotot (%)
 time.sleep(1)
 print("Activate alarm")
 itag.setalarmstate(1) # kapcsolja be a riasztast
 time.sleep(3)
 print("Dectivate alarm")
 itag.setalarmstate(0) # kapcsolja ki a riasztast
 time.sleep(1)
 print("Disconnect")
 itag.disconnect() # kapcsolodjon le az eszkozrol szabalyosan

Ezt már aránylag könnyen hozzáigazítottam az óraprogramhoz, hogy gombnyomás eventre küldjön egy MQTT azonosító bekapcsolást, és a "Battery:" paramétert is hozzátéve, Domoticz-ban is láthatom, hogyan alakul az elem sorsa.

Programrészlet:


domomsgb = '{{ "idx": {0}, "nvalue": {1:0.2f}, "svalue": "{2}", 
"RSSI" : 12, "Battery": {3} }}' ... def itagkeyhandler(event): global itag, MainTimer if MainTimer.isalarmactive(): alarmhandler(0) MainTimer.alarmstopped() btnnum = 0 if (event > 0): btnnum = 1 batteryval = itag.report_battery() msg = domomsgb.format(ClockConfig.IDX_ITAG1_BUTTON, btnnum,
motionStates[btnnum],batteryval) mqttPublish(msg) if (btnnum == 1): time.sleep(0.5) msg = domomsgb.format(ClockConfig.IDX_ITAG1_BUTTON, 0,
motionStates[0],batteryval) # auto off / push button! mqttPublish(msg)

itag3.jpg

A riasztási eseményt kimenetként használva az óraprogram figyeli a Domoticzban kiadott MQTT IDX-et, és be/ki tudja kapcsolni a fenti setalarmstate() segítségével.

Programrészlet:


def on_message(mosq, obj, msg): #MQTT listen
...
   if (list['idx'] == ClockConfig.IDX_ITAG1_BUZZER):
     ibuzz = 0
     if list['nvalue']:
      ibuzz = int(list['nvalue'])
     try:
      if (ibuzz) == 0:
       itag.setalarmstate(0)
      else:
       itag.setalarmstate(1)
     finally:
      pass
...      

Elismerem, ez haladóknak való, de aki érti, annak jó szórakozást hozzá!

UPDATE: rendeltem egy másik, pont így kinéző példányt, és ennek már teljesen más volt a firmware-e, egyrészt több információt is visszaad, amikre nekem nincs nagy szükségem, másrészt sajnos nem jelenti le az akkumulátor kapacitását, harmadrészt teljesen más Handle-ökön vannak az eljárásai, így áttértem az egyébként szabványos UUID alapú elérésre, átírtam a unitot ennek megfelelően, így elvileg minden hasonló eszközt támogat.

Kapcsolódó irodalom:

A bejegyzés trackback címe:

https://bitekmindenhol.blog.hu/api/trackback/id/tr513755652

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.