はじめに

こんにちは、iOSエンジニアの白石です。
この度、初めて「​Bluetooth®LE」を使ったiOSアプリ開発に挑戦しました。
それに伴い最も理解に苦戦した、「​Bluetooth®LEデバイスとiOSアプリ間の情報のやり取り」について記事にすることにしました。
ちなみに今回作ったアプリは以下のような電波強度を取得し表示するものです。

「​そもそもBluetooth®LEって何?」
そんな状態から「デバイスと接続して情報を取得するiOSアプリ」を作ることになったら、まず何をしますか?

この記事では「データを取得するまでの流れ」を3STEPで説明します。


STEP 1

Q, そもそもBluetooth®LE(以下、「BLE」と表記します)デバイスはどうやって情報をアプリに渡しているの?

A, BLEデバイスは、アドバタイズという方法で情報を発信しています。
アドバタイズとは、定期的に周囲に対して自分の存在やサービス情報(デバイス名やサービスUUID)を含むアドバタイズパケットを送信することです。
このパケットを受信したセントラルがデバイスとの接続を試みることができます。
接続が完了したらサービス・キャラクタリスティックを探索します。

  • セントラル(Central):BLEの通信において、スキャン・接続などを行う側のデバイス
  • ペリフェラル(Peripheral):BLEの通信において、スキャンで発見される側のデバイス(1つ以上のサービスを提供します)
  • サービス:1つ以上のキャラクタリスティックを持つ
  • キャラクタリスティック:データを持つ
  • 今回はBLEデバイス側がペリフェラルで、スマホ側がセントラルとしています。

STEP 2

Q, CoreBluetoothとは?

A, iOSアプリでBLE通信を行う上で必要不可欠なものが、CoreBluetoothです。
未知の領域で開発を進める際、一体どのライブラリを使うのが正しいのか、そもそもライブラリを使わない方がいいのでは?などと愚かなことを考えてしまいます。
しかしことBluetoothに関しては、iOSの制約により、BLEにアクセスするためにはCoreBluetoothなどAppleが提供する公式APIを使う必要があります。そのためライブラリなしでBLE機能の実装は現実的ではなく、CoreBluetoothまたはラッパーライブラリを利用するのが一般的です。
つまり、BLEにおいてはCoreBluetoothを完璧に理解すればある程度のことは実現できます。

Core Bluetoothについて絶対に押さえておきたい主要なクラスとプロトコル

  1. CBCentralManager: BLEデバイスをスキャン、接続する役割を持つクラスで、BLE全体の管理を担います。ここでデバイスの状態変化(スキャン結果、接続結果など)を受け取ってデリゲートに通知します。
  2. CBCentralManagerDelegate: CBCentralManageのイベントを受け取るためのプロトコルです。
  3. CBPeripheral: BLEデバイス自体を表すクラスです。CBCentralManagerが接続に成功した際にアクセスします。
  4. CBPeripheralDelegate: CBPeripheralのデリゲートで、BLEデバイスとの通信に関するイベントを受け取ります。
  5. CBService: CBPeripheralに属していて、BLEデバイス内の特定の機能や役割を表します。
  6. CBCharacteristic: BLEデバイスの各サービス内にあるデータを表します。

STEP 3

BLEとCoreBluetoothについて理解したところで、実際のCodeの流れを見ていきます。

このように、CBCentralManagerやCBPeripheralが通知する、トリガーとなる動作・状態変化に連動してプロトコルのメソッドが呼ばれ、都度データを取得します。


さいごに

ここまで読んでいただきありがとうございます。
SwiftUIでBLEデバイスに接続し、情報を取得する流れが何となく理解できたでしょうか?
今回作ったアプリでは特定のサービスUUIDのデバイスのみをスキャンし、いくつかのキャラクタリスティックを取得するだけのものでした。
次の目標は、API接続をしてデバイスのFWをアップデートすることです。
 

SNS SHARE