Technologia Bluetooth Low Energy w Delphi
WITAM! Mateusz Gancarczyk gancarczyk.mateusz@gmail.com www.mattpro.pl Pierwsze PCB i zamruganie diodą LED 2008 rok Delphi od 2009 roku Pierwsza aplikacja mobilna - 2014 rok.
Plan prezentacji 1. O technologii Bluetooth Low Energy 2. Beacon - Smart Flower Pot 3. Urządzenie Bluetooth Low Energy Led Conroller 4. Podsumowanie
1. O technologii Bluetooth LE 1. Wersje standardów 2. Warstwa fizyczna 3. GAP Generic Access Profile 4. GATT - Generic Attribute Profile 5. Kilka słów o Bluetooth 5
Wersje standardu Bluetooth Clasic 1.0., 2.0, 3.0 Bluetooth Low Energy 4.0, 4.1, 4.2 Bluetooth 5
Bluetooth Low Energy Wersje standardu - porównanie Specyfikacja techniczna Bluetooth Classic Bluetooth Low Energy Bluetooth 5 Zasięg 100 m >100 m ~1km Prędkość transmisji 1 3 Mbit/s 1 Mbit/s 125kbs-2Mbit/s Przepustowość 0,7 40 Mbit/s 0,27 Mbit/s 1,4 Mbit/s Opóźnienie ~100 ms 6 ms 6 ms Minimalny czas do wysłania ramki 100 ms 3 ms 3 ms
Bluetooth Low Energy Warstwa fizyczna
Rodzaje urządzeń: 1) Peripheral 2) Central Bluetooth Low Energy Rodzaje urządzeń
Bluetooth Low Energy Advertising Każde peripheral posiada unikalny 6 bajtowy MAC Address Periodyczne wysyłanie do 31 bajtów danych Scan response na żądanie centrali
Bluetooth Low Energy Broadcasting Tryb advertising wysłanie danych do nieograniczonej ilości urządzeń typu central będących w zasięgu.
Bluetooth Low Energy Profile, serwisy i charakterystyki Charakterystyki pojedyncze dane. Serwisy logiczny zbiór charakterystyk. Profile predefiniowanie kolekcje serwisów i charakterystyk zatwierdzone przez Bluetooth SIG.
Bluetooth Low Energy Profil GAP Generic Access Profile Kontroluje connections i advertising in Bluetooth LE, Determinuje jak dwa urządzenia oddziałowują między sobą.
Bluetooth Low Energy Profil GATT - Generic Attribute Profile Definiuje sposób w jaki dwa połączone ze sobą urządzenia (central i peripheral ) przesyłają dane używając koncepcji serwisów i charakterystyk. W jednym czasie peripheral może połączyć się tylko z jednym urządzeniem typu central ( połączenie wiąże się ze zatrzymaniem advertisingu ). Urządzenie typu central może w jednym czasie połączyć się z wieloma peripheral.
Bluetooth Low Energy Profil GATT architektura client/server Peripheral GATT Server ( trzyma definicje charakterystyk i serwisów ) Central GATT Client ( wysyła żądania do serwera ) W Peripheral zapisany jest tz. - Connection Interval
Bluetooth Low Energy Bluetooth Mesh
Bluetooth Low Energy Bluetooth 5 Dwa typy advertisingu: 1) Cała ramka na kanałach advertisingu 2) Header na kanałach advertisingu a reszta na jednym kanale
Bluetooth Low Energy Wsparcie Bluetooth LE Platforma Wsparcie od wersji Windows 8+ (10+) OS X 10.7+ ios 5+ Android 4.3+
2. Beacon - Smart Flower Pot 1. Opis urządzenia 2. Opis działania format Eddystone 3. Implementacja: 3.1 Android Studio Java 3.2 Delphi ( Android Firemonkey )
Beacony Tryb tylko advertising - analogia z latarnią morską. Wykrywanie odległości za pomocą pomiaru RSSI ( ref 1 m ). Różne typy Eddystone, ibeacon, altbeacon. Identyfikator: UUID, Major, Minor (ibeacon)
Smart Flower Pot Opis urządzenia Pomiar wilgotności ziemi w doniczce, Pomiar temperatury ziemi, Pomiar temperatury powietrza, Pomiar nasłonecznienia, Zasilanie z baterii CR2032 ( 230mAh ), Czas działania na baterii 2 lata ( pomiar i wysłanie danych co 10 sekund ), Mikrokontroler nrf52832
Smart Flower Pot Opis urządzenia
Format beacon - Eddystone Bluetooth LE beacon profile UUID 0xFEAA 4 rodzaje ramek: Nazwa ramki UID EID URL TLM Opis Wysyła stałe ID pomiar odległości. Wysyła kodowane, zmienne ID. Wysyła adres URL. Wysyła dane telemetryczne temperatura, napięcie baterii, licznik ramek.
Format beacon - Eddystone Ramka TLM - oryginalna Ramka TLM Smart Flower Pot Numer bajtu Opis Numer bajtu Opis 0 Typ ramki TLM 0x20 1 Wersja 2, 3 Napięcie na baterii w mv 4, 5 Temperatura 6, 7, 8, 9 Licznik 10, 11, 12, 13 Czas od włączenia 0 Typ ramki TLM 0x20 1, 2, 3 Kod 0xDE2981 4, 5 Temperatura doniczki w o C 6, 7 Temperatura powietrza w o C 8 Nawodnienie w % 9 Nasłonecznienie w % 10 Stan baterii w %
Implementacja Android Studio Aplikacja wyświetlająca dane z beacon ów Smart Flower Pot Place your screenshot here
Implementacja Android Studio struktura projektu Android manifest Adapter widoku do ListView Dane Widok Główny plik Definicja klasy SmartFlowerPot Layout główny Layout elementu ListView
SmartFlowerPot Scaner Demo Android Studio
Implementacja Firemonkey Aplikacja wyświetlająca dane z beacon ów Smart Flower Pot Place your screenshot here
Komponent TBeacon Implementacja Firemonkey
Implementacja Typ generyczny - słownik Deklarowanie: SmartFlowerPotDeviceList: TDictionary<String, TSmartFlowerPot>; Inicjalizacja: procedure TForm1.FormCreate(Sender: TObject); begin SmartFlowerPotDeviceList := TDictionary<String, TSmartFlowerPot>.Create; end; Operacje: SmartFlowerPotDeviceList.ContainsKey(ABeacon.DeviceIdentifier)); SmartFlowerPotDeviceList.AddOrSetValue(ABeacon.DeviceIdentifier, currentbeacon); SmartFlowerPot := SmartFlowerPotDeviceList.Items[ABeacon.DeviceIdentifier];
Implementacja Klasa TSmartFlowerPot function TSmartFlowerPot.getTemp( const data :array of byte ): real; var temp: real; tempword: word; begin tempword := Word(( ((Word(data[1]) and $FF ) shl 8 ) or ((Word(data[2]) and $FF ) ) ) ); temp := tempword / 10. ; result := temp; end;
Implementacja Desing i projektant ListView Toolbar ListView
SmartFlowerPot Scaner Demo Firemonkey
Dalszy rozwój projektu Aplikacja działająca w tle + powiadomienia Wysyłanie wyników do chmury strona WWW z danymi pomiarowymi z doniczek Raspberry Pi 3 jako koncentrator danych.
Beacony Dlaczego Low Power? Idź spać ;) 10 s Zmierz jak najszybciej ~ 900μs Czas potrzebny na wysłanie = 2,2 ms Prąd potrzebny na wysłanie = 10mA Wyślij jak najszybciej ~2,2ms Czas w uśpieniu = 10 s Prąd w uśpieniu = 7,9 ua Średni prąd = 11,6 ua Bateria CR2032 = 230mAh Life Time = 0,8*230mAh /0,06 ua = 2 lata!
Beacony w górnictwie Pomiar temperatury noża podczas urabiania
3. Urządzenie BLE Led Conroller 1. Opis urządzenia 2. Opis działania 3. Implementacja: 3.1 Android Studio Java 3.2 Delphi ( Android Firemonkey )
LED Controller Opis urządzenia Sterowanie diodami LED typu WS2812, WS2811, SK6812 Zasilanie z 5V DC Mikrokontroler nrf52832
LED Controller Podział na serwisy i charakterystyki Serwis Led Controller Charakterystyka control Kolor czerwony Kolor zielony Kolor niebieski Kolor biały Jasność Prędkość efektu Typ efektu 0x00 stały kolor 0x01 stała tęcza 0x02 ruchoma tęcza Wartości od 0-255 Wartości od 0-15 Wartości od 0-255
Implementacja Android Studio Aplikacja do sterowania listwą LED SK6812 Place your screenshot here
LED Controller Demo Android Studio
Implementacja Firemonkey Aplikacja do sterowania listwą LED SK6812 Place your screenshot here
Implementacja Klasa TLedController TLedController = class strict private FDevice : TBluetoothLEDevice; FControl : TControlCharacteristic; FName: string; FSignalPercent: integer; FActive : boolean; FBonded : boolean; FInicjalizacja : boolean; FAutoConnect: boolean; public constructor Create(const ADevice: TBluetoothLEDevice); end; property device: TBluetoothLEDevice read FDevice write FDevice; property control: TControlCharacteristic read FControl write FControl; property name: string read Fname write Fname; property signalpercent: integer read FsignalPercent write FsignalPercent; property active : boolean read Factive write Factive; property bonded : boolean read Fbonded write Fbonded; property autoconnect : boolean read FAutoConnect write FAutoConnect; property inicjalizacja: boolean read FInicjalizacja write FInicjalizacja; procedure updaterssipercent;
Implementacja Firemonkey Komponent TBluetoothLE
Implementacja Połączenie z urządzeniem Rozpoczęcie skanowania: BluetoothLE1.DiscoverDevices(100); Lista wyszukanych urządzeń: procedure TForm1.BluetoothLE1EndDiscoverDevices(const Sender: TObject; const ADeviceList: TBluetoothLEDeviceList); Zapis do słownika: BlueLedConnectedDevice := TLedController.Create( LDevice ); BlueLedActiveDeviceList: TDictionary<String, TLedController>; Łączenie się z konkretny urządzeniem BlueLedConnectedDevice.device.Connect; Odkrywanie serwisów i charakterystyk BluetoothLE1.DiscoverServices(BlueLedConnectedDevice.device);
Zapis charakterystyk Implementacja Zapis charakterystyk function TForm1.bluetoothSendControl: Boolean; var datatosend: TBytes; begin SetLength(dataToSend, 13); datatosend[0] := $AB; datatosend[1] := $CD; datatosend[2] := BlueLedConnectedDevice.control.red;... try CharacteristicControl.SetValue(dataToSend); BluetoothLE1.WriteCharacteristic(BlueLedConnectedDevice.device,CharacteristicControl); Result := true; except Result := false; end; end;
Implementacja Odczyt charakterystyk Odczyt charakterystyk BluetoothLE1.ReadCharacteristic(BlueLedConnectedDevice.device, CharacteristicControl); procedure TForm1.BluetoothLE1CharacteristicRead(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus:TBluetoothGattStatus); begin if ACharacteristic.UUID.ToString.Contains(CONTROL_CHAR.ToUpper) then begin BlueLedConnectedDevice.control.red := ACharacteristic.GetValueAsUInt8(2);... tbred.value := BlueLedConnectedDevice.control.red;... lbieffectstype.itemdata.detail :=EffectsTypeName[BlueLedConnectedDevice.control.effectType]; end; end;
Implementacja Trick Tip: Łatwe debugowanie w Androidzie Android Monitor z pakietu Android SDK 1) Tools->SDK Manager->SDK base path 2) C:\Users\Public\Documents\Embarcadero\Studio\19.0\CatalogRepository\AndroidSDK-2433_19.0.27659.1188 3) Katalog tools/monitor.bat Przykład: Log.d('Nowe dane z ' + ABeacon.DeviceIdentifier);
LED Controller Demo Firemonkey
Want big impact? USE BIG IMAGE.
4. Podsumowanie 1. Porównanie Android Studio vs Firemonkey 2. Dlaczego wybrałem Delphi?
Podsumowanie Porównanie Parametr Android Studio Firemonkey Rozmiar aplikacji Smart Flower Pot Scaner 1,64 MB 50,28 MB Rozmiar aplikacji Led Controller 2,09 MB 46,44 MB Szybkość działania i stabilność działania Taka sama Możliwości Brak ograniczeń Ograniczone Czas pomiędzy startem kompilacji a uruchomieniem aplikacji na SmartPhonie Krótszy Dłuższy
Jeden projekt/kod wiele platform naraz Delphi jest po prostu fajne Dlaczego wybrałem Delphi?
Podsumowanie github.com/mattpro M. Gancarczyk
Dziękuję za uwagę! Pytania?