BluetoothとBluetooth Low Energyは、短距離データ伝送のためのワイヤレス通信規格です。Bluetooth Classic(BR/EDR)はオーディオやファイルの安定したストリーミングチャネルを提供し、BLEはセンサーや周辺機器とのエネルギー効率の高い動作に最適化されています。Bluetooth SIG、2025年によると、毎年50億以上のBLE対応デバイスが出荷されており、この規格はIoT、ウェアラブル電子機器、モバイルアクセサリーの基盤となっています。
重要ポイント
Bluetoothは、2.4 GHz ISMバンドで動作するワイヤレスパーソナルエリアネットワーク(WPAN)規格であり、最大100メートルの距離でのデバイス通信のために設計されています。IEEE 802.15.1仕様は物理層とMAC層を定義し、Bluetooth SIGスタックは特定のシナリオ(オーディオヘッドセット(HSP)、ファイル転送(OPP)、キーボード入力(HID))のための高レベルプロファイルを定義します。
この規格はバージョン4.0(2010年)以降、2つのブランチに分かれました:Bluetooth Classic(BR/EDR — Basic Rate / Enhanced Data Rate)とBluetooth Low Energy(BLE、旧Bluetooth Smart)です。Classicは連続ストリーム(オーディオ通話、音楽、ファイル)向けに設計されています。BLEは、データが数十秒または数分の間隔を置いて短いパケットで送信されるアプリケーション(心拍数モニター、タグ、温度センサー)向けに作られました。
Bluetooth SIG(2025年)によると、新しいスマートフォンの99%が両方のバージョンをサポートしており、BLEエコシステムはBlood PressureからEnvironmental Sensingまで15以上のプロファイルタイプを誇っています。
ClassicとBLEの選択はシナリオに依存します:オーディオストリーミングにはClassicのみが適しており、1時間に1回センサーをポーリングする場合にはBLEのみが適しています。BR/EDRは1 MHz間隔の79チャネルと適応周波数ホッピング(AFH)を使用し、Wi-Fi干渉に対する耐性を提供します。
| パラメータ | Bluetooth Classic(BR/EDR) | Bluetooth Low Energy(BLE) |
|---|---|---|
| データ転送速度 | 1~3 Mbit/s(EDR) | 125 kbit/s ~ 2 Mbit/s(LE 2M PHY) |
| ピーク電流 | 10~30 mA | 5~15 mA |
| エアタイム | 約100 ms | 約3 ms |
| トポロジー | Piconet(1マスター、最大7スレーブ) | Broadcaster / Observer / Peripheral / Central |
| プロファイル | HFP、A2DP、HSP、SPP、OPP | GATTベース(HRS、BLS、CTSなど) |
| 代表的なデバイス | ヘッドセット、スピーカー、車載ハンズフリー | フィットネストラッカー、タグ、心拍数モニター、IoTセンサー |
| 互換性 | 物理層でBLEと互換性なし | デュアルモードチップが両方のスタックをサポート |
BLE 5.xは、最大1 km(開けた場所)までの到達距離を延ばすLE Coded PHYと、LC3コーデックを使用するLE Audioを追加しました。新しいバージョンは、オーディオシナリオにおけるClassicとBLEの境界を徐々に曖昧にしています。
BLEスタックは3つの層に分かれています:コントローラー(Controller)(物理層とリンク層)、ホスト(Host)(L2CAP、ATT、GATT、セキュリティマネージャー)、アプリケーション(Application)(アプリ内でのプロファイル実装)。この分離により、チップメーカーはファームウェアにコントローラーを実装し、モバイルアプリ開発者はGATT抽象化のみを扱うことができます。
リンク層(LL)はエアタイムを管理します:デバイスはStandby、Advertising、Scanning、Initiating、Connectionの状態を切り替えます。Connected状態では、CentralとPeripheralが接続間隔(データパケットを交換する頻度)について合意します。標準的な間隔は7.5~1000 msです。交換頻度が高いほど、スループットが高くなり、消費電力も大きくなります。
セキュリティマネージャー(SM)は、ペアリングプロトコルを介した鍵交換によるAES-128暗号化を実装します。3つのモードがあります:Just Works(PIN入力なし)、Passkey Entry(画面に6桁のコードを表示)、OOB(NFCまたはQR)です。ウェアラブルデバイスでは通常Just Worksが使用され、医療機器では追加検証付きのOOBが使用されます。
Bluetooth Core Specification 5.4(2023年)によると、LE Secure Connectionsモードでの安全な接続設定時間は、接続間隔30 msで300 msを超えません。
ATT(属性プロトコル)は、サーバー(周辺デバイス)が属性を保存し、クライアント(スマートフォン)がそれらを読み書きする基本的なトランスポートモデルです。GATT(汎用属性プロファイル)は、ATTの上に階層(Service → Characteristic → Descriptor)を構築します。
各サービスは、1つのデバイス機能を記述するキャラクタリスティックの論理グループです:Heart Rate Service(UUID 0x180D)には、通知を制御するClient Characteristic Configuration Descriptor(0x2902)を持つHeart Rate Measurementキャラクタリスティック(UUID 0x2A37)が含まれています。モバイルアプリ開発者はdiscoverServices()を通じてサービスのリストを取得し、UUIDで目的のキャラクタリスティックを見つけて通知を購読します。
BLEは、標準化されたBluetooth SIGサービスには16ビットUUIDを、カスタムメーカーサービスには128ビットUUIDを使用します。例えば、トラッカーケースは、バッテリー充電レベルを送信するためのキャラクタリスティックを持つA000-…サービスを定義できます。
private val gattCallback = object BluetoothGattCallback() {
override fun onServicesDiscovered(
gatt: BluetoothGatt, status: Int
) {
val service = gatt.getService(UUID.fromString("0000180d-0000-1000-8000-00805f9b34fb"))
val char = service?.getCharacteristic(
UUID.fromString("00002a37-0000-1000-8000-00805f9b34fb")
)
gatt.setCharacteristicNotification(char, true)
}
override fun onCharacteristicChanged(
gatt: BluetoothGatt, char: BluetoothGattCharacteristic
) {
val heartRate = char.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 1)
updateUi("心拍数: $heartRate 拍/分")
}
}
この例では、アプリは標準のBluetooth SIG UUIDでHeart Rateサービスを見つけ、心拍数測定キャラクタリスティックを取得し、その通知を購読します。心拍数が変化するたびに、周辺デバイスはCentralからの明示的な要求なしにデータを送信します。
AdvertisingはBLEの重要なメカニズムであり、Peripheralデバイスが3つのプライマリチャネル(37、38、39)で定期的にブロードキャストパケット(advertising PDU)を送信します。中央デバイスはこれらのチャネルをスキャンし、advertisingデータを受信して接続を開始できます。
Advertisingパケットには最大31バイトのペイロードが含まれます:フラグ、TX電力レベル、ローカル名、サービスUUID、メーカー固有データ。これは、接続を確立せずにセンサー測定値を送信するのに十分です(コネクションレスモード、Broadcasterタイプ)。継続的なデータ送信(例:1分に1回の温度)には、最大1000 msの接続間隔での接続が使用されます。
モバイルプラットフォームでは、スキャンはstartScan()(Android)またはscanForPeripherals()(iOS)を介して開始されます。サービスUUIDによるフィルタリングは、表示されているすべてのデバイスを処理しないことでエネルギーを節約します。アプリは関連するタグまたはセンサーのみのコールバックを受け取ります。
import CoreBluetooth
class ScannerViewController: UIViewController {
private var centralManager: CBCentralManager!
override func viewDidLoad() {
centralManager = CBCentralManager(
delegate: self, queue: nil
)
}
func centralManagerDidUpdateState(central: CBCentralManager) {
if central.state == .poweredOn {
centralManager.scanForPeripherals(
withServices: nil, options: nil
)
}
}
func centralManager(
central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber
) {
if let name = advertisementData[CBAdvertisementDataLocalNameKey] {
print("デバイスが見つかりました: \(name)")
}
}
}
デバイスを発見した後、CentralはCBPeripheralオブジェクトを渡してconnect()を呼び出します。接続パラメータ(間隔、レイテンシ、監視タイムアウト)はリンク層レベルでネゴシエーションされます。開発者はこれらを直接管理しませんが、AndroidのrequestConnectionPriorityを介して影響を与えることができます。
両方のモバイルプラットフォームは、BLEを操作するためのネイティブAPIを提供します。Core Bluetooth(iOS)はデリゲートアプローチを使用します。セントラルマネージャーが操作を開始し、周辺オブジェクトがデリゲートメソッドを介して結果を報告します。android.bluetooth(Android)はコールバックインターフェース上に構築されており、複数のデバイスとの並列GATT操作をサポートしています。
プラットフォーム間の主な違い:
Bluetooth SIGのテスト(2024年)によると、スマートフォンとフィットネストラッカーの間のBLE接続時間は、Androidで平均150~300 ms、iOSで100~250 msです。この差は無線周波数モジュール管理ポリシーによるものです。
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BleService {
final FlutterBluePlus fbp = FlutterBluePlus();
Future<void> scanAndConnect(String deviceName) async {
await fbp.startScan(timeout: Duration(seconds: 15));
await for (final result in fbp.scanResults) {
if (result.device.advName == deviceName) {
await fbp.stopScan();
await result.device.connect();
break;
}
}
}
}
Flutter開発者は統一されたAPIインターフェースを取得し、内部ではflutter_blue_plusが呼び出しをネイティブのandroid.bluetoothまたはCore Bluetoothに変換します。このアプローチにより、両方のプラットフォームでBLEペリフェラルを操作するためのアプリ開発時間が短縮されます。
よくある質問
Bluetooth Classic(BR/EDR)は連続ストリーミング(オーディオ通話、音楽、ファイル転送)向けに設計されています。BLEは最小限の消費電力で短いデータパケット(センサー、タグ、フィットネストラッカー)向けに最適化されています。Classicは10~30 mA、BLEはピーク時5~15 mAを消費します。
物理層では互換性がありません。変調方式とチャネルマップが異なります。ただし、最近のほとんどのチップはデュアルモードであり、両方のスタックを実装しています。デュアルモードチップを搭載したスマートフォンは、ClassicヘッドセットとBLEトラッカーの両方と同時に通信できます。
接続間隔とは、確立された接続内での2つのデータパケット間の時間です。値は7.5 msから4秒の範囲です。間隔が短いほど、スループットが高くなり消費電力も大きくなります。1分に1回報告する温度センサーでは、1000 msの間隔が使用されます。
ペアリングはCentralとPeripheral間の暗号化鍵の交換プロセスです。BLEは3つの方法をサポートしています:Just Works(確認なし)、Passkey Entry(画面にPINを入力)、OOB(NFCまたはQRを介した交換)。ペアリング後、デバイスは鍵を保存(ボンディング)し、後続の接続で再認証を要求しません。
最も一般的なもの:心拍数モニター用のHeart Rate Profile(0x180D)、血圧計用のBlood Pressure Profile(0x1810)、温度・湿度センサー用のEnvironmental Sensing(0x181A)、充電レベル用のBattery Service(0x180F)、モデルとシリアル番号用のDevice Information(0x180A)です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。