11.3. Radio ja linkkikerros¶
BLE-pinon kaksi alinta kerrosta ovat lähes täysin automaattisia Pythonin näkökulmasta – radiopiiri ja sen päällä MicroPythonin ajamat kerrokset hoitavat kaiken kanavan valinnasta kadonneen paketin uudelleenlähetykseen. Kolme niiden tekemistä valinnoista näkyy silti käyttäjälle näkyvään API:in asti: teho, kantama ja läpäisykyky.
11.3.1. Radio¶
BLE käyttää samaa 2,4 GHz:n ISM-kaistaa (Industrial-Scientific-Medical) kuin Wi-Fi, mikroaaltouunit ja useimmat muut lyhyen kantaman langattomat. Kaista on jaettu 40 kanavaan, jotka ovat 2 MHz leveitä.
Kolme 40 kanavasta on varattu mainostukseen – lyhyisiin lähetyksiin, jotka ilmoittavat laitteen läsnäolosta kaikille kuunteleville. Ne on sijoitettu hajalleen kaistalle, jotta kuuntelija voi pyyhkäistä kaikki kolme nopeasti ja jotta häiriö millä tahansa yhdellä ei todennäköisesti pudota laitetta kokonaan pois eetteristä.
Kolmekymmentäseitsemän on datakanavia. Kun kaksi laitetta on yhdistetty, ne vaihtavat paketteja näillä hyppien niiden välillä pseudosatunnaisessa järjestyksessä, josta osapuolet sopivat yhteyden muodostushetkellä. Adaptiivinen taajuushyppely sallii kummankin osapuolen merkitä kanavan huonoksi (raskas Wi-Fi-häiriö, mikroaaltouuni, naapurin BLE-verkko), jolloin järjestys ohittaa sen.
40 BLE-kanavaa 2,4 GHz:n kaistalla. Kolme on mainostukseen, loput kuljettavat liikennettä avoimessa yhteydessä.¶
Radio lähettää lyhyitä paketteja – korkeintaan parin millisekunnin mittaisia – ja nukkuu niiden välillä. Tuo uni on se, mikä tekee teknologiasta vähäenergisen. Tyypillinen BLE-periferinen viettää selvästi alle yhden prosentin ajastaan tosiasiallisesti lähettäen; loppu on radion sammuttamista ajoitettujen tapahtumien välillä.
11.3.2. Linkkikerros¶
Linkkikerros on pienin BLE:n yksikkö, joka puhuu vastineelleen toisessa laitteessa. Se hoitaa neljä tehtävää.
Pakettien kehystys. Jokainen paketti kantaa lyhyen otsakkeen (kanavan käyttöosoite, paketin pituus, ohjausbitit), hyötykuorman ja CRC:n. Vastaanotin tarkistaa CRC:n ja pudottaa kaiken vioittuneen.
Osoitteet. Jokaisella BLE-laitteella on 48-bittinen laiteosoite, joka tunnistaa sen radiossa. Jotkin ovat julkisia – valmistajan määrittelemä laitteistotunniste, jäljitettävissä ikuisesti. Jotkin ovat satunnaisia – laitteessa generoituja, ajoittain kierrätettyjä ja valinnaisesti salattuja niin, ettei salakuuntelija voi liittää kahta lähetystä samaan fyysiseen laitteistoon. Osoitteet tulevat uudelleen esiin sivulla Mainostus ja skannaus.
Yhteyden ajoitus. Kun kaksi laitetta on yhdistetty, linkkikerros ajoittaa säännöllisiä radiotapahtumia hyppysarjaan – kiinteän yhteysvälin päähän toisistaan – ja pakkaa kuhunkin sen mitä yläpuolisesta GATT-kerroksesta on jonossa. Molemmat osapuolet palaavat uneen tapahtumien välillä. Yhteysväli on säädin, jota sovellus voi pyytää (katso Yhteydet).
Luotettavuus. Jokainen yhteyden paketti kuitataan toisen osapuolen toimesta. Linkkikerros lähettää uudelleen kaiken, mikä ei saanut vastausta, joten yläpuoliset kerrokset näkevät järjestetyn, häviöttömän tavuvirran. Toisin kuin UDP – lähetä paketti ja toivo parasta verkkopuolella, BLE:llä ei ole erillistä epäluotettavaa tilaa normaalikäytössä – jokainen avoimen yhteyden paketti yritetään uudelleen, kunnes se saapuu tai linkki julistetaan menetetyksi.
Linkkikerros on myös se, missä salaus ajetaan sen jälkeen, kun laitepari on sopinut avaimesta parituksen aikana (katso Pariutuminen ja sidonta). Jokainen salatun linkin paketti puretaan vastaanottimessa ennen kuin yläpuoliset kerrokset koskaan näkevät sen.
11.3.4. Mitä Python näkee kaikesta tästä¶
Lähes ei mitään. bluetooth- ja aioble-API:t eivät paljasta kanavia, hyppysarjoja, pakettien CRC:itä tai uudelleenlähetysajastimia; ne kaikki hoidetaan BLE-portin ja radion sisällä. Osat, jotka näkyvät läpi, ovat ne, jotka yhteyden muodostushetken neuvottelu paljastaa – yhteysväli, MTU, osoitetyyppi.