Bluetooth Low Energy (BLE) は、最小限の消費電力で少量のデータを転送するために最適化された無線通信規格です。Bluetooth SIG、2025によると、この技術は世界中で50億台以上のデバイスで使用されています。GATT(Generic Attribute Profile)は、データをService → Characteristic → Descriptorの階層に整理し、これがiOSおよびAndroidのすべてのBLEアプリケーションの基盤となっています。
重要ポイント
Bluetooth Low Energy (BLE) は、クライアント-サーバーモデルで2つの役割(Central(モバイルデバイス)とPeripheral(デバイス))で動作します。Centralは電波をスキャンして接続を開始し、Peripheralはデータを送信します。クラシックBluetoothとは異なり、BLEはオーディオストリーム用ではなく、最小限の消費電力で小さなパケットを送信することを目的としています。Bluetooth SIG Core Specification 5.4(2025)によると、BLEはアクティブモードで15 mA未満の電流で最大2 Mbpsの速度をサポートしています。
GATT(Generic Attribute Profile)はBluetooth Low Energyのデータ構造を定義します。Serviceは特性の論理グループです(例:Heart Rate Service 0x180D)。Characteristicは特定の値を持つデータポイントです。Descriptorは特性のメタデータで、通知管理のためのCCCDを含みます。各要素にはUUIDがあり、標準のBluetooth SIGプロファイルでは16ビット、カスタムでは128ビットです。
モバイルアプリケーションにおけるBluetooth Low Energyは、この階層を使用してスマートフォンと周辺機器間のデータ交換を整理します。GATTの正しい理解は、両方のプラットフォームでBLEアプリケーションを開発するための基盤です。開発者は、デバイスのサービスと特性のUUID、および各特性のプロパティ(read、write、notify、indicate)を知っている必要があります。
BLEデバイスは、発見のためにアドバタイジングパケットを送信します。Advertising Dataには、デバイス名、サービスのUUID、RSSI、Manufacturer Specific Dataが含まれます。アドバタイジングパケットのサイズは31バイトに制限されています。追加データを送信するために、Scan Responseが使用されます。これは、中央デバイスが発見後に要求する2番目のパケットです。
iOSでは、Core BluetoothフレームワークがBluetooth Low Energyを担当します。CBCentralManagerはスキャンと接続を管理し、CBPeripheralはリモートBLEデバイスを表します。プロセスは標準的です:CBCentralManagerの初期化、poweredOn状態の確認、scanForPeripheralsの開始、接続、サービスの発見。Core Bluetoothは無線モジュールの電源を自動的に管理し、BLEが使用されていない場合はオフにします。
iOSのモバイル開発におけるBLEでは、バックグラウンドモードを考慮する必要があります。Core Bluetoothのバックグラウンドモードは、プロジェクトのCapabilities(Uses Bluetooth LE accessories)で有効になります。バックグラウンドでは、アプリは特性からの通知を受け取ることができますが、スキャンは制限され、システムはデバイスが移動した場合にのみスキャンを再開します。iBeaconの場合、CLLocationManagerを通じてバックグラウンドスキャンがよりアクティブに機能します。
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("発見: \(peripheral.name ?? "unknown")")
}
}
この例では、CBCentralManagerDelegateがすべてのBLE接続イベントを処理します。centralManagerDidUpdateStateメソッドは、モバイルデバイスでBluetoothが有効かどうかを確認します。初期化が成功すると、スキャンが開始されます。didDiscoverコールバックは、見つかったデバイスごとに呼び出されます。
デバイスを発見した後、connectとdiscoverServicesを呼び出す必要があります。CBPeripheralDelegateは、各ステップを処理するメソッドを提供します:didDiscoverServices、didDiscoverCharacteristics、didUpdateValueFor。各メソッドは非同期で、データはデリゲートコールバックを介して届きます。RSSI(Received Signal Strength Indicator)は信号レベルを示し、値が0に近いほど信号が強いことを意味します。
Androidでは、Bluetooth Low Energyはandroid.bluetoothパッケージを介して実装されます。BluetoothAdapterはすべてのBLE操作のエントリポイントです。BluetoothLeScannerはScanCallbackコールバックでスキャンを開始します。デバイスを発見した後、BluetoothGattが作成され、周辺機器への接続を確立します。BluetoothGattCallbackは、接続、サービスの発見、特性の読み取り、RSSI変更などのイベントを処理します。
AndroidのモバイルアプリケーションにおけるBluetooth Low Energyには、明示的なBLUETOOTH_SCAN、BLUETOOTH_CONNECT、ACCESS_FINE_LOCATIONの各権限が必要です。Android 12以降、権限は分離されています:スキャン用のBLUETOOTH_SCAN、接続用のBLUETOOTH_CONNECT。ACCESS_FINE_LOCATIONは特定のタイプのデバイスをスキャンする場合にのみ必要です。これらの権限がないと、アプリはBLEを利用できません。
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "デバイス: ${device.name}、RSSI: $rssi")
}
}
}
ScanSettingsを使用してスキャンモードを設定できます:バッテリー節約のLOW_POWER、標準タスクのBALANCED、最大発見速度のLOW_LATENCY。ScanFilterは、サービスのUUID、デバイス名、MACアドレスで検索を絞り込みます。フィルタリングにより消費電力が削減され、目的のデバイスの発見が高速化されます。
connectGattでBluetoothGattを作成した後、アプリはdiscoverServicesを呼び出します。BluetoothGattCallbackには、onServicesDiscovered、onCharacteristicRead、onCharacteristicChangedが含まれます。特性の変更に関する通知を受け取るには、setCharacteristicNotificationを呼び出す必要があります。このプロセスは注意が必要で、各GATT操作は非同期であり、結果は個別のコールバックで返されます。
iBeaconは、UUID、Major、Minorを送信するBLEビーコンのためのAppleの技術です。ビーコンデバイスはアドバタイジングパケットをブロードキャストし、モバイルアプリケーションはこのデータに基づいて位置と距離を特定します。iOSでは、iBeaconはCLLocationManagerを通じてネイティブにサポートされています。Androidでは、サードパーティのライブラリ(AltBeaconやAndroid iBeacon Libraryなど)が必要です。
Bondingは、BLEデバイス間で永続的な安全な接続を作成する手順です。Bonding後、暗号化キーが保存され、デバイスが再び近づくと自動的に接続されます。iOSでは、Bondingはシステムによって自動的に管理されます。Androidでは、BluetoothDevice.createBond()を介して行われます。Bondingは、迅速な再接続が必要なウェアラブルデバイスやフィットネストラッカーにとって重要です。
Advertising Dataは、Bluetooth Low Energyにおける重要な発見メカニズムです。デバイスメーカーは、カスタムデータを送信するためにアドバタイジングパケットにManufacturer Specific Dataを追加できます。パケット形式には、Company Identifier(2バイト)と任意のデータが含まれます。iOSでは、CBCentralManagerはフィルタリングのためにサービスのUUIDの配列を受け入れ、バッテリーを節約します。Androidでは、ScanFilterも同じ原則で動作します。
| パラメータ | iOS(Core Bluetooth) | Android(BluetoothGatt) |
|---|---|---|
| マネージャー | CBCentralManager | BluetoothLeScanner |
| 接続 | connect(to:) | connectGatt() |
| サービス | discoverServices() | discoverServices() |
| 読み取り | readValue(for:) | readCharacteristic() |
| 通知 | setNotifyValue(_:for:) | setCharacteristicNotification() |
| 権限 | 自動 | BLUETOOTH_SCAN、BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager(ネイティブ) | AltBeacon / ライブラリ |
MTU(Maximum Transmission Unit)は、単一のBluetooth Low Energyデータパケットの最大サイズです。デフォルトでは、MTUは23バイト(3バイトのヘッダー+20バイトのデータ)です。MTUを512バイトに増やすと、設定やログを交換する際の転送が大幅に高速化されます。iOSでは、maximumWriteValueLengthで利用可能なMTUを確認できます。Androidでは、MTUを増やすためにrequestMtu()を使用します。
Connection Intervalは、中央デバイスが周辺機器をポーリングする頻度です。間隔が短いほど転送速度は上がりますが、消費電力も増加します。一般的な値は7.5ミリ秒から4秒の範囲です。フィットネストラッカーでは100ミリ秒で十分ですが、オーディオでは7.5ミリ秒が必要です。モバイル開発におけるBLEでは、転送速度とデバイスのバッテリー持続時間のバランスが重要です。
iOSはBackground Modesを通じてバックグラウンドでのBLEをサポートしていますが、制限があります。バックグラウンドのアプリは特性からの通知を受け取りますが、アクティブにスキャンすることはできません。システムはデバイスの位置が変更されたときにスキャンを再開します。Androidでは、バックグラウンドスキャンには永続的な通知を伴うForeground Serviceが必要です。これがないと、モバイルシステムはアプリを最小化した際にプロセスを強制終了します。
モバイルアプリケーションでBLEを確実に動作させるには、次のルールに従ってください。ポーリングではなくnotifyを使用する — 通知付きの特性は変更時にデータを送信し、バッテリーを節約します。接続開始時に最適なMTUを設定します。スキャン時にサービスのUUIDでデバイスをフィルタリングします。異なるモデルでのBLEスタックの互換性を確認します。メーカー(Xiaomi、Huawei、Samsung)はBluetoothの動作に影響を与える変更を加えています。
よくある質問
Bluetooth Low Energy (BLE) は、低消費電力で小さなパケットを定期的に送信するために最適化されています。クラシックBluetoothは、オーディオストリームと大量のデータの継続的な送信のために設計されています。
GATT(Generic Attribute Profile)は、Service → Characteristic → Descriptorの階層を定義するBLEのデータ交換プロトコルです。GATTは、BLEデバイスからのデータの読み取り、書き込み、通知の受信に使用されます。
Android 12より前は、BLEスキャンが位置情報の特定に使用される可能性があったため、Googleはこれらの権限を統合しました。Android 12以降、位置情報とは独立したBLUETOOTH_SCAN権限が導入されました。
AndroidではrequestMtu()、iOSではmaximumWriteValueLengthを使用してMTUを増やします。Connection Intervalも速度に影響し、短いほど転送が高速になります。最適な組み合わせにより、最大10倍の改善が得られます。
Bondingは、BLEデバイス間で永続的な安全な接続を作成する手順です。Bonding後、暗号化キーが保存され、デバイスは繰り返し検索することなく自動的に接続されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。