Bluetooth LE dla Xamarin.Forms. Kontrolowanie obiektów z poziomu aplikacji mobilnej
Pierwsze podejście do programowania miałem w podstawówce. Podczas lekcji informatyki nawigowaliśmy małego żółwia w Logo, co okazało się być bardzo satysfakcjonujące. Wtedy zacząłem fascynować się programowaniem. Kto by pomyślał, że w przyszłości stworzę aplikację wykorzystującą Bluetooth LE do kontrolowania prawdziwych rzeczy takich jak roboty?
Tomasz Kuźniar. Mobile Developer w firmie ServoCode i Cervi Robotics. Zna każdy zakątek platformy Xamarin, Unity 3D, a C# nie ma przed nim tajemnic. Po pracy pozostaje przy biurku i zamienia się w producenta muzycznego.
Spis treści
Podstawy protokołu Bluetooth LE
Dobra, koniec nostalgii, bierzemy się do roboty. Protokołu Bluetooth LE używamy do komunikacji pomiędzy dwoma urządzeniami. Każde z nich może przyjmować jedną z następujących ról:
- GATT Client
- GATT Server
Ta konstrukcja jest bardzo podobna do tradycyjnej architektury Klient-Serwer. Zanim na dobre zatopimy się w kodzie, musisz poznać kilka przydatnych definicji:
Serwisy — dostarczane funkcje i powiązane zachowania stworzone by wchodzić w integracje z Klientem. Każda usługa zawiera zbiór charakterystyk. Pamiętaj, najpierw serwisy, potem charakterystyki!
Charakterystyki — definicja danych podzielonych na wartość i deklarację. Występują w kilku trybach: read, write, notify, indicate.
Deskryptor — opcjonalny atrybut, który zawiera dane na temat konkretnej wartości i sposobach dotarcia do niej. Znajduje się w charakterystykach.
UUID — Unikalne ID urządzenia. W ten sposób Klient może przekazywać informację na temat serwisów, które dostarcza, do centralnego urządzenia.
Bluetooth LE: Schemat Klient – Serwer
Uwaga! Nie możesz opuścić tej strony, jeśli nie zapamiętasz trzech ważnych rzeczy:
- Możesz połączyć Klienta Bluetooth LE tylko z jednym centralnym urządzeniem w danym momencie.
- Klient musi uzyskać pozwolenie od serwera aby wysłać dane.
- Serwer uruchamia operacje Notifications i Indications za każdym razem, gdy wartość w bazie danych zmienia się.
Zanotowane? Dobra, lecimy dalej!
Aplikacja Xamarin.Forms jako Klient GATT
Do komunikacji wieloplatformowej aplikacji z Bluetooth LE w użyjemy biblioteki ACR Reactive BluetoothLE Plugin. Znajdziesz ją tutaj. Paczkę instalujemy do każdego projektu. (Core, Android, iOS)
Android setup
W Androidzie dodajemy permissions do AndroidManifest.xml. Pamiętajmy jednak, że w przypadku Androida od wersji 6 w górę należy poprosić użytkownika o uprawnienia podczas działania aplikacji. Przyda się tutaj wtyczka PermissionPlugin dostępna w tym miejscu.
<uses-permission android_name="android.permission.BLUETOOTH"/> <uses-permission android_name="android.permission.BLUETOOTH_ADMIN"/> <!--this is necessary for Android v6+ to get the device name and address--> <uses-permission android_name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android_name="android.permission.ACCESS_COARSE_LOCATION" />
iOS setup
W przypadku iOS’a, dodaj następujące klucze do pliku Info.plist:
<key>UIBackgroundModes</key> <array> <!--for connecting to devices (client)--> <string>bluetooth-central</string> <!--for server configurations if needed--> <string>bluetooth-peripheral</string> </array> <!--To add a description to the Bluetooth request message (on iOS 10 this is required!)--> <key>NSBluetoothPeripheralUsageDescription</key> <string>YOUR CUSTOM MESSAGE</string>
Wyszukiwanie urządzeń
Aby wyszukać urządzenia w pobliżu wykorzystujemy adapter z ACR Reactive BluetoothLE Plugin, który posiada następujące metody:
var _adapter = CrossBleAdapter.Current; _adapter.Scan(); _adapter.ScanExtra(); _adapter.ScanInterval(); _adapter.ScanForUniqueDevices(); _adapter.ScanUntilDeviceFound(); _adapter.ScanForHeartRateSensors();
Istnieje możliwość podpięcia eventa, który poinformuje nas o znalezieniu urządzenia:
_adapter.ScanForUniqueDevices().Subscribe(device => DeviceDiscovered(device));
Połączenie z urządzeniem
Przed połączeniem z urządzeniem możemy podpiąć się pod eventy m.in: Device.
foundDevice.WhenConnected().Subscribe(result => Connected(result)); foundDevice.WhenAnyCharacteristicDiscovered().Subscribe(result => CharacteristicsDiscovered(result)); foundDevice.WhenStatusChanged().Subscribe(status => StatusChanged(status));
Pozwolą nam one monitorowanie połączenia z urządzeniem, a także znalezienie potrzebnych do komunikacji charakterystyk.
Rozłączenie z urządzeniem
Następuje po wykonaniu następującego kodu:
if (_connectedDevice.IsConnected()) _connectedDevice.CancelConnection();
Komunikacja
ODBIERANIE DANYCH
var result = await characteristic.Read(); // use result.Data to see response
WYSYŁANIE DANYCH
await characteristic.Write(bytes);
NASŁUCHIWANIE NOTYFIKACJI
characteristic.EnableNotifications(); characteristic.WhenNotificationReceived().Subscribe( result => { //result.Data to get at response });
Teraz wiesz, jak stworzyć swoją armię robotów sterowanych smartfonem, która…, znaczy nabyłeś nową umiejętność z zakresu IoT!
Zobacz także: GitLAb Continuous Integration dla Xamarin.Forms.
Artykuł został pierwotnie opublikowany na servocode.com. Zdjęcie główne artykułu pochodzi z unsplash.com.