BLE i GATT dla IoT

wersja Audio postu

według Wikipedii Bluetooth jest bezprzewodowym standardem technologii używanym do wymiany danych między urządzeniami stacjonarnymi i mobilnymi na krótkich dystansach. Bluetooth Low Energy (Bluetooth LE lub BLE) to technologia bezprzewodowej sieci osobistej (WPAN) zaprojektowana i sprzedawana przez Bluetooth Special Interest Group (Bluetooth SIG). Zgodnie z Bluetooth SIG, BLE jest przeznaczony do pracy o bardzo małej mocy. BLE obsługuje szybkość transmisji danych od 125 Kb/s do 2 Mb / s, z wieloma poziomami mocy od 1 miliwat (mW) do 100 mW. Kilka kluczowych czynników wpływa na Efektywny Zasięg niezawodnego połączenia Bluetooth, który może się różnić od kilometra do mniej niż metra. Nowsza generacja Bluetooth 5 zapewnia teoretyczną poprawę zasięgu 4x w stosunku do Bluetooth 4.2, od około 200 stóp (60 metrów) do 800 stóp (240 metrów).

Wikipedia wymienia obecnie 36 definicji profili Bluetooth zdefiniowanych i przyjętych przez Sig Bluetooth, w tym specyfikację Generic Attribute Profile (GATT). Zgodnie z Sig Bluetooth GATT jest zbudowany na bazie protokołu atrybutów (ATT) i ustanawia wspólne operacje oraz ramy dla danych transportowanych i przechowywanych przez ATT. GATT zapewnia usługi wykrywania i opisywania profili dla protokołu BLE. Określa, w jaki sposób atrybuty ATT są grupowane w zestawy w celu utworzenia usług.

biorąc pod uwagę niskie zużycie energii i dobrze rozwinięte profile, takie jak GATT, BLE jest idealnym protokołem bezprzewodowym krótkiego zasięgu dla urządzeń Internetu Rzeczy (IoT), w porównaniu do konkurencyjnych protokołów, takich jak ZigBee, Bluetooth classic i Wi-Fi. W tym poście zbadamy wykorzystanie BLE i specyfikacji GATT do przesyłania danych z czujników środowiskowych z czujnika IoT do bramki IoT.

Czujnik IoT

w tym poście użyjemy mikrokontrolera jednopłytkowego Arduino, aby służyć jako czujnik IoT, a właściwie tablica czujników. Płyta Arduino Nano 33 BLE Sense z obsługą AI 3,3 V, wydana w sierpniu 2019 r., jest wyposażona w potężny PROCESOR Nrf52840 firmy Nordic Semiconductors, 32-bitowy PROCESOR ARM Cortex-M4 pracujący z częstotliwością 64 MHz, 1 MB pamięci flash procesora, 256 KB pamięci SRAM i samodzielny moduł Bluetooth 5 Low energy NINA-B306.

Arduino Nano 33 BLE Sense (z nagłówkami) na płycie Chlebowej

Sense zawiera również imponującą gamę wbudowanych czujników:

  • 9-axis Inertial Sensor (lsm9ds1): cyfrowy czujnik przyspieszenia liniowego 3D, Cyfrowy Czujnik kątowy 3D
    i cyfrowy czujnik magnetyczny 3D
  • Czujnik Wilgotności i temperatury (HTS221): Pojemnościowy Cyfrowy Czujnik Wilgotności Względnej i temperatury
  • Czujnik barometryczny (LPS22HB): MEMS nano czujnik ciśnienia: 260-1260 hektopaskal (hPa) absolutny cyfrowy barometr wyjściowy
  • Mikrofon (MP34DT05): czujnik dźwięku MEMS wielokierunkowy mikrofon cyfrowy
  • gest, bliskość, Kolor światła i czujnik natężenia światła (APDS9960): zaawansowane wykrywanie gestów, wykrywanie bliskości, Cyfrowy Czujnik Światła Otoczenia (ALS) i wyczucie koloru (RGBC).

Sense to doskonały, tani mikrokontroler Jednopłytkowy do nauki o zbieraniu i przesyłaniu danych z czujników IoT.

Brama IoT

Brama IoT, według TechTarget, to fizyczne urządzenie lub program, który służy jako punkt połączenia między chmurą a kontrolerami, czujnikami i inteligentnymi urządzeniami. Wszystkie dane przenoszone do chmury lub odwrotnie przechodzą przez bramę, która może być dedykowanym urządzeniem sprzętowym lub oprogramowaniem.

W tym poście użyjemy komputera jednopłytkowego najnowszej generacji Raspberry Pi 3 Model B+ (SBC), służącego jako brama IoT. Ten model Raspberry Pi jest wyposażony w 64-bitowy czterordzeniowy procesor Cortex-A53 (ARMv8) 1,4 GHz na chipie (SoC), 1 GB pamięci SDRAM LPDDR2, dwuzakresową bezprzewodową sieć LAN, Bluetooth 4.2 BLE i Gigabit Ethernet.

aby śledzić wraz z postem, możesz zastąpić Raspberry Pi dla dowolnej maszyny opartej na Linuksie, aby uruchomić dołączony przykładowy skrypt Pythona.

Raspberry Pi 3 Model B+

Arduino przekaże telemetrię czujnika IoT, przez BLE, do Raspberry Pi. Raspberry Pi, za pomocą Wi-Fi lub Ethernet, jest w stanie bezpiecznie przesyłać dane telemetryczne czujnika do chmury. W terminologii Bluetooth, Urządzenie peryferyjne Bluetooth (aka serwer GATT), który jest Arduino, będzie przesyłać dane do urządzenia centralnego Bluetooth (Aka klient GATT), który jest Raspberry Pi.

Arduino Sketch

dla tych, którzy nie znają Arduino, szkic to nazwa, której Arduino używa dla programu. Jest to jednostka kodu, która jest przesyłana do nieulotnej pamięci flash i działa na płycie Arduino. Język Arduino jest zbiorem funkcji C / C++. Wszystkie standardowe konstrukcje C i C++ obsługiwane przez kompilator avr-g++ powinny działać w Arduino.

dla tego posta, szkic, combo_sensor_ble.ino, zawiera wszystkie kody niezbędne do zbierania telemetrii czujników środowiskowych, w tym temperaturę, wilgotność względną, ciśnienie barometryczne oraz światło otoczenia i kolor RGB. Cały kod do tego postu, w tym szkic, można znaleźć na Githubie.

telemetria Czujnika będzie reklamowana przez Sense, ponad BLE, jako usługa wykrywania środowiska GATT (GATT przypisany numer 0X181A) z wieloma cechami GATT. Każda charakterystyka reprezentuje odczyt czujnika i zawiera najbardziej aktualną wartość czujnika (s), na przykład temperaturę (0x2a6e) lub Wilgotność (0x2a6f).

każda cecha GATT określa sposób reprezentacji danych. Aby dokładnie przedstawić dane, należy zmodyfikować odczyty czujników. Na przykład, używając Biblioteki ArduinoHTS221, temperatura jest rejestrowana z dokładnością do dwóch miejsc po przecinku (np. Jednak charakterystyka temperatury (0X2A6E) wymaga podpisanej 16-bitowej wartości (-32,768–32,767). 22,21 °C) jest mnożona przez 100, aby przekształcić ją w liczbę całkowitą (np. 2221). Raspberry Pi będzie następnie obsługiwać konwersję wartości z powrotem do wartości oryginalnej z prawidłową precyzją.

Specyfikacja GATT nie ma obecnie zdefiniowanej charakterystyki reprezentującej światło otoczenia i kolor RGB. Dlatego stworzyłem niestandardową charakterystykę dla wartości kolorów i przypisałem jej uniwersalnie unikalny identyfikator (UUID).

zgodnie z dokumentacją, światło otoczenia i kolor RGB są rejestrowane jako wartości 16-bitowe (zakres 0-65,535). Jednak korzystając z biblioteki ArduinoAPDS9960, odkryłem, że skala odczytów mieści się w zakresie 0-4097. Bez zanurzania się w chwastach, maksymalna wartość liczby (lub nasycenia) jest zmienna. Można go obliczyć na podstawie czasu integracji i wielkości rejestru count (np. 16-bitów). Czas integracji ADC wydaje się być ustawiony na 10 ms w pliku biblioteki, Arduino_APDS9960.cpp.

wartości RGB są zazwyczaj reprezentowane jako 8-bitowy kolor. Możemy przekonwertować wartości na 8-bitowe przed wysłaniem lub obsłużyć je później na bramie Raspberry Pi IoT. Dla celów demonstracyjnych w porównaniu z efektywnością transferu danych, szkic łączy 12-bitowe wartości razem jako ciąg znaków (np. 4097,2811,1500,4097). Łańcuch zostanie skonwertowany z 12-bitowego na 8-bitowy na Raspberry Pi (np. 255,175,93,255).

Podgląd i debugowanie usług urządzeń BLE

zanim spojrzymy na kod działający na Raspberry Pi, możemy użyć dowolnej liczby aplikacji mobilnych do podglądu i debugowania usługi wykrywania środowiska działającej na Arduino i reklamowanej przez BLE. Powszechnie zalecaną aplikacją jest NRF Connect dla urządzeń mobilnych Nordic Semiconductor, dostępny w Google Play. Odkryłem, że wersja Android działa lepiej przy prawidłowej interpretacji i wyświetlaniu wartości charakterystycznych GATT niż wersja aplikacji na iOS.

poniżej widzimy skan mojej okolicy w poszukiwaniu reklamowanych urządzeń BLE, korzystając z wersji aplikacji mobilnej NRF Connect na Androida. Zwróć uwagę na urządzenie BLE, ArduinoNano33BLESense (oznaczone na Czerwono). Zwróć również uwagę na adres kontroli dostępu do mediów (adres MAC) tego urządzenia BLE, w moim przypadku d1:aa:89:0c:ee:82. Adres MAC będzie wymagany później w bramce IoT.

łącząc się z urządzeniem, widzimy trzy usługi. Usługa wykrywania środowiska (oznaczona na Czerwono) zawiera odczyty czujników.

przechodząc do usługi wykrywania środowiska (0x181a), widzimy cztery oczekiwane cechy: temperaturę (0x2a6e), Wilgotność (0x2a6f), ciśnienie (0x2a6d) i nieznaną charakterystykę (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Ponieważ NRF Connect nie może rozpoznać odczytu czujnika koloru jako zarejestrowanej charakterystyki GATT (brak przypisanego numeru GATT), jest on wyświetlany jako nieznana charakterystyka. Podczas gdy wartości temperatury, wilgotności i ciśnienia (oznaczone na czerwono) są interpretowane i wyświetlane poprawnie, odczyt czujnika koloru jest pozostawiany jako surowy tekst szesnastkowy (np. 30-2c-30-2c-30-2c-30-00 lub 0,0,0,0).

wyniki te wskazują, że wszystko działa zgodnie z oczekiwaniami.

BLE Client Kod Pythona

aby działać jako klient BLE (aka urządzenie Centralne), Raspberry Pi uruchamia skrypt Pythona. Skrypt, rasppi_ble_receiver.py, używa modułu bluepy Python do współpracy z urządzeniami BLE poprzez Bluez, na Linuksie.

aby uruchomić skrypt Pythona, wykonaj następujące polecenie, zastępując argument MAC address reklamowanym adresem MAC Twojego urządzenia BLE.

python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82

W przeciwieństwie do aplikacji NRF Connect, moduł bluepy Python nie jest w stanie poprawnie interpretować i wyświetlać wartości charakterystycznych GATT. Dlatego skrypt pobiera surowy, przychodzący tekst szesnastkowy z Arduino i przymusza go do poprawnych wartości. Na przykład odczyt temperatury musi zostać przekształcony z bajtów, b'\xb8\x08\x00\x00', do tablicy bajtów, bytearray(b'\xb8\x08\x00\x00'), następnie do liczby całkowitej, 2232, następnie do dziesiętnej, 22.32, a na końcu do skali Fahrenheita, 72.18°F.

odczyty czujników są pobierane z urządzenia BLE co dwie sekundy. Oprócz wyświetlania odczytów numerycznych czujników skrypt Pythona wyświetla również próbkę koloru 8-bitowego koloru RGB, a także próbkę w skali szarości reprezentującą natężenie światła za pomocą modułu Colr Python.

poniższe nagranie ekranu pokazuje równoległy widok zarówno monitora szeregowego Arduino, jak i wyjścia terminala Raspberry Pi. Raspberry Pi (urządzenie Centralne) łączy się z Arduino (Urządzenie peryferyjne), gdy skrypt Python jest uruchamiany. Raspberry Pi z powodzeniem odczytuje i interpretuje dane telemetryczne z usługi wykrywania środowiska.

wniosek

w tym poście zbadaliśmy wykorzystanie BLE i specyfikacji GATT do przesyłania danych z czujników środowiskowych z urządzenia peryferyjnego do urządzenia centralnego. Ze względu na niskie zużycie energii i dobrze rozwinięte profile, takie jak GATT, Bluetooth Low Energy (BLE) jest idealnym protokołem bezprzewodowym bliskiego zasięgu dla urządzeń IoT.



+