🏅

Core Bluetoothのベストプラクティス

2024/12/18に公開

非公開となったWWDC17の "What's New in Core Bluetooth" セッション

WWDC17のセッション動画は以下で閲覧可能:

https://developer.apple.com/videos/wwdc2017

・・・のように一見見えますが、実は既に一部の動画は非公開となっておりもう見ることができません。そのうちのひとつが "What's New in Core Bluetooth" です。

2024年のいま、2017年のWhat's Newなんてもう必要ないだろう、と思う人もいるかもしれません [1]

が、Core Bluetoothのようなニッチなフレームワークにとっては、昔のWWDCの発表であれ、それが唯一の一次情報だったりするので、非常に貴重です。

特に、2017年の同セッションは、これまでのWWDCにおいて唯一L2CAPについて言及しているセッションであり、またMTUやEDLにも触れつつ、Core Bluetoothの通信速度に関して事細かに説明してくれているパートもあり、


WWDC17 "What's New in Core Bluetooth" より引用

現在においても非常に有用なセッションです。

スライドは現在でも公開 されており、またトランスクリプトは以下リポジトリにvttファイルとして残されています:

https://github.com/ASCIIwwdc/wwdc-session-transcripts

本記事ではこれらを統合し、WWDC17の同セッションの中でも特に重要だと感じた「Best practices」パートの内容をまとめます。

以下、文章、画像はWWDCの基本的に同セッションからの引用です。適宜要約したり、順序を並び替えたり、見出しを追加したりしています。また日本語訳だけだと伝わりにくいと思われる部分には原文も載せています。


イントロダクション

長年かけて学んできたベストプラクティスのいくつかについてお話したいと思います。

まず最初にご紹介したいのは、Bluetoothアクセサリ設計ガイドラインに従うことです。

公開されているガイドラインには、最高のアクセサリを構築するための多くのデータが含まれています。

これらは必須ではありませんが、長年にわたって私たちが学んできたことであり、同じ落とし穴や問題に陥ることなく、アクセサリの構築に役立つものです。

And if possible, use existing profiles and services.
We've defined our own protocols for things like Notification Center and Apple Media, and the Bluetooth site has a bunch of really good profiles for things like batter updates and device information.

そして、可能であれば、既存のプロファイルやサービスを利用しましょう。

通知センターやApple Mediaなどについては、独自のプロトコルを定義しています。また、Bluetoothサイトには、バッテリー更新やデバイス情報などに関する優れたプロファイルが数多く用意されています。

So if there's already a profile that does what you need, implement that and it will help you get a head start on getting the data you want.

必要な機能を持つプロファイルがすでに存在する場合は、それを実装することで、欲しいデータをいち早く入手できるようになります。

デバイス発見と接続の高速化

A common question we get is, "Why does it take so long to connect to my accessory?" So before your two devices are connected, they're each running on their own timelines.

よくある質問に、"なぜアクセサリーと接続するのに時間がかかるのか?"というものがあります。2つのデバイスが接続される前は、それぞれのタイムラインで動いています。

Your peripheral is going to be advertising things to the world, and your Central is going to be looking for devices that are around.
But each one of these uses small windows, and until those two events line up you can't discover your accessory.

ペリフェラルは世界に向けてアドバタイズし、セントラルは周囲にあるデバイスを探します。

しかし、それぞれが小さなウィンドウを使用しており、この2つのイベントが揃うまで、アクセサリーを発見することはできません。

So the easiest way you can get a quick connection between your two devices or a quick discovery two devices or a quick discovery when you're scanning is to use the shortest advertising interval possible.

そのため、2つのデバイス間で素早く接続したり、2つのデバイスを素早く発見したり、スキャン中に素早く発見したりする最も簡単な方法は、可能な限り短いアドバタイズ間隔を使用することです。

That ensures that no matter what state your central is in, whether it's screen on, screen off, directly in the app, in the background, it will get you the shortest time to find.

これにより、画面のオン・オフ、アプリの起動中・バックグラウンドなど、セントラルがどのような状態にあっても、最短時間で発見できるようになります。

Now using a short advertising interval takes extra battery for your accessory, so you can't do that all the time but what we strongly recommend is if you know through any means necessary, through the user touching the accessory, user picking it up, accelerometer, buttons, use that as an indication to start doing aggressive advertising and then you can go into a lower advertising interval later when you're trying to save battery.

短いアドバタイズ間隔を使用するとアクセサリーのバッテリー消費が増えるため、常時行うわけにはいきませんが、私たちが強くお勧めするのは、ユーザーがアクセサリーに触れたり、手に取ったり、加速度計やボタンを使用したりするなど、何らかの方法で把握できる場合は、それを積極的なアドバタイズを開始する指標として使用し、その後、バッテリーを節約したい場合に、より短いアドバタイズ間隔に変更するという方法です。

If you're trying to save battery, you can go to the Bluetooth Accessory Design Guidelines.

バッテリーを節約したい場合は、Bluetoothアクセサリー設計ガイドラインを参照してください。

We have a whole bunch of power optimized but also discovery time optimize advertising intervals you can use.

電力の最適化だけでなく、発見時間の最適化されたアドバタイズ間隔を多数用意していますので、ご利用いただけます。

デバイスヘの再接続

Another thing that we see is that if you've previously used an accessory and you want to reconnect to that accessory you don't have to scan every time.

もう1つは、以前にアクセサリーを使用したことがあり、そのアクセサリーに再接続したい場合、毎回スキャンする必要がないということです。

If you know that the device is advertising or you just want to connect as quickly as possible, connect directly to the accessory.
If you have the identifier, you can call retrievePeripherals (WithIdentifiers) and directly get a CBPeripheral object that you can connect to.
If you were to scan for your accessory and then connect to it it's actually going to take us twice as long to do that operation as if we could have connected the first time we found it.

デバイスがアドバタイズしていることが分かっている場合や、できるだけ早く接続したい場合は、アクセサリーに直接接続します。

識別子があれば、retrievePeripherals(withIdentifiers:)を呼び出し、接続できるCBPeripheralオブジェクトを直接得ることができます。

アクセサリーをスキャンしてから接続すると、最初に発見したときに接続した場合と比較して、その操作に実際には2倍の時間がかかります。

サービス発見速度の高速化

Something we get asked a lot is why does it take so long to discover the GATT database after I've connected to my accessory?
And in this case there's a couple of things you can do to speed that up.

よく尋ねられる質問のひとつに、アクセサリーに接続した後、GATTデータベースを発見するのになぜこれほど時間がかかるのか、というものがあります。

この場合、スピードアップを図るためにできることがいくつかあります。

The first recommendation we have The first recommendation we have is use as few services or characteristics as possible.

最初にお勧めするのは、サービスやキャラクタリスティックをできるだけ少なくすることです。

Every time you add a service to your GATT Database, that takes extra time over the air that we have to ask for those services and discover those.
So by getting rid of services that you don't need, or packing multiple characteristics into one service, that speeds up your service discovery every time your user connects to your accessory.

GATTデータベースにサービスを追加するたびに、私たちはそれらのサービスを要求し、発見しなければなりません。
そのため、不要なサービスを取り除くか、複数のキャラクタリスティックを1つのサービスに詰め込むことで、ユーザーがアクセサリーに接続するたびに、サービスの発見をスピードアップすることができます。

Another one that's a really simple thing you can do but that helps is group your services by the UUID size.
So if you have multiple 16 bit UUIDs and then a service with 128 bit UUID we can discover all the 16 bit services in one roundtrip instead of having to go back and forth for every service.

もうひとつ、とても簡単なことですが、UUIDサイズ別にサービスをグループ化することもできます。
16ビットのUUIDが複数あり、さらに128ビットのUUIDを持つサービスがある場合、サービスごとに行ったり来たりする代わりに、1回のラウンドトリップで16ビットのサービスをすべて発見することができます。

And then finally to speed up your service discovery, if we can cash your GATT database we actually will, so that on reconnect we don't have to discover anything.

そして最後に、サービス発見をスピードアップするために、もしGATTデータベースをキャッシュすることができれば、再接続時に何も発見する必要がないようにします。

If you're in an Accessory that If you're in an Accessory that requires pairing or bonding, that means that you have to have the service change characteristic in your GATT database.

ペアリングやボンディングを必要とするアクセサリーを使用している場合は、GATTデータベースにService Changedキャラクタリスティックを追加する必要があります。

The Service Change Characteristic is part of the Bluetooth Spec that allows you to tell us when the services and characteristics on your device have changed and when it's safe for us to reuse the last known version of the GATT Database.

Service Change CharacteristicはBluetooth仕様の一部であり、デバイスのサービスやキャラクタリスティックがいつ変更されたか、またGATTデータベースの最終バージョンをいつ再利用しても安全かを教えてくれるものです。

And if you're an Accessory that does not allow pairing or bonding, this means that if you have the Service Changed characteristic we can't cache your database anymore.

ペアリングやボンディングを許可していないアクセサリの場合、Service Changedキャラクタリスティックを持っているとデータベースをキャッシュできなくなります。

So in those cases, if you do not have a Serviced Changed characteristic, we will cache your entire service database which gives you quick reconnections to your device.

Service Changedキャラクタリスティックを持っていない場合は、サービスデータベース全体をキャッシュし、デバイスに素早く再接続できるようにします。

But you have to be careful if you do not support pairing and you want to do things like firmware update.

しかし、ペアリングをサポートしておらず、ファームウェア・アップデートなどを行いたい場合は注意が必要です。

Even if it's a rare event, there's no way for you tell us that the services have changed on your peripheral.

たとえそれがまれな出来事であっても、あなたのペリフェラルのサービスが変更されたことを私たちに伝える方法はありません。

新アクセサリにおける推奨事項

最後に、新しいアクセサリーを作る場合は、常に最新のチップセットを確認することをお勧めします。

私たちがCore Bluetoothを発表して以来、Bluetooth 4.2、そして現在は5.0がリリースされています。
これらのリリースの機能はすべて後方互換性があります。
そのため、Bluetooth 5.0のアクセサリーを作ったとしても、4.0にしか対応していないApple製デバイスと接続することができます。

そして、私が言ったように、アクセサリーのデザインガイドラインに従ってください。
このガイドラインに目を通しておくと、後で面倒な手間を省くことができます。

脚注
  1. おそらくAppleの中の人もそう判断して取り下げたのだと思われる ↩︎

Discussion