見出し画像

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

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

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

2023年のいま、2017年のWhat's Newなんてもう必要ないだろう、と思う人もいるかもしれない(おそらくAppleの中の人もそう判断して取り下げたのだろう)。

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

特に、2017年の同セッションは、これまでのWWDCにおいて唯一L2CAPについて言及しているセッションであり、

またMTUやEDLにも触れつつ、Core Bluetoothの通信速度に関して事細かに説明してくれているパートもあり、

WWDC17 "What's New in Core Bluetooth" より引用。2019年の同名セッションへの布石となる解説。

2023年の現在においても非常に有用なセッションであると感じた。

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

これらを統合して、WWDC17の同セッションの内容を本記事にまとめておく。

以下、引用表記と画像は同セッションからの引用。また冒頭の挨拶などは適宜カットした。

⚠️ 特に重要だと感じた「L2CAP channels」と「Best practices」を優先したので、今のところIntroduction〜Platform supportはWIPです。


アジェンダ

I think we have some really good stuff to talk to you about today, so we'll start with a brief introduction of where Core Bluetooth is right now.
今日は本当にいい話ができると思いますので、まずCore Bluetoothの現在地について簡単に紹介します。

We'll talk about some of the enhanced reliability features that we built for this year.
まず、Core Bluetoothの現在の状況について簡単にご紹介します。

Talk about platform support.
We announced watchOS support this year and we're really excited about that.
A new feature for this year is L2CAP channels.
Then we'll go over some of the Then we'll go over some of the best practices we've learned over the years, and finally we'll do a real world example of how to get the most out of Core Bluetooth.

プラットフォーム・サポートについて。
今年はwatchOSのサポートを発表しました。
今年の新機能はL2CAPチャンネルです。
そして、私たちが長年にわたって学んできたベストプラクティスのいくつかを紹介し、最後にCore Bluetoothを最大限に活用するための実例を紹介します。

Introduction (WIP)

So I'd like to start with a brief introduction.
Hopefully everybody knows but, if you don't, Core Bluetooth is our framework that we released in 2011 to interact with Bluetooth low energy peripherals and accessories.
And since we initially shipped the framework, we've just seen amazing creativity come out of accessory manufacturers and app developers.

まずは簡単なイントロダクションから始めたいと思います。
Core Bluetoothは2011年にリリースした、Bluetooth low energy周辺機器やアクセサリーと連携するためのフレームワークです。
このフレームワークを出荷して以来、アクセサリーメーカーやアプリ開発者から素晴らしい創造性が生まれています。

We're so pleased to see what you've done with it.
So when we started off, we knew that health and fitness and were going to be big areas.
We've seen lots of things like smart scales, running sensors, fitness devices that you can wear all day.
But the creativity has been awesome to watch.
So things like toys and connected accessories for kids.
We were really excited to see the Swift Playground's announcements this year, and really making things more interactive for children and people who are first learning to people who are first learning to code.
And we love seeing how easy it is for people to take things like sensors or buttons or switches and enable those through their apps and enable them wirelessly.
私たちは、あなたたちが成し遂げたことをとても嬉しく思っています。
私たちがスタートしたとき、健康とフィットネスが大きな分野になることはわかっていました。
スマートな体重計やランニングセンサー、一日中身につけていられるフィットネス機器など、たくさんのものを見てきました。
しかし、その創造性には目を見張るものがあります。
子供向けの玩具やコネクテッド・アクセサリーなどです。
今年のSwift Playgroundの発表には本当に興奮しました。子どもたちや、初めてコードを学ぶ人たちのために、よりインタラクティブなものを作っているのです。
また、センサーやボタン、スイッチのようなものを、アプリを通じてワイヤレスで使えるようにすることがいかに簡単であるかを目の当たりにすることができました。

And then things have gone in directions that we couldn't have even imagined.
Things like connected goggles with head-mounted displays, just awesome creativity that's come out of this community.
So I want to start this talk just by saying thank you.
そして、私たちが想像もしなかったような方向に進んでいます。
ヘッドマウントディスプレイを使ったコネクテッドゴーグルなど、このコミュニティから素晴らしい創造性が生まれています。
だから私は、この話をただありがとうと言うことから始めたい。

(続きはWIP)

Enhanced reliability (WIP)

Platform support (WIP)


L2CAP Channels

New for this year, we're allowing access to L2CAP Channels.
今年の新機能として、L2CAPチャンネルへのアクセスが可能になりました。

So, an L2CAP channel at the lowest level is just this stream of data between two devices, and it's actually the protocol that it's actually the protocol that we use under the covers for all communication between these devices.
最低レベルのL2CAPチャネルは、2つのデバイス間のデータのストリームに過ぎず、実際には、これらのデバイス間のすべての通信に使用されるプロトコルである。

So L2CAP Channels have been used on the platform.
L2CAPチャネルはプラットフォーム上で使用されてきました。

Since day one of Bluetooth this is the first time that we're opening up for your applications to directly talk over these channels.
L2CAPチャンネルは、Bluetoothの初日から使用されており、今回初めて、アプリケーションがこれらのチャンネルで直接会話できるようになりました。

It actually stands for the Logical Link Control and Adaptation Protocol, and the support for dynamically allocated connection or into channels is new for Bluetooth Core Spec 4.1.
L2CAPチャンネルはLogical Link Control and Adaptation Protocolの略で、動的に割り当てられた接続やチャンネルへの接続をサポートするもので、Bluetooth Core Spec 4.1の新機能です。

So unlike all the other interactions that you've done with your accessories before where you have to work through the GATT Database to get your data, L2CAP Channels allow you to open a side channel and directly read and write without any framing limitations, packet size limitations.
そのため、GATTデータベースを経由してデータを入手する必要がある、これまでのアクセサリーとのやり取りとは異なり、
L2CAPチャンネルは、サイドチャンネルを開き、フレームやパケットサイズの制限なしに、直接読み書きすることができます。

It's a direct way to talk between your device and your accessory.
So we think this API is very simple to use.
If you have already connected to a peripheral, all you have to do is call openL2CAPChannel and specify as the PSM, and you'll get a callback data openL2CAPChannel will hand you back the object that represents this channel.
これは、あなたのデバイスとアクセサリーの間で直接会話する方法です。
だから、このAPIはとてもシンプルに使えると思う。
すでにペリフェラルに接続している場合は、openL2CAPChannelをコールしてPSMとして指定するだけだ。

So the PSM is a -- it's the Protocol Service Multiplexer but you should think of it as analogous to say TCP port.
PSMはプロトコル・サービス・マルチプレクサ(Protocol Service Multiplexer)だが、TCPポートと同じようなものだと考えてほしい。

It's just a number that you give to us that uniquely identifies the service you want to open on the peripheral side of the connection.
接続のペリフェラル側で開きたいサービスを一意に識別する番号です。

And what's interesting about this is that there are some profiles that are published by the Bluetooth SIG that have a hard coded PSM.
So if you're trying to do things like the Object Transfer Protocol, the PSM will be known to you even before you connect to the device.
But in every other case, the PSM is unique to the device you're talking to, which means it's locally assigned and can even be locally assigned and can even be reused by other applications.
興味深いのは、Bluetooth SIGが公表しているプロファイルの中には、PSMがハードコードされているものがあるということです。
そのため、Object Transfer Protocolなどを行おうとする場合、PSMはデバイスに接続する前からわかっていることになります。
しかし、それ以外のすべての場合において、PSMはあなたが話しているデバイスに固有であり、ローカルに割り当てられ、他のアプリケーションによって再利用されることさえあります。

So it's important that you discover what PSM to connect to before you try to open it.
What we've done to make this a little bit simpler is we're publishing a UUID that you can use and put within your service to help you specify what PSM to open that's associated with your CB service.
We're also opening L2CAP Channels if you're acting as a peripheral.
ですから、PSMを開こうとする前に、どのPSMに接続するかを発見することが重要です。
CBサービスに関連するどのPSMを開くかを指定するのに役立つUUIDを公開している。
また、ペリフェラルとして動作する場合は、L2CAPチャンネルもオープンする。

So if you want to have a L2CAP Channel that's associated with your service, you can call publishL2CAPChannel and we will return you what PSM was assigned by the system in the callback peripheralManger didPublishL2CAPChannel.
そのため、自分のサービスに関連付けられているL2CAP Channelを持ちたい場合は、publishL2CAPChannelを呼び出せば、コールバックのperipheralManger didPublishL2CAPChannelで、システムによって割り当てられたPSMを返してくれる。

Another thing we've allowed is we allow you to specify whether your L2CAP Channel requires encryption or not.
So most of the time, the safe bet is to say yes, I want bet is to say yes, I want encryption.
It protects you from things like man-in-the-middle attacks, it protects you from things like people eavesdropping on the packets that you're sending between your two devices.
But there are time when you might want to build more advanced types of authentication, like using public key cryptography you could build your own account system and protect your data that way.
もう1つは、L2CAP Channelで暗号化が必要かどうかを指定できるようにしたことだ。
ほとんどの場合、安全なのはYesと言うことだ。
暗号化することで、中間者攻撃(man-in-the-middle attack)や、2つのデバイス間で送信されるパケットを盗聴されることを防ぐことができる。
しかし、より高度な認証システムを構築したい場合もあるでしょう。公開鍵暗号方式を使えば、独自のアカウントシステムを構築し、データを保護することができます。

So let's go through an example of how you would actually negotiate an L2CAP Channel between two devices.
If you're acting as a peripheral, you would ask the system to publish an L2CAP Channel.
Again you get to specify whether this channel requires encryption or not.
In this case we're going to say true.
それでは、実際に2つのデバイス間でどのようにL2CAPチャネルをネゴシエートするのか、例を挙げて説明しよう。
ペリフェラルとして動作する場合、システムにL2CAP Channelの発行を依頼する。
このチャネルに暗号化が必要かどうかを指定する。
この場合はtrueとする。

And when that's successful, you'll get a callback peripheralManager didPublishL2CAPChannel.
And as I mentioned, we'll tell you what PSM has been locally assigned for your service.
これが成功すると、peripheralManager didPublishL2CAPChannelというコールバックが返ってくる。
そして、先ほども述べたように、あなたのサービスにローカルに割り当てられたPSMを伝えます。

So this is your opportunity to make the PSM known to incoming connections so that they can connections so that they can discover what channel to open that's associated with your service.
As a Central, you can read the PSM and that's all the information you need to actually open that channel.
So now you can call openL2CAPChannel with the PSM that you read from the remote device and you'll get the callback didOpenL2CAPChannel.
つまり、これは入ってくるコネクションにPSMを知らせる機会であり、コネクションがあなたのサービスに関連付けられているどのチャネルを開けばいいかを発見できるようにする。
セントラルとして、あなたはPSMを読むことができ、それはあなたが実際にそのチャネルを開くために必要なすべての情報です。
リモートデバイスから読み取った PSM を使って openL2CAPChannel をコールすると、didOpenL2CAPChannel というコールバックが返ってくる。

So CB L2CAP Channel encapsulates all the information you need to know who you're talking to and how you can talk to it.
つまり、CB L2CAPチャネルは、誰とどのように話しているかを知るために必要なすべての情報をカプセル化する。

In this case we tell you the peer, which is either the central or the peripheral on the remote side of the connection.
We tell you what PSM was connected in case you have multiple services that you've published.
And then we just give you an InputStream and OutputStream.
We didn't want to build our own API and make you have to learn how to use a new Read Write API.
We didn't want you to have to adapt your code to deal adapt your code to deal specifically with Bluetooth connections.
If you already know how to deal with the socket and an InputStream and OutputStream, you can deal with an L2CAP Channel.
この場合、リモート側のセントラルかペリフェラルのどちらかであるピア(相手)を示す。
複数のサービスを公開している場合は、どのPSMが接続されたかを知らせます。
そして、InputStreamとOutputStreamを渡します。
独自のAPIを構築して、新しい読み書きAPIの使い方を学ばせるようなことはしたくなかった
また、Bluetooth接続に特化したコードに変更する必要もありません。
ソケットやInputStream、OutputStreamの扱い方を知っていれば、L2CAP Channelを扱うことができる。

So we use all the same stream events that you would get off of, say, a socket after you're connected, and there's bytes available to be read.
You'll get the callback hasBytesAvailable.
If you're writing data and you fill all those queues, you get the same callback you would on a socket of hasSpaceAvailable.
We think this is really powerful because if you already have code that knows how to talk over other network interfaces like Ethernet or Wi-Fi.
That code can be directly adapted to run on top of L2CAP Channels.

つまり、接続が完了し、読み込み可能なバイトがある状態で、ソケットから取得するのと同じストリームイベントを使用する。
hasBytesAvailableというコールバックが返ってくる。
データを書き込んでいて、それらのキューがすべて埋まったら、ソケットと同じコールバックhasSpaceAvailableが返ってきます。

なぜなら、イーサネットやWi-Fiのような他のネットワーク・インターフェイスを介した通信方法を知っているコードがすでにある場合、そのコードをそのまま適応させることができるからだ。
そのコードをそのままL2CAP Channelsの上で実行することができる。

And when the channel has been closed, you get the same endEncountered.Event that you would get.
そして、チャネルが閉じられると、同じようにendEncountered.Eventが発生する。

So after you've opened your connection, you can read data to that connection, you can write to it.
つまり、コネクションをオープンしたら、そのコネクションにデータを読み込んだり、書き込んだりすることができる。

Eventually when it's closed you get the endEncounterd.Event, and it can be closed for a couple of reasons.
最終的にクローズされると、endEncounterd.Event.が発生する、
そして、いくつかの理由でクローズされる。

Closing Channels


So if the overall Bluetooth link So if the overall Bluetooth link is lost we'll tell you that the L2CAP Channel has been closed.
Bluetoothリンク全体が失われた場合、L2CAP Channelがクローズされたことを伝えます。

As the Central side, you can manually ask to close that connection.
セントラル側では、手動で接続を閉じるように要求することができます。

Now on the peripheral side, you can either un-publish the service or if you drop the object and allow it to be deallocated that's an implicit sign to us through Core Bluetooth that you're no longer interested.
That will also close the L2CAP Channel.
ペリフェラル側では、サービスをアンパブリッシュするか、オブジェクトをドロップして割り当て解除を許可することで、Core Bluetoothを通して暗黙のうちに「もう興味がない」というサインを送ることができます。
これにより、L2CAP Channelもクローズされる。

When should you use L2CAP Channels?

So when should you use L2CAP Channels?
では、どのような場合にL2CAP Channelを使うべきか?

In general, if you're already doing well with GATT and your data model fits well into a GATT database, you should continue using that.
GATT makes it very simple to discover your data, to get quick updates.
You don't have to frame any of your data.
So keep using that if that worked for you.
一般的には、既にGATTでうまくいっていて、データモデルがGATTデータベースにうまくフィットしているなら、それを使い続けるべきだ。
GATTを使えば、データを発見し、素早く更新することができる。
データをフレーム化する必要もない。
だから、GATTを使い続けるべきだ。

But if there are times where it was previously hard to make your data fit into the GATT database, data fit into the GATT database, either because you had more data that you could fit into a characteristic, or you're finding that GATT is kind of getting in the way, L2CAP Channels are a great opportunity to get the lowest overhead best performance when talking between your accessories.
しかし、以前はデータをGATTデータベースに適合させるのが困難だった場合、あるいはGATTが邪魔になっていた場合、L2CAPチャネルは、アクセサリ間で通信する際のオーバーヘッドを最小限に抑えることができます。

And if you're doing large data transfers, say like a firmware update, L2CAP Channels are a good opportunity to help you get it there faster.
And if you have a streaming protocol that's already defined somewhere that you want to run between your two devices, L2CAP Channels make that a really natural fit.
また、大容量のデータ転送、例えばファームウェアのアップデートを行う場合、L2CAPチャンネルは、より高速なデータ転送を可能にします。
また、2つのデバイス間で実行したいストリーミング・プロトコルがすでに定義されている場合、L2CAP Channelsを使えば、そのプロトコルに自然にフィットします。

Best Practices

ここから先は

21,712字 / 22画像
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/