CentralはBluetooth Low Energyアーキテクチャにおいて、スキャンを開始し、接続を確立し、ペリフェラルデバイスとのデータ交換を管理するデバイスです。モバイル開発の文脈では、CentralはiOSまたはAndroidのスマートフォンやタブレットであり、BLEセンサー、フィットネストラッカー、スマートアクセサリに接続します。Bluetooth Core Specification 5.4(2023)によると、Centralは最大7つの異なるPeripheralとの同時接続をサポートできますが、実際の制限はチップメーカーとOSバージョンによって異なります。iOSのCore BluetoothとAndroidのandroid.bluetooth.leは、Centralロールを管理するための完全なAPIを提供します。
重要なポイント
CentralはBluetooth Low EnergyアーキテクチャにおけるGATTクライアントであり、すべての通信を開始します。受動的に接続を待ち、サービスをアドバタイズするPeripheralとは異なり、Centralは能動的に電波をスキャンし、アドバタイジングパケットを発見して接続を開始します。
非対称なCentral-PeripheralモデルはBLEの基本的な特徴です。Centralは相互作用のロジックを管理します。どのデバイスに接続するか、どのサービスを探索するか、どの特性を読み書きするかを決定します。Peripheralはデータサーバーとして機能し、サービスと特性を保存しますが、接続は開始しません。
Bluetooth Core Specification 5.4(2023)によると、デバイスはCentralとPeripheralの両方(デュアルロール)として同時に機能できます。たとえば、スマートフォンはフィットネスバンドのCentralとして、またファイルを転送する別のスマートフォンのPeripheralとして機能できます。ただし、両方のロールで同時に動作すると、消費電力と接続管理の複雑さが増加します。
モバイル開発エコシステムでは、Centralロールが最も一般的なシナリオです。スマートフォンのアプリはBLEデバイス(センサー、ヘッドフォン、バンド)を検索し、接続してデータを受信します。開発者はオペレーティングシステムのAPIを使用してCentralを操作します。iOSではCBCentralManager、AndroidではBluetoothLeScannerとBluetoothGattを使用します。
スキャンはCentralの動作の第一段階です。デバイスはBLE無線チャンネル(37、38、39)をリッスンして、Peripheralが定期的に送信するアドバタイジングパケットを検出します。各アドバタイジングパケットには、デバイス名、Service UUIDのリスト、カスタムデータが含まれています。
Centralは2つのスキャンモードで動作できます。パッシブスキャン(アドバタイジングパケットの受信のみ)とアクティブスキャン(スキャン応答を介して追加データを取得するためのスキャン要求の送信)です。パッシブスキャンは省電力ですが、得られる情報は少なくなります。アクティブスキャンでは、デバイス名や完全なサービスリストを含む、アドバタイジングパケットの完全なデータを取得できます。
UUIDによるフィルタリングは重要な最適化です。Centralは特定のService UUIDを持つデバイスのみをスキャンし、残りを無視できます。これにより、電力が節約されるだけでなく、アプリケーションのロジックも簡素化されます。デリゲートは関連するデバイスのみを受信します。
import CoreBluetooth
class BLECentralManager: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager = CBCentralManager(
delegate: self,
queue: nil
)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(
withServices: nil,
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
}
接続管理はCentralの主要な責任です。適切なPeripheralを発見した後、Centralは接続を開始します。BLE接続は、接続間隔、スレーブレイテンシ、スーパービジョンタイムアウトなどのパラメータ交換を含む接続確立手順を通じて確立されます。
接続間隔は、接続後にCentralとPeripheralがデータを交換する頻度を決定します。間隔は7.5ミリ秒から4秒の範囲です。間隔が短いほどスループットは高くなりますが、消費電力も大きくなります。スレーブレイテンシにより、Peripheralは省電力のために複数の接続イベントをスキップできます。スーパービジョンタイムアウトは、応答がない最大時間であり、これを超えると接続が失われたと見なされます。
Centralはデータ交換の完了後に接続を終了する責任があります。BLEデバイスは通常、永続的に接続を維持しません。Centralは接続し、データを取得し、切断します。これはIoTセンサーの標準的なパターンです。Centralがスキャンし、温度センサーを見つけ、接続し、値を読み取り、切断します。
| パラメータ | 範囲 | 目的 | 推奨 |
|---|---|---|---|
| 接続間隔 | 7.5 ms – 4 s | データ交換頻度 | ストリーミング: 30–50 ms、間欠データ: 1–4 s |
| スレーブレイテンシ | 0–499イベント | Peripheralイベントのスキップ | センサー省電力: 4–10 |
| スーパービジョンタイムアウト | 100 ms – 32 s | 接続損失タイムアウト | ほとんどのシナリオ: 6–10秒 |
| MTU | 23–517 バイト | ATTパケットサイズ | 接続時に最大を要求 |
Core Bluetoothは、iOSおよびmacOSでBLEを操作するためのAppleのフレームワークです。CBCentralManagerクラスは、Centralロールを実装するための完全なAPI(スキャン、接続、接続管理)を提供します。iOSでのCentralの操作はデリゲートモデルに基づいています。CBCentralManagerDelegateが状態変更、デバイス発見、接続結果のイベントを受信します。
iOSでのCentralの主要な手順:CBCentralManagerの初期化、Bluetooth状態の確認、スキャンの開始、デリゲートを介した発見デバイスの処理、選択したPeripheralへの接続、サービスと特性の発見、データ交換。
// 発見したPeripheralに接続
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// Peripheralへの参照を保持して接続
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// 接続成功
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOSはバックグラウンドでのBLE動作を制限しています。バックグラウンドでは、アプリはInfo.plistの特定のキーでのみスキャンでき、接続されたデバイスはCentralにデータ変更を通知できます。重要なアプリケーション(医療機器)の場合は、bluetooth-centralキーを使用したバックグラウンドモードを使用してください。
Androidは、BLEデバイスをスキャンするためのBluetoothLeScanner APIと、接続管理のためのBluetoothGattを提供します。Android 5.0(API 21)以降、BluetoothLeScannerは非推奨のstartLeScanを置き換えました。このAPIにはBLUETOOTH、BLUETOOTH_ADMIN、ACCESS_FINE_LOCATIONの権限(Android 10+の場合はACCESS_BACKGROUND_LOCATION)が必要です。
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// スキャンを設定
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// スキャンを開始
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// デバイスに接続
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
Androidでは、スキャン制限を考慮することが重要です。Android 7(API 24)以降、位置情報を使用しないアプリでは、30秒間に5回を超えてスキャンを開始できません。Android 12+では、BLUETOOTH_SCAN、BLUETOOTH_CONNECT、ADVERTISEの権限と、これらの権限のランタイム要求が必要です。
Centralの消費電力は、無線チャンネルを常時スキャンする必要があるため、Peripheralよりも高くなります。CentralはBLEパケットを受信し、処理し、接続を管理し、アプリケーションプロセッサで計算を実行することもよくあります。Bluetooth SIGによると、スキャンの消費電力はモードに応じて30 mAから100 mAの範囲です。
Centralの省電力戦略はいくつかあります。間欠スキャンは最も効果的な方法です。Centralは短いウィンドウ(スキャンウィンドウ)でスキャンし、長い休止(スキャン間隔)を取ります。たとえば、スキャンウィンドウ30 ms、スキャン間隔1000 msの場合、継続的スキャンと比較して消費電力が97%削減されます。
追加の最適化としてUUIDフィルタリングがあります。Centralは関連するアドバタイジングパケットのみを迅速に処理し、残りを無視します。これによりCPU負荷が軽減され、デバイスのバッテリー寿命が延びます。また、目的のデバイスを見つけたらすぐにスキャンを停止し、必要以上に接続を維持しないことをお勧めします。
よくある質問
はい、BLEはデュアルロールをサポートしています。デバイスは一部のデバイスに対してCentralとして、他のデバイスに対してPeripheralとして同時に機能できます。たとえば、スマートフォンがセンサーからデータを読み取り(Centralとして)、同時に別のデバイスにデータを送信するために自身のサービスをアドバタイズ(Peripheralとして)できます。
BLE仕様では、1つのCentralに対して最大7接続の制限を定めています。実際には、制限はチップメーカーによって異なります。Nordic nRF52840チップは最大20接続をサポートしますが、一部の安価なBluetoothアダプターは3〜4接続までしかサポートしません。
理由はさまざまです。センサーがアドバタイズしていない(アドバタイズモードでない)、UUIDフィルターが厳しすぎる、スマートフォンのBluetoothがオフ、必要な権限がない(Androidの位置情報)、またはセンサーが範囲外(屋内では最大10メートルを推奨)などが考えられます。
必ずしも必要ではありません。多くのシナリオでは、接続して読み取るパターンが使用されます。Centralがスキャンし、接続し、必要なデータを読み取り、切断します。常時接続が必要なのは、ストリーミングデータ(脈拍、心電図)やリアルタイムデバイス制御の場合のみです。
スキャンウィンドウ30〜50 ms、スキャン間隔500〜1000 msの間欠スキャンを使用します。UUIDでデバイスをフィルタリングして、関連するアドバタイジングパケットのみを処理します。目的のPeripheralを見つけたらすぐにスキャンを停止してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。