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)。
