『Bluetooth Accessory Design Guideline for Apple Products』という、Appleによる公式ドキュメントがあります。Mac や iOS デバイス、iPod 等の Apple 製品の Bluetooth アクセサリの設計についてのガイドラインです。
本記事では、このドキュメントから iOS エンジニアも知っておいた方が良さそうな部分 を抜粋していきたいと思います。
※本記事は、Bluetooth Low Energy Advent Calendar 2014 - Qiita 9日目の記事です。
アドバタイズ間隔
「アドバタイズ開始から少なくとも30秒間は、推奨アドバタイズ間隔である 20 ms を使用すべき」と明記されています。
To be discovered by the Apple product, the accessory should first use the recommended advertising interval
of 20 ms for at least 30 seconds.
で、この最初の30秒間で発見されなければ、バッテリー節約のため下記のより長いアドバタイズ間隔のいずれかを使用することを推奨する、と。
If it is not discovered within the initial 30 seconds, Apple recommends using
one of the following longer intervals to increase chances of discovery by the Apple product:
- 152.5 ms
- 211.25 ms
- 318.75 ms
- 417.5 ms
- 546.25 ms
- 760 ms
- 852.5 ms
- 1022.5 ms
- 1285 ms
ちなみに BLE の規格で定められているアドバタイズ間隔は、最小 20[ms] 〜 最大 10.24[s]の範囲で 0.625[ms]の整数倍 なので、Appleによる「最初の30秒間の推奨アドバタイズ間隔」はBLE規格上の最小間隔でもあります。
iOSエンジニアとしては、このあたりのアドバタイズ仕様を把握しておくと、セントラルとしてふるまうアプリにおいてスキャンをどう行うかの設計や、iBeacon の利用する際に役立つかもしれません。
Connection Parameters
ちょっと不勉強でまだ理解できてないのですが、このあたりの具体的な数値は知っておいた方がよさそうな。勉強して追記します。
The connection parameter request may be rejected if it does not comply with all of these rules:
- Interval Max * (Slave Latency + 1) ≤ 2 seconds
- Interval Min ≥ 20 ms
- Interval Min + 20 ms ≤ Interval Max Slave Latency ≤ 4
- connSupervisionTimeout ≤ 6 seconds
- Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout
If Bluetooth Low Energy HID is one of the connected services of an accessory, connection interval down to
11.25 ms may be accepted by the Apple product.
The Apple product will not read or use the parameters in the Peripheral Preferred Connection Parameters
characteristic
Service Changed Characteristic
そのアクセサリがサービスを変更する可能性のある場合(つまり、GATT を変更する可能性がある場合)は "Service Changed Characteristic" を実装しましょう、と書かれています。
The accessory shall implement the Service Changed characteristic only if the accessory has the ability to change
its services during its lifetime.
アップル製品は、前回読んだ(キャッシュした)情報に依るかどうかを "Service Changed Characteristic" を使って決めますよ、と。
The Apple product may use the Service Changed characteristic to determine if it can rely on previously read
(cached) information from the device.
これの話ですね。
Core Bluetooth でいうと、サービス変更時に CBPeripheralDelegate の `peripheral:didModifyServices:` が呼ばれる、という件ですが、そもそもアクセサリ側で "Service Changed Characteristic" が実装されている必要があります。(実装されてなければ iOS の Bluetooth 設定を off/on してキャッシュクリアする)
Siri
Siriについても書かれているので、あとで読んで追記します。
関連
上原さんのブログにBLE部分を日本語訳したものがまとめられています。