Mobile

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.


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.


najwięcej ofert html

Artykuł został pierwotnie opublikowany na servocode.com. Zdjęcie główne artykułu pochodzi z unsplash.com.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://justjoin.it/blog/bluetooth-le-dla-xamarin-forms-kontrolowanie-obiektow-z-poziomu-aplikacji-mobilnej" order_type="social" width="100%" count_of_comments="8" ]