MAUIでのAndroid対応アプリの作成(3)
観測値の変換とUI更新
続いて、Manufacturer Specific DataからJSON文字列を抜き出し、観測値に変換します。そして、画面のLabelに設定します。
~中略~ // JSONデータを格納するクラス(9) public class Sensor { public required List<float> d { get; set; } } ~中略~ // センサー値を解析してUIを更新する(6) if (data != null) { // バイト配列を文字列に変換する(7) // 先頭2バイトは企業識別子のため、除外する var jstr = Encoding.GetEncoding("UTF-8").GetString(data[2..]); // JSON文字列をSensorオブジェクトに変換する(8) Sensor? jdata = JsonSerializer.Deserialize<Sensor>(jstr) // LISTから値を取り出してUI更新(10) var temperature = jdata?.d[0]; var humidity = jdata?.d[1]; var pressure = jdata?.d[2]; var gas = jdata?.d[3]; TempLabel.Text = $"{temperature:F1} ℃"; HumidLabel.Text = $"{humidity:F1} %"; PressureLabel.Text = $"{pressure:F0} hPa"; GasLabel.Text = $"{gas:F0} KΩ"; LastUpdat.Text = $"最終更新: {DateTime.Now.ToString("HH:mm:ss")}"; }
Manufacturer Specific Dataから取り出したデータは、バイト配列になっていて、先頭2バイトには、企業識別子が含まれています。そのため、3バイトめ以降のデータを、文字列に変換します(7)。JSON文字列からSensorオブジェクトに変換するには、System.Text.JsonのJsonSerializer.Deserializeメソッドを用います(8)。
なお、JSON文字列に応じたSensoクラスをあらかじめ定義しておきます(9)。flot型変数のLIST配列のSensorオブジェクトの値は、UI要素のLabelのTextプロパティに設定します(10)。
バイナリ値の場合
JSON文字列以外ではなく、観測値をそのままバイト配列として格納した場合は、BitConverter.ToSingleメソッドを利用して変換します。
var temperature = BitConverter.ToSingle(data,2); var humidity = BitConverter.ToSingle(data, 6); var pressure = BitConverter.ToSingle(data, 10); var gas = BitConverter.ToSingle(data, 14);
BitConverter.ToSingleメソッドの第1引数は、変換元のバイト配列で、第2引数は、バイト配列の起点となる位置を指定します。観測値は3バイトめ以降のため、第2引数は、2から指定し、6、10、14とします。flot型は4バイトのため、4つ増加することになります。
タイマーとボタンハンドラー
最後に、タイマーの設定とボタンハンドラーです。
~中略~ readonly IDispatcherTimer _timer; ~中略~ // タイマーの作成(1) _timer = Dispatcher.CreateTimer(); _timer.Interval = TimeSpan.FromSeconds(5); _timer.Tick += (s, e) => StartScan(); ~中略~ // ボタンハンドラー(2) private void OnClicked(object sender, EventArgs e) // タイマーが停止している場合 if (!_timer.IsRunning) { _timer?.Start(); BtnNamet.Text = "停止"; } else { _timer?.Stop(); BtnNamet.Text = "センサーデータ取得"; } }
IDispatcherTimerクラスを利用して、5秒毎にStartScan()が実行されるタイマーを作成します(1)。ボタンハンドラーでは、タイマーの停止、開始と、ボタン名の書き換えを行っています(2)。ボタンを押すたびに、観測値の取得の開始、停止が切り替わります。
動作の確認
別途ESP32のプログラムを動作させた後、スマホアプリを起動します。

ボタンをクリックした後、観測値が表示されるはずです。停止を押すまで、定期的に観測値が更新されます。

最後に
3回にわたって、環境データをモニタリングするプログラムを作成しました。C#でも、ESP32の制御やスマホアプリの開発が手軽に実現できることをお伝えできたかと思います。
今回で連載はいったん終了となります。本連載を通じて、.NET nanoFrameworkでマイコンモジュールを制御する楽しさや可能性を感じていただけたなら幸いです。