ということで、Xamarin.FormsでBLEやってみようと思います。 スキャンして、近くのパケット拾って来るのがゴールくらいにしておきましょう。
BLEを使おうとすると、ネイティブのコードを書かないといけないのですが、幸いにもプラグインのリストにBluetooth LEの文字があります。
こいつですね。
ということで、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
いい感じなのかな。