かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Xamrin.FormsでBLEのアドバタイズパケットを拾おう(要はビーコン)

ということで、Xamarin.FormsでBLEやってみようと思います。 スキャンして、近くのパケット拾って来るのがゴールくらいにしておきましょう。

BLEを使おうとすると、ネイティブのコードを書かないといけないのですが、幸いにもプラグインのリストにBluetooth LEの文字があります。

github.com

こいつですね。

github.com

www.nuget.org

ということで、Acr.BleパッケージをXamarin.Formsのプロジェクトに追加します。

このAcr.BleですがReactive Extensionsに依存しています。なんてこったいいじゃないですか。 対応Rxのバージョンは2.5なので、Xamarin.Formsでも安心して使えます(最新のRxは.NET Standardじゃないと入らない雰囲気)

Androidのプロジェクトで以下のパーミッションを追加します。

  • Bluetooth
  • BluetoothAdmin
  • AccessCoarseLocation

iOSはplistにこれを追加しておけばいいみたいです。

<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>なんかメッセージ</string>

今回は手抜きで画面には出さずにDebug.WriteLineで表示させるだけにします。Pageに以下のようなコードを追加します。

using System;
using System.Diagnostics;
using System.Reactive.Linq;
using Acr.Ble;
using Xamarin.Forms;

namespace BleDemo
{
    public partial class BleDemoPage : ContentPage
    {
        public BleDemoPage()
        {
            InitializeComponent();

            BleAdapter.Current.Scan().Subscribe(result =>
            {
                Debug.WriteLine($"{result.Device.Name}:{result.Device.Uuid}:{result.Rssi}");
            });
        }
    }
}

これだけ。

これで実行すると以下のような結果が得られます。ちなみにBluetoothをOFFにしてるとScanメソッドがnullを返すみたいなので要注意。

SensorTag:00000000-0000-0000-0000-b4994c6430c4:-59
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-60
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-59
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-58
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-57
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-58
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-60
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-61
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-59

いい感じなのかな。