MAUIでのAndroid対応アプリの作成(2)
コンテンツと処理の流れ
MAUIのアプリでは、MVVMと呼ばれるソフトウェア構成とすることが基本です。ただ今回は、値を表示するだけの処理のため、テンプレートアプリをベースにしたシンプルな構成としました。
まず、アプリのメインコンテンツを定義するMainPage.xamlを変更します。既存のコードはすべて削除した上で、GUI要素として、値を表示する各Labelと、センサーデータの取得を開始するボタンの定義を記述します(MainPage.xamlの全体は、ダウンロードしたサンプルコードで確認してください)。
~中略~ <Label Grid.Row="1" Grid.Column="0" Text="温度" FontAttributes="Bold" VerticalOptions="Center" HorizontalOptions="Center"/> <Label Grid.Row="1" Grid.Column="1" x:Name="TempLabel" FontSize="18" VerticalOptions="Center" HorizontalOptions="Center"/> ~中略~ <Button Text="センサーデータ取得" x:Name="BtnName" Clicked="OnClicked" BackgroundColor="#2196F3" TextColor="White" Margin="20"/>
実際の処理は、MainPage.xam.csに記述します。ここでの処理の流れは、次のようになります。
- アドバタイズ信号をスキャンする
- アドバタイズ信号のデバイス名(Local Name)がBME680であれば、Manufacturer Specific Dataを参照する
- 取得したデータからJSON文字列を取り出し、オブジェクトに変換する
- UI要素のLabelにオブジェクトの値を設定する
また、アドバタイズ信号をスキャンする処理は、タイマーで定期実行することにし、その開始と停止をボタンで行えるようにします。
BLE処理
Plugin.BLEでは、CrossBluetoothLE.Current.Adapterクラスを利用します。まずは、アドバタイズ信号をスキャンして、Manufacturer Specific Dataデータを参照する処理です。
public partial class MainPage : ContentPage { ~中略~ IAdapter _adapter = CrossBluetoothLE.Current.Adapter; public MainPage() { InitializeComponent(); // BLEアダプターの初期化(2) _adapter.ScanTimeout = 3000; // デバイス検出時の処理(3) _adapter.DeviceDiscovered += (s, e) => { // デバイス名がBME680の場合(4) if (e.Device.Name == "BME680") { // Manufacturer Specific Dataからセンサー値を解析(5) var data = e.Device.AdvertisementRecords .FirstOrDefault( r => r.Type == AdvertisementRecordType.ManufacturerSpecificData)?.Data; // センサー値を解析してUIを更新する(6) if (data != null) { ~中略~ } } }; ~中略~ } async void StartScan() { // スキャン開始(1) await _adapter.StartScanningForDevicesAsync(); } ~中略~ }
StartScanningForDevicesAsync()メソッドを実行すると(1)、ScanTimeoutで設定した時間、アドバタイズ信号をスキャンします(2)。デバイスが見つかると、DeviceDiscoveredイベントに設定したハンドラーが呼び出されます(3)。
ここでは、デバイス名がBME680の信号のみ処理します(4)。アドバタイズ信号から、Manufacturer Specific Data部のみを取り出します(5)。