Swift Playgrounds向けアクセサリ「PlaygroundBluetooth API」を使ってBluetooth LEデバイスと通信をする
WWDC2017で発表されたPlaygroundsBluetooth API便利そう
今年最後のブログになります。
今何してあそんでるかの報告がわりに。
WWDC2017
What’s New in Swift Playgrounds - Apple WWDC 2017
iPad向けのSwift Playgroundsアクセサリとして提供されているPlaygroundBluetoothを使って見ました。CoreBluetoothベースですが、Appleが言うにはより一貫性がある(これはSwift PlaygroundsでのBluetooth通信のユーザエクスペリエンスが一貫していると言う意味だと思います)APIで、以下のコンポーネントを提供しています
PlaygroundBluetooth API
- PlaygroundBluetoothCentralManager(および、そのDelegate)
- Bluetooth機器との接続、通信 (CBCentralManagerに近い)
- PlaygroundBluetoothConnectionView(および、そのDelegate)
- Bluetooth機器の検出、接続、接続解除などのためのUI
特にPlaygroundBluetoothConnectionViewはUIを提供して検出、接続、解除までを一貫してしてくれるので、プログラマによってBluetooth検出、接続、解除時のUIが全く異なり、アプリを使うユーザが途方に暮れる…事は少なくなりそうです。
と言っても2017年12月現在、Appleのページで纏まった資料やサンプルコードが見当たりませんでした。探し方が下手なだけかも知れませんが。
2018年9月更新:AppleのページにPlaygroundBluetooth Frameworkの詳細情報が掲載されています。最新情報はこちらを確認してください。
サンプルコードないかな…
唯一見つけたのが以下のサイト。
https://swiftexample.info/snippet/liveviewswift_bricklife_swift
iPhoneの電池残量が確認できるサンプルコード
なんか途中から全力で生のCoreBluetooth触りにいってるけど大丈夫かこのサンプルコード…。
カスタムプロファイルのペリフェラルとお話しする
これをベースに、カスタムプロファイルを持ったBluetoothペリフェラルに接続し、データをやり取りするターミナルっぽいやつを作りました。
iPadは終始セントラルとして動きます。
- read
- writeWithResponse
- writeWithoutResponse
- notify
キャラクタリスティックに対応します。
ペリフェラル側とその設定が必要です。
今回はセントラル(iPad)からきたデータをWrite(writeWithoutResponse)し、Readに対してはそのデータを返すようにします。(ループバックっぽい動作にする)
いきなりBLEを持ってる組み込みマイコンにさせると、バグったときに切り分けが出来なくなって詰みそうですので、今回はiPhoneにLightBlueアプリをいれて仮想的にペリフェラルとして動かしています。
VirtualPeripheralの提供するサービスは「Blank」を選択し
- Service UUID : 0x1111
- Characteristic UUID : 0x2222
PropertyはReadとWriteWithoutResponseにチェック
そうすると、iPadは以下のように動きます。
Communicate with BLE accessory using PlaygroundBluetooth API