kenichiro246’s blog

主にC#での仕事をしてます。今はAWSに関わり始めました。

(続き)[Xamarin.Forms]Plugin.BLEを使用してペリフェラルの情報を取得する方法

このエントリーは、2017年のQiita アドベントカレンダー(22日)で書いたエントリーの続きです。
今更ですが。。。

概要

今回は、前回組み込んでいなかったDisconnectDeviceAsyncを追加します。
また、接続中のデバイスを切断するだけではネタが少なすぎるので、接続中のデバイスを取得するロジックも組み込んでみましょう。

ソースコード

public PeripheralsPage()
{
    InitializeComponent();

    _BluetoothLe = Plugin.BLE.CrossBluetoothLE.Current;
    _Adapter = _BluetoothLe.Adapter;
    _Adapter.ScanTimeout = 5000;
    _Adapter.DeviceDiscovered += (s, e) =>
    {
        _deviceList.Add(e.Device);
    };
    _Adapter.ScanTimeoutElapsed += (s, e) =>
    {
        foreach (var device in _Adapter.ConnectedDevices)
        {
            _deviceList.Add(device);
        }
    };
    ListView1.ItemsSource = _deviceList;
    AddSearchButton();
}

protected override async void OnAppearing()
{
    base.OnAppearing();

    var devices = _Adapter.ConnectedDevices;
    foreach (var device in devices)
    {
        await _Adapter.DisconnectDeviceAsync(device);
    }
}

解説

  • DisconnectDeviceAsync
    接続中のデバイスを切断するメソッドです。
    今回はどのタイミングで切断するか迷いましたがシンプルなサンプルにしたかったので、OnAppearingで切断するようにしました。
    OnAppearingは画面がロードされた時に発火するイベントであり、ServicesPageから戻ってきた際に、呼び出され、デバイスを切断するようにしています。

  • ConnectedDevices
    接続中のデバイスの一覧を取得するプロパティです。

  • ScanTimeoutElapsed
    StartScanningForDevicesAsync によるスキャンが終わった際に発火するイベントです。
    今回、DeviceDiscovered はアドバタイズ中のペリフェラルしか取得できないので、スキャンが完了後、ConnectedDevices で接続済のペリフェラルを表示するようにしています。
    スキャンはScanTimeoutで5,000ms(5秒)で設定しているため、5秒後に発火することになります。

結果

せっかくなので、DisconnectDeviceAsync しない場合のStatusと、する場合のStatusがどのように変わっているか比較した動きもご確認ください。
自宅のChromecastAudioに接続した場合のStatusの違いを見ていただければわかりやすいと思います。

DisconnectDeviceAsync しない場合

f:id:kenichiro246:20180120125117g:plain

DisconnectDeviceAsync する場合

f:id:kenichiro246:20180120124919g:plain

前回に引き続きBluetooth Low Energyについて書きましたがいかがでしょうか。
良ければStarやコメントをお願いします。