11.14. Sažetak¶
Prošli ste kroz Bluetooth Low Energy od radija pa sve do Python API-ja koji se koristi za njegovo upravljanje:
Motivacija – BLE je odgovor kada kamera želi razgovarati s nečim u blizini bez ikakve infrastrukture između njih. Telefon u istoj prostoriji, nosivi uređaj na zapešću, beacon na zidu. Kratak domet, bez mreže kojoj se treba pridružiti, gotovo bez potrošnje energije.
Radio – 2,4 GHz, 40 kanala: tri za oglašavanje, 37 za podatke veze, s preskakanjem po pseudo-slučajnoj sekvenci uz prilagodljivo izbjegavanje bučnih kanala. Kratki paketi, radiji koji su uglavnom usnuli.
Sloj veze – okvirivanje paketa, adresiranje, raspoređivanje veze, ponovni prijenos i šifriranje na sloju veze. Ništa od toga ne konfigurira se iz Pythona; sve se to očituje kroz parametre veze i MTU.
Generic Access Profile (GAP) – otkrivanje i upravljanje vezom. Četiri uloge: periferija i emiter (oglašavaju), centralni uređaj i promatrač (skeniraju). Korisni teret oglašavanja nosi lokalni naziv, UUID-ove usluga, izgled i podatke specifične za proizvođača – 31 bajt plus neobavezni 31-bajtni odgovor na skeniranje. Interval veze, kašnjenje periferije i nadzorno vrijeme čekanja upravljaju time kako se otvorena veza ponaša.
Generic Attribute Profile (GATT) – stablo usluga, od kojih svaka sadrži karakteristike, a svaka neobavezno sadrži deskriptore, identificirane UUID-ovima (16-bitnim za Bluetooth-SIG standarde, 128-bitnim za prilagođene). Pet operacija: read i write (povlačenje, pokreće ih klijent), notify i indicate (guranje, pokreće ih poslužitelj, pretplaćeno putem Client Characteristic Configuration Descriptor-a). Veličina korisnog tereta ograničena je dogovorenim MTU-om.
Python API –
aioblesvaki BLE obrazac pretvara u asyncio korutinu. Periferija jeaioble.advertise()koji u petlji obrađuje veze, s objektimaService/Characteristickoji se izgrade jednom i predaju pozivomaioble.register_services(). Centralni uređaj jeaioble.scan()za pronalaženje partnera,connect()za otvaranje veze,service()icharacteristic()za prolazak kroz udaljeno GATT stablo, a zatimread()/write()/subscribe()/notified()za same podatke. Prekidi veze javljaju se kaoaioble.DeviceDisconnectedErrorunutar korutine koja je čekala.L2CAP kanali – izlaz u nuždi za skupne tokove bajtova koji ne pristaju u GATT-ov model ključ/vrijednost.
aioble.DeviceConnection.l2cap_accept()/l2cap_connect()otvaraju kanal po aplikaciji povrh GAP veze, sa slanjem / primanjem kontroliranim kreditnim protokom i većim MTU-om nego što GATT može prenijeti.Uparivanje i šifriranje – BLE veze su prema zadanim postavkama javne.
aioble.DeviceConnection.pair()pokreće razmjenu ključeva koja proizvodi šifriranu vezu;bond=True(zadano) trajno pohranjuje ključeve tako da sljedeće veze preskaču rukovanje. Bezmitm=Truei upotrebljive IO sposobnosti, šifriranje štiti od pasivnih prisluškivača, ali ne i od aktivnog preusmjeravanja tijekom izvornog uparivanja.
To je dovoljno za pisanje aplikacija za kameru koje objavljuju status kao periferija, čitaju senzorske podatke kao centralni uređaj, guraju vrijednosti uživo na telefon preko BLE-a, osiguravaju vezu korakom upari-i-poveži i – za rijetki slučaj skupnog prijenosa – izlaze iz GATT-a u L2CAP kanal.
11.14.1. Rješavanje problema¶
Kvarovi BLE-a uglavnom su nepodudaranja između onoga što dvije strane očekuju, a inspektor na strani telefona najbrži je način da se vidi čija su očekivanja pogrešna. Standardni alat jest nRF Connect for Mobile (Nordic Semiconductor, besplatan na Androidu i iOS-u): skenira, spaja se, prolazi kroz GATT bazu podataka, čita i piše karakteristike te se pretplaćuje na obavijesti – pa se ponašanje na strani kamere može testirati izolirano, bez pisanja prateće aplikacije uopće.
Uobičajeni načini kvara:
„Moj se uređaj pojavljuje u skeneru, ali se ne želi spojiti.” Najčešće paket oglašavanja ima
connectable=False(način emitera), ili je prethodna veza još otvorena pa je kamera već prošlaaioble.advertise(). Dodajte naredbe za ispis oko poziva oglašavanja kako biste to potvrdili.„exchange_mtu(512) je izvršen, ali moje su obavijesti i dalje ograničene na 20 bajtova.” Dogovoreni MTU jest
min(local, peer)– telefon ili centralna biblioteka možda nisu zatražili veći MTU sa svoje strane, u kojem slučaju veza ostaje na 23. Pregledajtemtunakon štoexchange_mtu()vrati rezultat. Imajte također na umu daexchange_mtu()radi samo jednom po vezi; pozovite ga prije prve velike operacije.„Uparivanje ne uspijeva uz generičku pogrešku.” Dva uobičajena krivca: nepodudaranje IO sposobnosti (traženje
mitm=Truena kameri koja deklariraio=3/ bez ulaza i izlaza – ne postoji način da se potvrdi brojčani kod, pa mehanizam uparivanja odustaje) i potpuno pogrešno vrijeme zidnog sata na kameri kada ga partner zahtijeva. Postavite sat pomoćuntptime.settime()prije prvog pokušaja uparivanja.„Obavijesti nikada ne stignu do klijenta.” Dvije stvari treba provjeriti, prema redoslijedu: (a) je li karakteristika deklarirana s
notify=True? – bit svojstva mora biti postavljen na strani poslužitelja; (b) je li klijent pozvaosubscribe()? – bez zapisivanja u Client Characteristic Configuration Descriptor (CCCD), poslužitelju je rečeno da nijedan klijent ne želi obavijesti pa ih on tiho odbacuje.„Oglašeni naziv je skraćen ili nedostaje.” Korisni teret oglašavanja je 31 bajt, a polja zastavica + UUID usluge + izgled svako oduzimaju bajtove s vrha. Dugačak
name=plus nekoliko UUID-ova usluga prelijevaju se. Ili skratite naziv ili koristite aktivno skeniranje tako da odgovor na skeniranje (dodatnih 31 bajt) nosi preljev. nRF Connect prikazuje obje polovice odvojeno, što čini podjelu očitom.„L2CAP spajanje odmah baca iznimku.” Obično nepodudaranje PSM-a – obje se strane moraju izvanpojasno dogovoriti o istom PSM broju.
L2CAPConnectionErrornosi Bluetooth statusni kod kao svoj prvi argument; status2(„PSM not supported”) je odavanje.„Povezane veze i dalje pokreću potpuno rukovanje uparivanja pri svakom ponovnom spajanju.”
aioble.security.load_secrets()nije pozvan pri pokretanju. Bez njega, spremljeni ključevi su u flash memoriji, ali nikada nisu učitani u memoriju, pa je identitet partnera nepoznat i uparivanje se svaki put pokreće ispočetka.
Kada sve ostalo zakaže, niskorazinski modul bluetooth izlaže IRQ povratni poziv koji se aktivira za svaki temeljni događaj; kratkotrajna pretplata na njega i ispisivanje događaja ekvivalent je Wireshark traga za stranu kamere.
11.14.2. Kasnija uporaba ove reference¶
Tretirajte poglavlja o Bluetoothu kao referentni materijal; vraćanje radi točnog izgleda korisnog tereta oglašavanja periferije ili tijeka skeniranja-i-pretplate na centralnoj strani namjeravana je uporaba. Referentne stranice aioble — Asinkroni BLE i bluetooth — niskorazinski Bluetooth nabrajaju svaku metodu, zastavicu i konstantu na jednom mjestu kada je pitanje samo „koji je točan naziv ovog poziva”.