Aan de Slag met Bluetooth Low Energy (BLE) en Generieke Kenmerk Profiel (GATT) Specificatie voor IoT
Volgens Wikipedia, Bluetooth is een draadloze technologie gebruikte standaard voor het uitwisselen van gegevens tussen vaste en mobiele apparaten over korte afstanden. Bluetooth Low Energy (Bluetooth LE of BLE) is een draadloze personal area network (WPAN) technologie ontworpen en op de markt gebracht door de Bluetooth Special Interest Group (Bluetooth SIG). Volgens de Bluetooth SIG is BLE ontworpen voor een zeer laag vermogen. BLE ondersteunt datasnelheden van 125 Kb / s tot 2 Mb / s, met meerdere vermogensniveaus van 1 milliwatt (mW) tot 100 mW. Verschillende belangrijke factoren beïnvloeden het effectieve bereik van een betrouwbare Bluetooth-verbinding, die kan variëren van een kilometer tot minder dan een meter. De nieuwere generatie Bluetooth 5 biedt een theoretische 4x bereik verbetering ten opzichte van Bluetooth 4.2, van ongeveer 200 voet (60 meter) tot 800 voet (240 meter).
Wikipedia bevat momenteel 36 definities van Bluetooth-profielen die zijn gedefinieerd en goedgekeurd door de Bluetooth SIG, inclusief de Algemene Attribuutprofiel (GATT) – specificatie. Volgens de Bluetooth SIG, GATT is gebouwd op de top van het attribuut Protocol (ATT) en stelt gemeenschappelijke operaties en een kader voor de gegevens vervoerd en opgeslagen door de ATT. GATT biedt profiel ontdekking en beschrijving diensten voor het BLE protocol. Het definieert hoe ATT attributen worden gegroepeerd in sets om diensten te vormen.Gezien het lage energieverbruik en de goed ontwikkelde profielen, zoals GATT, is BLE een ideaal draadloos protocol voor Korteafstandsapparatuur voor Internet of Things (IoT) in vergelijking met concurrerende protocollen, zoals ZigBee, Bluetooth classic en Wi-Fi. In dit artikel zullen we het gebruik van BLE en de GATT-specificatie onderzoeken om gegevens van milieusensoren van een IoT-Sensor naar een IoT-Gateway te verzenden.
IoT Sensor
In dit bericht zullen we een Arduino single-board microcontroller gebruiken om te dienen als een IoT sensor, eigenlijk een array van sensoren. De 3.3 V AI-enabled Arduino Nano 33 ble Sense board, uitgebracht in augustus 2019, wordt geleverd met de krachtige nRF52840-processor van Nordic Semiconductors, een 32-bits ARM Cortex-M4 CPU met 64 MHz, 1MB CPU-flashgeheugen, 256 KB SRAM en een NINA-B306 stand-alone Bluetooth 5 low energy module.
De Zin bevat ook een indrukwekkend scala van geïntegreerde sensoren:
- 9-as Inertial Sensor (LSM9DS1): 3D digitale lineaire versnelling sensor, een digitale 3D –
hoeksnelheid van de sensor, en een digitale 3D magnetische sensor - Luchtvochtigheid en Temperatuur Sensor (HTS221): Capacitieve digitale sensor voor relatieve vochtigheid en temperatuur
- Barometrische Sensor (LPS22HB): MEMS nano druksensor: 260-1260 hectopascal (hPa) absolute digitale uitgangsbarometer
- Microfoon (MP34DT05): MEMS-audiosensor omnidirectionele digitale microfoon
- gebaar, nabijheid, lichtkleur en lichtintensiteit Sensor (APDS9960): geavanceerde Gebaardetectie, Nabijheidsdetectie, digitale Omgevingslichtsensor (als) en kleursensor (Rgbc).
The Sense is een uitstekende, goedkope single-board microcontroller voor het leren over het verzamelen en verzenden van IoT-sensorgegevens.
IoT-Gateway
een IoT-Gateway is volgens TechTarget een fysiek apparaat of softwareprogramma dat dient als verbindingspunt tussen de Cloud en controllers, sensoren en intelligente apparaten. Alle gegevens die naar de Cloud, of vice versa gaat via de gateway, die ofwel een dedicated hardware apparaat of software programma kan zijn.
In deze post, zullen we gebruik maken van een recente generatie Raspberry Pi 3 Model B+ single-board computer (SBC), om te dienen als een IoT Gateway. Dit Raspberry Pi model beschikt over een 1,4 GHz Cortex-A53 (ARMv8) 64-bit quad-core processor systeem op een Chip (SoC), 1GB LPDDR2 SDRAM, dual-band wireless LAN, Bluetooth 4.2 BLE, en Gigabit Ethernet.
om samen met de post te volgen, kunt u de Raspberry Pi vervangen door elke Linux-gebaseerde machine om het meegeleverde voorbeeld Python-script uit te voeren.
de Arduino zal IoT sensor telemetrie, over BLE, naar de Raspberry Pi. De Raspberry Pi, met behulp van Wi-Fi of Ethernet, is dan in staat om veilig verzenden van de sensor telemetrie gegevens naar de Cloud. In Bluetooth terminologie, de Bluetooth randapparaat (aka GATT Server), dat is de Arduino, zal gegevens verzenden naar de Bluetooth Centrale apparaat (aka GATT Client), dat is de Raspberry Pi.
Arduino Sketch
voor degenen die niet bekend zijn met Arduino, is een sketch de naam die Arduino gebruikt voor een programma. Het is de eenheid van code die in niet-vluchtig flashgeheugen wordt geüpload en op een Arduino-bord loopt. De Arduino taal is een set van c / c++ functies. Alle standaard C-en c++ – constructies die door de AVR-g++ – compiler worden ondersteund, zouden in Arduino moeten werken.
voor dit bericht, de schets, combo_sensor_ble.ino, bevat alle code die nodig is om omgevingsensor telemetrie, met inbegrip van temperatuur, relatieve vochtigheid, barometrische druk, en omgevingslicht en RGB-kleur te verzamelen. Alle code voor dit bericht, inclusief de schets, is te vinden op GitHub.
de sensor telemetrie zal worden geadverteerd door de Sense, over BLE, als een GATT Environmental Sensing Service (GATT toegewezen nummer 0x181A) met meerdere GATT-kenmerken. Elk kenmerk vertegenwoordigt een sensorlezing en bevat de meest actuele sensorwaarde(s), bijvoorbeeld temperatuur (0x2A6E) of vochtigheid (0x2A6F).
elk GATT-kenmerk bepaalt hoe de gegevens moeten worden weergegeven. Om de gegevens nauwkeurig weer te geven, moeten de sensorlezingen worden aangepast. Bijvoorbeeld, met behulp van arduinohts221 bibliotheek, wordt de temperatuur vastgelegd met twee decimalen van precisie (bijvoorbeeld, 22.21 °C). Echter, de temperatuur GATT karakteristiek (0x2A6E) vereist een ondertekende 16-bit waarde (-32,768–32,767). Om de nauwkeurigheid te behouden, wordt de vastgelegde waarde (bijvoorbeeld 22,21 °C) vermenigvuldigd met 100 om deze om te zetten in een geheel getal (bijvoorbeeld 2221). De Raspberry Pi zal dan omgaan met het omzetten van de waarde terug naar de oorspronkelijke waarde met de juiste precisie.
de GATT-specificatie heeft geen huidige vooraf gedefinieerde karakteristiek voor omgevingslicht en RGB-kleur. Daarom heb ik een aangepaste karakteristiek voor de kleurwaarden gemaakt en deze een universeel unieke identifier (uuid) toegewezen.
volgens de documentatie worden omgevingslicht en RGB-kleur vastgelegd als 16-bits waarden (een bereik van 0-65, 535). Echter, met behulp van de arduinoapds9960 bibliotheek, ik heb gevonden dat de schaal van de metingen binnen een bereik van 0-4097. Zonder in het onkruid te duiken, is de maximale telwaarde (of verzadiging) variabel. Het kan worden berekend op basis van de integratietijd en de grootte van het telregister (bijvoorbeeld 16-bits). De ADC integratie tijd lijkt te zijn ingesteld op 10 ms in het bestand van de bibliotheek, Arduino_APDS9960.cpp.
RGB-waarden worden meestal weergegeven als 8-bits kleur. We konden de waarden converteren naar 8-bit Voor het verzenden of omgaan met het later op de Raspberry Pi IoT Gateway. Ten behoeve van demonstratiedoeleinden versus efficiëntie van gegevensoverdracht, voegt de sketch de 12-bits waarden samen als een string (bijvoorbeeld 4097,2811,1500,4097
). De string zal worden omgezet van 12-bit naar 8-bit op de Raspberry Pi (bijvoorbeeld 255,175,93,255
).
Previewing en Debugging BLE Device Services
voordat we kijken naar de code die draait op de Raspberry Pi, kunnen we een willekeurig aantal mobiele applicaties gebruiken om een voorbeeld te bekijken en debuggen van de Environmental Sensing service die draait op de Arduino en wordt geadverteerd via BLE. Een veel Aanbevolen toepassing is Nordic Semiconductor ‘ s nRF Connect for Mobile, beschikbaar op Google Play. Ik heb gevonden dat de Android-versie beter werkt bij het correct interpreteren en weergeven van GATT-karakteristieke waarden dan de iOS-versie van de app.
hieronder zien we een scan van mijn omgeving voor BLE-apparaten die worden geadverteerd, met behulp van de Android-versie van de nRF Connect mobiele applicatie. Let op het BLE apparaat, ArduinoNano33BLESense (aangegeven in het rood). Let ook op het media access control-adres (MAC-adres) van dat BLE-apparaat, in mijn geval d1:aa:89:0c:ee:82
. Het MAC-adres zal later nodig zijn op de IoT Gateway.
als we verbinding maken met het apparaat, zien we drie diensten. De Environmental Sensing Service (rood aangegeven) bevat de sensorwaarden.
boren naar beneden in de milieu Sensing Service (0x181A), zien we de vier verwachte kenmerken: temperatuur (0x2A6E), vochtigheid (0x2A6F), druk (0x2A6D), en onbekende karakteristiek (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Omdat nRF Connect de kleursensor niet kan herkennen als een geregistreerd GATT-kenmerk (geen GATT-toegekend nummer), wordt het weergegeven als een onbekend kenmerk. Terwijl de waarden voor temperatuur, vochtigheid en druk (aangegeven in het rood) correct worden geïnterpreteerd en weergegeven, blijft de aflezing van de kleurensensor als onbewerkte hexadecimale tekst (bijvoorbeeld 30-2c-30-2c-30-2c-30-00
of 0,0,0,0
).
deze resultaten geven aan dat alles werkt zoals verwacht.
ble Client Python Code
om op te treden als de Ble Client (aka central device), draait de Raspberry Pi een Python script. Het script, rasppi_ble_receiver.py, gebruikt de bluepy Python module voor interfacing met BLE apparaten via Bluez, op Linux.
om het Python-script uit te voeren, voert u het volgende commando uit, waarbij u het MAC-adresargument vervangt door het geadverteerde MAC-adres van uw eigen BLE-apparaat.
python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82
in tegenstelling tot de nRF Connect app is de bluepy Python module niet in staat om de GATT-karakteristieke waarden correct te interpreteren en weer te geven. Vandaar, neemt het script de ruwe, inkomende hexadecimale tekst van Arduino en dwingt het tot de juiste waarden. Een temperatuurmeting moet bijvoorbeeld worden getransformeerd van bytes, b'\xb8\x08\x00\x00'
, naar een byte-array, bytearray(b'\xb8\x08\x00\x00')
, dan naar een geheel getal, 2232
, dan naar een decimaal, 22.32
, en ten slotte naar de Fahrenheit-schaal, 72.18°F
.
sensorwaarden worden elke twee seconden uit het BLE-apparaat opgehaald. Naast het weergeven van de numerieke sensorwaarden, toont het Python-script ook een kleurstaal van de 8-bit RGB-kleur, evenals een grijswaardenstaal die de lichtintensiteit vertegenwoordigt met behulp van de colr Python-module.
het volgende scherm opname toont een parallelle weergave van zowel de Arduino seriële Monitor en de Raspberry Pi terminal output. De Raspberry Pi (centraal apparaat) maakt verbinding met de Arduino (randapparaat) wanneer de Python script wordt gestart. De Raspberry Pi met succes leest en interpreteert de telemetrie gegevens van de milieu Sensing Service.
conclusie
In deze post hebben we het gebruik van BLE en de GATT-specificatie onderzocht om gegevens van omgevingsensoren van een randapparaat naar een centraal apparaat te verzenden. Gezien het lage energieverbruik en goed ontwikkelde profielen, zoals GATT, is Bluetooth Low Energy (BLE) een ideaal draadloos protocol voor Korteafstandsverkeer voor IoT-apparaten.