1. はじめに
この節は規範的ではありません。
Bluetoothは、デバイス間の短距離無線通信のための標準です。Bluetooth「クラシック」(BR/EDR) は一連のバイナリプロトコルを定義しており、最大約24Mbpsまでの速度をサポートします。 Bluetooth 4.0では「Low Energy」モードが導入され、「Bluetooth Smart」や BLE、あるいは単に LEとも呼ばれます。 このモードは最大約1Mbpsに制限されていますが、デバイスがほとんどの時間送信機をオフにできるようにします。BLEは、 Generic Attribute Profile (GATT) によって提供されるキー/バリューのペアを通じて多くの機能を提供します。
BLEはデバイスが担うことのできる複数の役割を定義しています。 ブロードキャスター と オブザーバー 役割はそれぞれ送信専用・受信専用の用途向けです。 ペリフェラル 役割のデバイスは接続を受け入れることができ、 セントラル 役割のデバイスは ペリフェラルデバイスへ接続できます。
ペリフェラル または セントラル役割で動作するデバイスは、 GATTサーバー をホストでき、 そこでは サービス, キャラクタリスティック, ディスクリプタ の階層を公開します。詳しくは §6.1 GATT情報モデル をご覧ください。この階層はBLEトランスポートを前提に設計されていますが、 GATTプロトコルはBR/EDRトランスポートでも動作可能です。
この仕様の最初のバージョンでは、UA上で
セントラル役割で動作するウェブページが、
BR/EDRまたはLE接続経由で GATTサーバー
に接続できるようにします。
この仕様は[BLUETOOTH42]仕様を参照していますが、
Bluetooth 4.0または4.1のみを実装した機器間の通信もサポートする意図です。
1.1. 例
(省略:ソースコード部分は翻訳不要)
parseHeartRate() は、
heart_rate_measurementのドキュメント
を参照し、DataView
に格納された
BluetoothRemoteGATTCharacteristic
の
value
フィールドから読み取る形で定義できます。
(省略:ソースコード部分は翻訳不要)
onHeartRateChanged()は以下のようなオブジェクトをログ出力するかもしれません
(省略:ソースコード部分は翻訳不要)
心拍センサがenergyExpended フィールドを報告している場合、
ウェブアプリケーションは
heart_rate_control_point
キャラクタリスティックに書き込みを行うことで、その値を0にリセットできます。
(省略:ソースコード部分は翻訳不要)
2. セキュリティに関する考慮事項
§3 プライバシーに関する考慮事項の節を参照してください。 [Issue #575]
3. プライバシーに関する考慮事項
3.1. デバイスアクセスは強力です
ウェブサイトが requestDevice()
を使用してデバイスへのアクセスを要求すると、
呼び出しで指定したすべてのGATTサービスへのアクセス権を得ます。UAはどのような機能がウェブサイトに与えられるか、
デバイスの選択をユーザーに促す前にユーザーへ説明しなければなりません(MUST)。
指定されたサービスの中にUAが認識しないものがあれば、サイトがデバイスの完全制御を取得するリスクがあるものとして
このことをユーザーに告知しなければなりません(MUST)。
また、ユーザーがどのサイトがどのデバイスへアクセス権を持っているかを確認し、
そのペアリングを取り消しできるようにもする必要があります。
UAはウェブサイトに対してデバイスクラス全体のペアリングを許可してはなりません(MUST NOT)。 各デバイスが同じBluetoothレベルの識別情報を送信するようなデバイスクラスを構築することが理論上は可能です。 UAはこの種の偽装を検出することを必ずしも求められず(MAY)、こうした擬似デバイスをウェブサイトとペアリングさせることもできます。
利用者が承認した主体のみが実際にアクセス権を持つことを確保するために、 この仕様ではセキュアコンテキストのみがBluetoothデバイスへアクセスできるよう制限されています。
3.2. 信頼できるサーバでも悪意あるコードを配信する可能性があります
この節は規範的ではありません。
ユーザーがオリジンを信頼していたとしても、そのオリジンのサーバや開発者が侵害されることや、 サイトがXSS攻撃の脆弱性を抱えていることがあります。どちらの場合でも、ユーザーが 悪意あるコードに価値あるデバイスへのアクセス権を与えてしまう可能性があります。オリジンは コンテンツセキュリティポリシー([CSP3])を定義してXSS攻撃リスクを低減すべきですが、 サーバや開発者自体が侵害されている場合にはこれは効果がありません。
§4.1 Permission APIとの連携 で説明されている通り、 ページのリロード後にも許可したデバイスを取得できる機能はこのリスクをさらに増大させます。 サイト侵害中に利用者からアクセス許可を取得する必要がなくなり、利用者が ただ訪れた場合でも過去に許可されたデバイスへのアクセスを攻撃者が得られるためです。 逆に、ページリロード間でもデバイスへのアクセスを維持できるとパーミッションのプロンプト表示回数が減るため、 利用者は表示されたプロンプトによく注意を払う可能性も高まります。
3.3. デバイスへの攻撃
この節は規範的ではありません。
ウェブサイトから送信される通信は、一部デバイスのセキュリティモデルを破る可能性があります。これらのデバイスは、信頼できる リモート機器のOSからのみ通信を受け取る前提で設計されている場合があります。ヒューマンインターフェースデバイス(HID)は顕著な例で、 ウェブサイトとの通信を許可するとそのサイトがキーストロークを記録できるようになります。この仕様には、 ウェブサイトの悪用を防ぐために、そうした脆弱なサービス・キャラクタリスティック・ディスクリプタの GATTブロックリスト が定義されています。
多くのデバイスは無線通信で予期しないデータを受け取ると脆弱になると考えられます。これまでは個々のデバイスごとに 攻撃が必要でしたが、このAPIにより大規模な攻撃が現実味を帯びてきます。この仕様ではこうした攻撃を困難にするために以下の対策を取っています:
-
デバイスクラスではなく個別デバイスでペアリングすることで、デバイスを悪用する前に少なくともユーザーの操作が必要となります。
-
GATT 限定のアクセス(バイトストリーム全体ではなく)とすることで、 悪意あるウェブサイトの多くのデバイス内パーサへのアクセスを防ぎます。
一方、GATTのキャラクタリスティックとディスクリプタの値は依然としてバイト配列であり、 デバイスが想定しない長さや形式を設定できるため、UAは可能な範囲でこれら値の検証が推奨されます。
-
このAPIはBluetoothのアドレスやデータ署名・暗号鍵( 鍵および値の定義)をウェブサイトへ一切公開しません。これによりウェブサイトが無線で送信されるビットパターンを予測しにくくなり、 パケットインパケットインジェクション攻撃 を防ぎます。ただしこれは暗号化リンクでしか有効でなく、すべてのBLEデバイスでサポートされていません。
-
§11.1 Permissions Policyへの統合により、 クロスオリジンiframeがAPIメソッドを使う際はトップレベルドキュメントが明示的に許可する必要があり、不正なBluetoothアクセスの防御になります。
UAはさらにユーザー保護のため、追加の対応を取ることが可能です:
-
ウェブサービスが悪意あるウェブサイトや脆弱デバイスのリストを収集し、UAは悪意サイトから あらゆるデバイスへの、または任意のサイトから脆弱デバイスへのアクセスを拒否できます。
3.4. Bluetoothデバイス識別子
この節は規範的ではありません。
各Bluetooth BR/EDRデバイスは BD_ADDR と呼ばれる固有の48ビットMACアドレスを持ちます。 Bluetooth LEデバイスは少なくとも パブリックデバイスアドレス か スタティックデバイスアドレス のいずれかを持ちます。 パブリックデバイスアドレス はMACアドレスです。 スタティックデバイスアドレスは再起動ごとに再生成される場合があります。 BR/EDR/LEデバイスはBD_ADDRと パブリックデバイスアドレス (Read BD_ADDR Commandで指定)に同じ値を使います。
LEデバイスはさらに一意な128ビットの Identity Resolving Key を持つ場合があり、 ボンディング時に信頼済みデバイスへ送信されます。恒久的な識別子の漏洩を避けるため、LEデバイスはスタティックまたは パブリックアドレスの代わりにランダムなリゾルバブル/ノンリゾルバブル プライベートアドレスでスキャンやアドバタイズを行う場合があります。 これらは定期的(約15分ごと)に再生成されますが、ペア済みデバイスは保存している IRK が与えられたリゾルバブルプライベートアドレスに一致するかを Resolvable Private Address Resolution Procedureで 判別できます。
各Bluetoothデバイスは人間が読める Bluetoothデバイス名 も持ちます。 これは一意である保証はありませんが、デバイス種類によっては一意となることもあります。
3.4.1. リモートBluetoothデバイスの識別子
この節は規範的ではありません。
ウェブサイトがいずれかの恒久的なデバイスIDを取得できる場合、それらを活用し周囲のデバイスを大規模にカタログ化することで 利用者の位置を割り出すことができます。また、同じBluetoothデバイスを2つの異なるウェブサイトで ペアリングした場合、そのユーザーが同一人物であることも特定可能です。 一方、多くのGATTサービスが指紋採取に利用できるため、デバイス側が意図的にカスタムGATTサービスを用いた 匿名化を簡単に行うこともできます。
この仕様は 注記 で、 スクリプトが同じデバイスかどうかを判定できることを利用者が意図していない場合は UAが一つのデバイスに対して異なるデバイスIDを用いることを推奨しており、 サイトによるデバイスアドレス乱用を困難にします。とはいえ、デバイスメーカーが 利用者追跡を補助するような設計を行うことは可能ですが、その分手間がかかります。
3.4.2. UAのBluetoothアドレス
この節は規範的ではありません。
BR/EDRモード、またはLEモード中で プライバシー機能 を用いずにアクティブスキャンしている場合、UAは自身の恒久的IDを周囲のBluetooth無線へ ブロードキャストします。これにより悪意のあるデバイスをエリア中にばらまいて UAの追跡が容易になります。2014-08時点でこの プライバシー機能 を実装していることを 文書化しているプラットフォームは少なく、 本仕様で推奨していても多くのUAでは採用されていない現実があります。 本仕様では ユーザー操作の要求 として UAがウェブサイトによるスキャンをトリガーするにはユーザーの操作が必要と義務付けており スキャンの頻度をある程度抑制していますが、 より多くのプラットフォームで プライバシー機能 をサポートすることが望ましいです。
3.5. Bluetooth利用可能性の暴露
この節は規範的ではありません。
navigator.bluetooth.
はBluetooth無線がユーザーのシステムで利用可能かどうかを(電源の有無にかかわらず)公開します。
また、ユーザーがUAでWeb Bluetoothをブロックした場合も利用可能性に影響します。
一部のユーザーはこれをプライベートだと考えるかもしれませんが、
この情報暴露による実害は想像しづらいです。また、この情報はUAの
フィンガープリント表面をわずかに拡大します。
この関数はgetAvailability()Promise
を返すため、UAが返す値についてユーザーに選択を促すことも理論上できますが、
リスク増加幅が十分に小さいため、ほとんどのUAはプロンプト表示しないと予想されます。
4. デバイス検出
dictionary {BluetoothDataFilterInit BufferSource ;dataPrefix BufferSource ; };mask dictionary :BluetoothManufacturerDataFilterInit BluetoothDataFilterInit {required [EnforceRange ]unsigned short ; };companyIdentifier dictionary :BluetoothServiceDataFilterInit BluetoothDataFilterInit {required BluetoothServiceUUID ; };service dictionary {BluetoothLEScanFilterInit sequence <BluetoothServiceUUID >services ;DOMString name ;DOMString namePrefix ;sequence <BluetoothManufacturerDataFilterInit >manufacturerData ;sequence <BluetoothServiceDataFilterInit >serviceData ; };dictionary {RequestDeviceOptions sequence <BluetoothLEScanFilterInit >filters ;sequence <BluetoothLEScanFilterInit >exclusionFilters ;sequence <BluetoothServiceUUID >optionalServices = [];sequence <unsigned short >optionalManufacturerData = [];boolean acceptAllDevices =false ; }; [Exposed =Window ,SecureContext ]interface :Bluetooth EventTarget {Promise <boolean >getAvailability ();attribute EventHandler ; [onavailabilitychanged SameObject ]readonly attribute BluetoothDevice ?referringDevice ;Promise <sequence <BluetoothDevice >>getDevices ();Promise <BluetoothDevice >requestDevice (optional RequestDeviceOptions = {}); };options Bluetooth includes BluetoothDeviceEventHandlers ;Bluetooth includes CharacteristicEventHandlers ;Bluetooth includes ServiceEventHandlers ;
この仕様で定義されるメソッドは通常非同期に完了し、Bluetooth タスクソースに作業をキューイングします。
Bluetooth
メンバーgetAvailability()
はページに対して、Bluetooth が
利用可能かどうかを通知します。ソフトウェアによって無効化されたアダプターも
利用可能と見なされるべきです。利用可能性の変化(たとえばユーザーが物理的に
アダプターを接続/取り外ししたとき)は
availabilitychanged
イベントで通知されます。
referringDevice
は、ユーザーがこのページを開いた元のデバイス(存在する場合)
へのアクセスを提供します。たとえば Eddystone ビーコンが
URL をアドバタイズし、UA がその URL を開くことをユーザーに許可するケースです。
ビーコンを表す
BluetoothDevice
は
navigator.bluetooth.
を通して利用できます。
referringDevice
getDevices()
は、ユーザーがアクセスを許可した
Bluetooth デバイスをページが取得できるようにします。
requestDevice(options)
は、このオリジンに対し、いずれかのフィルターに一致するが
options.
内の
いずれのフィルターにも一致しない
デバイスへのアクセスをユーザーに求めます(除外フィルターは
filtersoptions.)。
フィルターに一致するために、
デバイスは以下を満たす必要があります:
exclusionFilters
-
該当メンバーが存在する場合、
servicesリスト内の すべての GATT サービス UUID をサポートすること。 -
該当メンバーが存在する場合、
nameと等しい名前を持つこと。 -
該当メンバーが存在する場合、
namePrefixで始まる名前を 持つこと。 -
メーカー固有データを 広告し、その値が該当メンバーが存在する場合に
manufacturerDataのすべての値に一致すること。 -
サービスデータを 広告し、その値が該当メンバーが存在する場合に
serviceDataのすべての値に一致すること。
Manufacturer Specific Data と Service Data はいずれもキーから
バイト配列へのマッピングです。BluetoothDataFilterInit
はこれらの配列をフィルタします。配列は、prefix が存在し、
prefix &
が
次と等しい場合に一致します:
mask。
dataPrefix
& mask
デバイスが接続時に挙動を大きく変える場合(例: 識別用のメーカー固有データの広告を止め、 クライアント側で識別可能な GATT サービスを発見させるなど)、ウェブサイトは 両方の挙動に対応するフィルターを含める必要があるかもしれません。
まれに、サイトが不要なデバイスをフィルタリングするのに十分な識別情報をデバイスが
広告しない場合があります。その場合、サイトは acceptAllDevices を
true に設定し、
filters
と
exclusionFilters
をすべて省略できます。これにより適切なデバイスの選択責任は完全に
サイトのユーザーに委ねられます。acceptAllDevices
を使用する場合、
optionalServices
に列挙されたサービスのみが利用可能になります。
ユーザーがこのオリジンとペアにするデバイスを選択した後、オリジンは
services
リストに含まれる UUID のいずれかを
options.filters のいずれかの要素、または
options.
に列挙しているサービスにアクセスできます。
また、デバイスの広告データ中の
optionalServicesoptions.
に定義されたメーカーコードのメーカー固有データにもアクセスできます。
optionalManufacturerData
これは、開発者が名前だけでフィルタリングする場合、任意のサービスにアクセスするには
optionalServices
を使用しなければならないことを意味します。
| デバイス | 広告されているサービス |
|---|---|
| D1 | A, B, C, D |
| D2 | A, B, E |
| D3 | C, D |
| D4 | E |
| D5 | <none> |
ウェブサイトが次を呼び出した場合
navigator. bluetooth. requestDevice({ filters: [ { services: [ A, B]} ] });
ユーザーには D1 と D2 を含むダイアログが表示されます。ユーザーが D1 を選ぶと、 ウェブサイトはサービス C と D にアクセスできません。ユーザーが D2 を選ぶと、 ウェブサイトはサービス E にアクセスできません。
一方、ウェブサイトが次を呼び出した場合
navigator. bluetooth. requestDevice({ filters: [ { services: [ A, B]}, { services: [ C, D]} ] });
ダイアログには D1、D2、D3 が含まれ、ユーザーが D1 を選べば、 ウェブサイトは A、B、C、D のサービスにアクセスできます。
その後ウェブサイトが次を呼び出した場合
navigator. bluetooth. getDevices();
結果の Promise
は D1 を含む配列に解決され、
ウェブサイトは A、B、C、D のサービスにアクセスできます。
optionalServices リストは、ユーザーに表示されるダイアログに
デバイスを追加することはありませんが、ユーザーが選択したデバイスから
ウェブサイトが利用できるサービスには影響します。
navigator. bluetooth. requestDevice({ filters: [ { services: [ A, B]} ], optionalServices: [ E] });
D4 は必須サービスを含まないため、D1 と D2 を含むダイアログが表示されます。 ユーザーが D2 を選んだ場合、最初の例と異なり、ウェブサイトは A、B、E の サービスにアクセスできます。
ウェブサイトが再び
navigator. bluetooth. getDevices();
を呼び出すと、結果の Promise
は D1 と D2 を含む配列に解決されます。D1 では A、B、C、D のサービスが、
D2 では A、B、E のサービスが利用可能です。
許可されたサービスは、ユーザーがアクセスを許可した後にデバイスが変化した場合にも
適用されます。たとえば、前の requestDevice() 呼び出しでユーザーが D1 を
選択し、その後 D1 が新しい E サービスを追加した場合、
serviceadded
イベントが発火し、ウェブページはサービス E にアクセスできるようになります。
| デバイス | 広告されているデバイス名 |
|---|---|
| D1 | First De… |
| D2 | <none> |
| D3 | Device Third |
| D4 | Device Fourth |
| D5 | Unique Name |
次の表は、navigator.bluetooth.requestDevice({filters: filters}) に
渡される filters の値ごとに、ユーザーがどのデバイスを選べるかを示します。
| filters | デバイス | 注記 |
|---|---|---|
| D5 | |
| D3, D4 | |
| <none> | D1 は名前の接頭辞のみを広告しているため、完全な名前を一致させようとしても 失敗します。 |
| D1, D5 | |
| D3, D5 |
次の表は、navigator.bluetooth.requestDevice({filters: filters,
exclusionFilters: exclusionFilters}) に渡される
filters および exclusionFilters の値ごとに、
ユーザーがどのデバイスを選べるかを示します。
| filters | exclusionFilters | デバイス |
|---|---|---|
|
| D4 |
|
| D3 |
|
| D3 |
| デバイス | メーカー固有データ | サービスデータ |
|---|---|---|
| D1 | 17: 01 02 03 | |
| D2 | A: 01 02 03 |
次の表は、navigator.bluetooth.requestDevice({filters: filters}) に
渡される filters の値ごとに、ユーザーがどのデバイスを選べるかを示します。
| filters | デバイス |
|---|---|
| D1 |
| D2 |
| D1, D2 |
| <none> |
| D1 |
| <none> |
| D1 |
| D1 |
| <none> |
TypeError
を引き起こします。
すべてのデバイスを受け入れるには、代わりに acceptAllDevices
を使用してください。
| 呼び出し | 注記 |
|---|---|
requestDevice | 無効: フィルターのリストが欠如していると、どのデバイスも受け入れません。 |
requestDevice | 無効: 空のフィルターリストは、どのデバイスも受け入れません。 |
requestDevice | 無効: 空のフィルターはすべてのデバイスを受け入れてしまうため、これも許可されません。 |
requestDevice |
有効: acceptAllDevices
で明示的にすべてのデバイスを受け入れます。
|
requestDevice | 無効: acceptAllDevices
は任意の filters
を上書きしてしまいます。
|
requestDevice | 無効: acceptAllDevices
は任意の exclusionFilters
を上書きしてしまいます。
|
requestDevice | 無効: exclusionFilters
には filters
が必要です。
|
requestDevice |
無効: デバイスを除外するには、exclusionFilters
は空であってはなりません。
|
requestDevice |
無効: namePrefix は、存在する場合、デバイスをフィルタするために空であってはなりません。
|
requestDevice |
無効: manufacturerData
は、存在する場合、デバイスをフィルタするために空であってはなりません。
|
requestDevice |
無効: serviceData
は、存在する場合、デバイスをフィルタするために空であってはなりません。
|
Bluetooth
のインスタンスは、
次の表に示す 内部スロットを持って作成されます:
| 内部スロット | 初期値 | 説明(非規範) |
|---|---|---|
[[deviceInstanceMap]]
|
Bluetooth
デバイスから
インスタンスへの空のマップ。
|
単一のグローバルオブジェクト内で、各 Bluetooth
デバイスを一つの BluetoothDevice
インスタンスのみが表現することを保証します。
|
[[attributeInstanceMap]]
|
Bluetooth キャッシュのエントリから Promise
への空のマップ。
|
これらの Promise
は、BluetoothRemoteGATTService、
BluetoothRemoteGATTCharacteristic、
あるいは
BluetoothRemoteGATTDescriptor
インスタンスのいずれかに解決されます。
|
[[referringDevice]]
|
null
|
Document がデバイスから開かれた場合、Document オブジェクトの初期化中に
BluetoothDevice
に設定されます。
|
referringDevice の
取得は
[[referringDevice]]
を返さなければなりません。
これが起こった場合、Document オブジェクトの初期化の一環として、 UA は次の手順を実行しなければなりません(MUST):
-
ナビゲーションを引き起こしたデバイスを referringDevice とします。
-
BluetoothDevice を取得し、
navigator.bluetooth内で referringDevice を表す オブジェクトを referringDeviceObj とします。 -
前の手順が例外を投げた場合、これらの手順を中止します。
注記: これは、UA がユーザーが現在の realm に referringDevice への アクセスを付与する意図を推論しなかったことを意味します。たとえば、ユーザーが GATT へのアクセスを全体的に拒否している場合などです。 -
navigator.bluetooth.を referringDeviceObj に設定します。[[referringDevice]]
match を返すとき、
filter に 一致する とみなされます:
-
filter.が存在し、かつ device の Bluetooth デバイス名 が 完全一致でnamefilter.nameと等しくない場合、mismatchを返します。 -
filter.が存在し、device の Bluetooth デバイス名 が存在しない、 あるいはnamePrefixfilter.namePrefixで始まらない場合、mismatchを返します。 -
filter.内の各 uuid について、UA が当該デバイスが UUID uuid の プライマリ(含有ではない)サービスをサポートしていることを示す 広告データ、拡張問い合わせ応答、 あるいはサービスディスカバリ応答を受信していない場合、servicesmismatchを返します。 -
filter["内の各 manufacturerData について、 device が メーカー固有データを、manufacturerData"]manufacturerData["と等しい会社識別子コードかつ 一致するデータで広告していない場合、companyIdentifier"]mismatchを返します。 -
filter["内の各 serviceData について、 device が次の条件で サービスデータを広告していない場合、serviceData"]mismatchを返します。すなわち、UUID の 128-bit 形式がserviceData["であり、かつデータが 一致 すること。service"] -
matchを返します。
BluetoothDataFilterInit
filter に 一致 するのは、
以下の手順が match を返す場合です。
-
expectedPrefix を、保持しているバイト列のコピーとした
filter.とします。dataPrefix -
mask を、保持しているバイト列のコピーとした
filter.とします。mask -
data のバイト数が expectedPrefix より少ない場合、
mismatchを返します。 -
mask の各
1ビットについて、data の対応ビットが expectedPrefix の対応ビットと等しくない場合、mismatchを返します。 -
matchを返します。
BluetoothDataFilterInit
filter1 が、BluetoothDataFilterInit
filter2 の
真部分集合であるのは、
以下の手順が true を返す場合です:
-
filter1 の長さが filter2 の長さより短い場合、
falseを返します。 -
byteIndex を
0にします。 -
byteIndex が filter2 の長さ未満の間、次の副手順を実行します:
-
filter1.が filter2.mask[byteIndex] & filter2.mask[byteIndex]mask[byteIndex] と等しくない場合、falseを返します。 -
filter1.がdataPrefix[byteIndex] & filter2.mask[byteIndex]filter2.と等しくない場合、dataPrefix[byteIndex] & filter2.mask[byteIndex]falseを返します。 -
byteIndex を
byteIndex + 1に設定します。
-
-
trueを返します。
getDevices()
メソッドは、
BluetoothPermissionStorage
storage が与えられて呼び出されたとき、次の手順を
実行しなければなりません(MUST):
-
global を、this の 関連付けられたグローバルオブジェクトとします。
-
global の 関連する Document が "bluetooth" という ポリシー制御機能を 使用可能でない場合、 拒否された Promise を
SecurityErrorで返します。 -
promise を 新しい Promise とします。
-
次の手順を並行して実行します:
-
devices を新しい空の
Arrayとします。 -
storage.内の各 allowedDevice について、 allowedDevice@allowedDevices[[device]]を表すBluetoothDeviceオブジェクトを devices に追加します。 -
グローバルタスクをキューし、 Bluetooth タスクソース上で global に与え、resolve により promise を devices で解決します。
注記: devices 内のBluetoothDeviceは、Bluetooth 無線の範囲内にない場合があります。devices 内のある device については、watchAdvertisements()を用いて、device が範囲内にあり広告パケットを 送信しているタイミングを観測できます。device 上でadvertisementreceivedイベント event が発火したとき、event.device.gatt.を呼び出すことで接続が確立できる程度に近いことを示す可能性があります。connect() -
-
promise を返します。
requestDevice(options)
メソッドは、呼び出されたとき、次の手順を実行しなければなりません(MUST):
-
options.が存在し、exclusionFiltersoptions.が存在しない場合、 拒否された Promise をfiltersTypeErrorで返します。 -
options.が存在し、filtersoptions.がacceptAllDevicestrueの場合、あるいはoptions.が存在せず、filtersoptions.がacceptAllDevicesfalseの場合、 拒否された Promise をTypeErrorで返します。注記: これは、filtersとのいずれか一方のみが存在することを強制します。acceptAllDevices:true -
promise を 新しい Promise とします。
-
次の手順を並行して実行します:
-
Bluetooth デバイスを要求し、
options.を、filtersoptions.がacceptAllDevicesfalseの場合に渡し、そうでなければnullを渡します。options.が存在する場合はそれを、なければexclusionFiltersnullを渡し、options.とoptionalServicesoptions.を渡します。結果を devices とします。optionalManufacturerData -
グローバルタスクをキューし、 Bluetooth タスクソース上で、 this の 関連付けられたグローバルオブジェクトに与えて、 次の手順を実行します:
-
前の手順が例外を投げた場合、reject により promise をその例外で拒否し、これらの手順を中止します。
-
devices が空のシーケンスである場合、reject により promise を
NotFoundErrorで拒否し、これらの手順を中止します。 -
Resolve により promise を
devices[0]で解決します。
-
-
-
promise を返します。
BluetoothPermissionStorage
storage、
BluetoothLEScanFilterInit
のシーケンス filters(null の場合はすべてのデバイスが一致可能であることを表す)、
BluetoothLEScanFilterInit
のシーケンス exclusionFilters(除外フィルターが設定されていない場合は null)、
BluetoothServiceUUID
のシーケンス optionalServices、および
unsigned short
のシーケンス optionalManufacturerData:
-
global を、storage の 関連付けられたグローバルオブジェクトとします。
-
document を、global の 関連する Document とします。
-
document が "bluetooth" という ポリシー制御機能を 使用可能でない場合、
SecurityErrorを投げ、これらの手順を中止します。 -
このアルゴリズムが、 関連付けられたグローバルオブジェクトに 一時的なアクティベーションがある間に トリガーされていることを確認し、そうでなければ
SecurityErrorを投げ、これらの手順を中止します。 -
サービス名やエイリアスを UUID に 変換するため、次の副手順を実行します:
-
filters !== null && filters.length === 0の場合、TypeErrorを投げ、これらの手順を中止します。 -
exclusionFilters !== null && exclusionFilters.length === 0の場合、TypeErrorを投げ、これらの手順を中止します。 -
uuidFilters を新しい
Array、 uuidExclusionFilters を新しいArray、 requiredServiceUUIDs を新しいSetとします。 -
filters が
nullの場合、 requiredServiceUUIDs をすべての UUID の集合に設定します。 -
filters が
nullでない場合、filters 内の各 filter について次を実行します:-
canonicalFilter を、 filter を正規化した結果とします。
-
canonicalFilter を uuidFilters に追加します。
-
canonicalFilter.servicesの中身を requiredServiceUUIDs に追加します。
-
-
exclusionFilters が
nullでない場合、 exclusionFilters 内の各 exclusionFilter について 次を実行します:-
canonicalExclusionFilter を、 exclusionFilter を正規化した結果とします。
-
canonicalExclusionFilter を uuidExclusionFilters に追加します。
-
-
optionalServiceUUIDs を
とします。Array.prototype.map.call(optionalServices,BluetoothUUID.getService) -
BluetoothUUID.getService()の呼び出しのいずれかが例外を投げた場合、その例外を投げ、手順を中止します。 -
optionalServiceUUIDs から、 ブロックリストにある UUID を すべて取り除きます。
-
-
descriptor を次のようにします:
{ name: "bluetooth" , filters: uuidFilters optionalServices: optionalServiceUUIDs, optionalManufacturerData: optionalManufacturerData acceptAllDevices: filters!== null , } -
state を、descriptor の permission state とします。
-
state が "
denied" の場合、[]を返し、これらの手順を中止します。 -
UA が次の手順でデバイスを見つけられないことを証明できる場合(例: スキャンに使用できる Bluetooth アダプターが存在しない、またはフィルターがいかなる広告パケットにも一致しえない場合)、UA は
[]を返してこれらの手順を中止しても構いません(MAY)。 -
scanResult を、デバイスをスキャン を global および requiredServiceUUIDs とともに呼び出した結果とします。
-
filters が
nullでない場合、次の副手順を実行します: -
navigable を、document の navigable とします。
-
promptId を、新しい一意の不透明な文字列とします。
実際には、プロンプトが開いている間に
デバイスリストは動的に更新されます。仕様テキストは現在それを反映していませんが、
同じ promptId と最新のデバイスリストでこのイベントが複数回送出される可能性があります。
参照: https://github.com/WebBluetoothCG/web-bluetooth/issues/621.
-
プロンプト更新イベントをトリガーし、 navigable、promptId、scanResult を渡します。
-
scanResult が空であっても、 ユーザーに選択を促すことで scanResult 内のいずれかのデバイスを、descriptor と関連付けて選ばせ、 その結果を device とします。
UA は、uuidFilters に一致しない近傍のデバイスを 選択できるようにしても構いません(MAY)。
注記: UA は各デバイスの人間可読な名前をユーザーに表示するべきです。 この名前が利用できない場合(たとえば、UA の Bluetooth システムが プライバシー有効のスキャンをサポートしていないなど)、UA はユーザーが 関心を示せるようにし、その後プライバシー無効のスキャンを行って 名前を取得できるようにすべきです。 -
削除します: navigable からデバイスプロンプトへのマップ[navigable の navigable id]。
-
UA は device を storage に追加 しても構いません(MAY)。
注記: device を選択することは、おそらくユーザーが当該デバイスを "bluetooth" の 追加の許可データのallowedDevicesリスト(少なくとも 現在の設定オブジェクト)に 表示する意図を持つことを意味します。また、そのmayUseGATTフィールドをtrueにし、 requiredServiceUUIDs と optionalServiceUUIDs の和集合内のすべてのサービスを、 すでに存在しているサービスに加えてそのallowedServicesリストに含め、さらに optionalManufacturerData のメーカーコードをそのallowedManufacturerDataリストに含めることを意味します。 -
device が "
denied" の場合、[]を返し、これらの手順を中止します。 -
UA は、device 内のすべてのサービスで Bluetooth キャッシュを構築 しても構いません(MAY)。この手順でのエラーは無視します。
-
BluetoothDevice を取得し、 例外を伝播させつつ this の内部で device を表す deviceObj を結果とします。
-
[deviceObj]を返します。
BluetoothLEScanFilterInit
filter から返されるのは、次の手順で得られる
BluetoothLEScanFilterInit
です:
-
filter のメンバーが一つも存在しない場合、
TypeErrorを投げて、これらの手順を中止します。 -
canonicalizedFilter を
{}とします。 -
filter.が 存在する場合、次の副手順を実行します:services-
filter.services.length === 0の場合、TypeErrorを投げて、これらの手順を中止します。 -
services を
とします。Array.prototype.map.call(filter.services,BluetoothUUID.getService) -
BluetoothUUID.getService()の呼び出しのいずれかが例外を投げた場合、その例外を投げてこれらの手順を中止します。 -
services 内のいずれかのサービスが ブロックリストにある場合、
SecurityErrorを投げて、これらの手順を中止します。 -
canonicalizedFilter.servicesを services に設定します。
-
-
filter.が 存在する場合、次の副手順を実行します。name-
UTF-8 エンコードした
filter.nameが 248 バイトを超える場合、TypeErrorを投げて、これらの手順を中止します。注記: 248 は、Bluetooth デバイス名における UTF-8 のコード単位の最大数です。 -
canonicalizedFilter.nameをfilter.nameに設定します。
-
-
filter.が 存在する場合、次の副手順を実行します。namePrefix-
filter.namePrefix.length === 0の場合、または UTF-8 エンコードしたfilter.namePrefixが 248 バイトを超える場合、TypeErrorを投げて、これらの手順を中止します。注記: 248 は、Bluetooth デバイス名における UTF-8 のコード単位の最大数です。 -
canonicalizedFilter.namePrefixをfilter.namePrefixに設定します。
-
-
canonicalizedFilter["manufacturerData"]を[]に設定します。 -
filter["が 存在し、かつmanufacturerData"]filter["manufacturerData"].length === 0の場合、TypeErrorを投げて、これらの手順を中止します。 -
filter["内の各 manufacturerData について、次の副手順を実行します:manufacturerData"]-
manufacturerData が ブロックリストにあるメーカー固有データフィルター の場合、
SecurityErrorを投げて、これらの手順を中止します。 -
canonicalizedFilter["manufacturerData"]内にexisting["companyIdentifier"] === manufacturerData["を満たすオブジェクト existing が存在する場合、companyIdentifier"]TypeErrorを投げて、これらの手順を中止します。 -
canonicalizedManufacturerDataFilter を、 正規化した manufacturerData を ECMAScript 値に変換した結果とします。 これが例外を投げた場合、その例外を伝播させてこれらの手順を中止します。
-
canonicalizedManufacturerDataFilter["companyIdentifier"]をmanufacturerData["に設定します。companyIdentifier"] -
canonicalizedManufacturerDataFilter を
canonicalizedFilter["manufacturerData"]に追加します。
-
-
canonicalizedFilter.serviceDataを[]に設定します。 -
filter["が 存在し、かつserviceData"]filter["serviceData"].length === 0の場合、TypeErrorを投げて、これらの手順を中止します。 -
filter["内の各 serviceData について、次の副手順を実行します:serviceData"]-
service を
とします。これが例外を投げた場合、その例外を伝播させてこれらの手順を中止します。BluetoothUUID.getService(serviceData["service"]) -
service が ブロックリストにある場合、
SecurityErrorを投げて、これらの手順を中止します。 -
canonicalizedServiceDataFilter を、 正規化した serviceData を ECMAScript 値に変換した結果とします。 これが例外を投げた場合、その例外を伝播させてこれらの手順を中止します。
-
canonicalizedServiceDataFilter["service"]を service に設定します。 -
canonicalizedServiceDataFilter を
canonicalizedFilter["serviceData"]に追加します。
-
-
canonicalizedFilter を返します。
BluetoothDataFilterInit
filter から返されるのは、次の手順で得られる
BluetoothDataFilterInit
です:
-
filter.が 存在しない場合、dataPrefix を空のバイト列とします。そうでない場合、 次の副手順を実行します:dataPrefix-
dataPrefix を、保持しているバイト列のコピーである
filter.dataPrefixとします。 -
dataPrefix の長さが 0 の場合、
TypeErrorを投げて、これらの手順を中止します。
-
-
filter.が存在する場合、 mask を 保持しているバイト列のコピーであるmaskfilter.maskとします。 そうでない場合、mask を dataPrefix と同じ長さの0xFFバイトの列とします。 -
mask の長さが dataPrefix と同じでない場合、
TypeErrorを投げて、 これらの手順を中止します。 -
{dataPrefix: new Uint8Array(|dataPrefix|), mask: new Uint8Array(|mask|)}を返します。
-
UA が直近に、今回のスキャンで用いる UUID の集合を包含する UUID の集合でスキャンを行っている場合、 その結果を返して、これらの手順を中止してもよいです(MAY)。
-
nearbyDevices を Bluetooth デバイスの集合とし、初期値は UA に 接続されている(ATT Bearer を持つ)デバイスの集合とします。
-
topLevelTraversable を、global の navigable の top-level traversable とします。
-
simulatedBluetoothDevices を空の list とします。
-
topLevelTraversable が シミュレートされた Bluetooth アダプター を持つ場合、 値を取得して得られる シミュレートされた Bluetooth デバイス対応表 の値を simulatedBluetoothDevices とします。
-
UA が LE トランスポートをサポートしている場合、General Discovery Procedure を実行します。ただし、UA は Discoverable Mode フラグが設定されていないデバイスも含めてもよく、検出した Bluetooth デバイスを nearbyDevices に追加します。UA は Privacy Feature を有効にすべきです(SHOULD)。
受動スキャンと Privacy Feature の双方は、 一意で不変なデバイス ID の漏洩を回避します。UA にいずれかの使用を要求すべきですが、 どの OS API もこれらを提供していないようです。さらに Bluetooth では、 Central デバイスに Observation Procedure のサポートが要求されないため、 受動スキャン の利用が難しいです。
-
UA が BR/EDR トランスポートをサポートしている場合、Device Discovery Procedure を実行し、検出した Bluetooth デバイスを nearbyDevices に追加します。
-
result を空の Bluetooth デバイスの集合とします。
-
nearbyDevices および simulatedBluetoothDevices 内の各 Bluetooth デバイス device について、 次の副手順を実行します:
-
device の サポートされる物理トランスポートに LE が含まれ、 かつその Bluetooth デバイス名 が不完全または存在しない場合、 UA は完全な名前を取得するため Name Discovery Procedure を実行すべきです(SHOULD)。
-
device が広告している Service UUIDs と、 Service UUID の集合 の共通部分が空でない場合、 device を result に追加し、これらの副手順を中断します。
注記: BR/EDR デバイスでは、 Extended Inquiry Response において GATT と非 GATT のサービスを区別する方法がありません。サイトが非 GATT サービスの UUID で フィルターした場合、ユーザーはrequestDeviceの結果として選択できるものの、 この API では相互作用手段のないデバイスを選んでしまう可能性があります。 -
UA は device に接続し、Bluetooth キャッシュを構築して、 UUID が Service UUID の集合 に含まれるすべてのサービスを格納してもよいです(MAY)。device の サポートされる物理トランスポートに BR/EDR が含まれる場合、 標準的な GATT 手順に加えて、キャッシュの構築時に Service Discovery Protocol(Searching for Services)を使用してもよいです(MAY)。
注記: 近傍のすべてのデバイスに接続してサービスを発見することは電力を消費し、 Bluetooth 無線の他の利用を遅くする可能性があります。UA は、そのデバイスが有用であると期待できる理由がある場合にのみ、 追加のサービス発見を行うべきです。また UA は、開発者がこの追加発見の挙動に依存しないよう支援すべきです。例えば、 開発者が以前にそのデバイスへ接続しており、UA がそのデバイスの完全なサポートサービス集合を把握しているとします。 この開発者が広告されていない UUID でフィルタした場合、ユーザーの環境ではフィルタにより 除外されるであろうデバイスであっても、ダイアログに含まれることがあります。UA は、 この状況を警告する開発者向けオプションを提供したり、一致判定で広告済みサービスのみに限定する オプションを提供したりできます。
-
Bluetooth キャッシュに、 device 内の既知の存在するサービスのうち、 Service UUID の集合 に 含まれる UUID を持つものが含まれている場合、UA は device を result に追加してもよいです(MAY)。
-
-
スキャンの結果として result を返します。
興味深いデバイスが到達範囲内に入ったときに、 サイトがイベントを受け取れるよう登録する手段が必要です。
BluetoothPermissionStorage
storage に device を追加する際、UA は次の手順を実行します:
-
grantedServiceUUIDs を新しい
Setとします。 -
requiredServiceUUIDs の内容を grantedServiceUUIDs に追加します。
-
optionalServiceUUIDs の内容を grantedServiceUUIDs に追加します。
-
storage.内で、 device がallowedDevicesallowedDevice@と等しい要素 allowedDevice を検索します。見つかった場合は次の副手順を実行します:[[device]]-
allowedDevice.の内容を grantedServiceUUIDs に追加します。allowedServices
見つからなかった場合は次の副手順を実行します:
-
allowedDevice.
deviceIdを、UA が 2 つの Bluetooth 接続が同一デバイスであると判定できる範囲、 かつ ユーザーがその事実をスクリプトに公開したいと望む範囲で 一意の ID とします。
-
-
allowedDevice.
allowedServicesを grantedServiceUUIDs に設定します。 -
allowedDevice.
mayUseGATTをtrueに設定します。
許可された
Bluetooth
デバイスを削除するには、BluetoothPermissionStorage
storage と device が与えられた場合、UA は次の手順を実行します:
-
storage.内で、 device がallowedDevicesallowedDevice@と等しい要素 allowedDevice を検索します。そのような要素が存在しない場合、これらの手順を中止します。[[device]] -
allowedDevice を
storage.から削除します。allowedDevices
4.1. Permission API との統合
[permissions] API は、 ウェブサイトが自身に付与されている権限を照会するための統一的な方法を提供します。
navigator. permissions. query({ name: "bluetooth" ,
...}) を用いて、
リロード後にそれらのデバイスを取得できます。
navigator. permissions. query({ name: "bluetooth" , deviceId: sessionStorage. lastDevice, }). then( result=> { if ( result. devices. length== 1 ) { return result. devices[ 0 ]; } else { throw new DOMException( "Lost permission" , "NotFoundError" ); } }). then(...);
Web Bluetooth API は 強力な機能であり、
name "bluetooth" によって識別されます。
その権限に関するアルゴリズムおよび型は次のとおり定義されます。
- 許可ディスクリプタ型
-
dictionary :BluetoothPermissionDescriptor PermissionDescriptor {DOMString ; // これらは RequestDeviceOptions に一致します。deviceId sequence <BluetoothLEScanFilterInit >;filters sequence <BluetoothServiceUUID >= [];optionalServices sequence <unsigned short >= [];optionalManufacturerData boolean =acceptAllDevices false ; }; - 追加の許可データ型
-
BluetoothPermissionStorageは次のように定義されます。dictionary {AllowedBluetoothDevice required DOMString ;deviceId required boolean ; // allowedServices が "all" の場合、すべてのサービスが許可されることを意味します。mayUseGATT required (DOMString or sequence <UUID >);allowedServices required sequence <unsigned short >; };allowedManufacturerData dictionary {BluetoothPermissionStorage required sequence <AllowedBluetoothDevice >; };allowedDevices AllowedBluetoothDeviceインスタンスは、内部スロット[[device]]を持ち、 そこに Bluetooth device を保持します。 - 追加の許可データの制約
-
allowedDevicesの要素はそれぞれ、 異なる[[device]]と 異なるdeviceIdを持たなければなりません。mayUseGATTがfalseの場合、allowedServicesとallowedManufacturerDataはどちらも[]でなければなりません。注記:deviceIdにより、サイトはある時点で観測したBluetoothDeviceインスタンスが、別の時点(場合によっては異なる realm)で観測した別のBluetoothDeviceインスタンスと同一のデバイスであることを追跡できます。UA は、 "bluetooth" の 追加の許可データ を返す際に、 ユーザーがその追跡を望むか否かを考慮すべきです。例えば、一般にユーザーは、異なる 2 つのオリジンが同一のデバイスとやり取りしていると 知ることを望まず、また通常はオリジンのクッキーを削除した後に一意識別子が 持続することも望みません。
- 許可結果型
-
[
Exposed =Window ]interface :BluetoothPermissionResult PermissionStatus {attribute FrozenArray <BluetoothDevice >; };devices - 許可照会アルゴリズム
-
"bluetooth" の許可を照会するにあたり、
BluetoothPermissionDescriptordesc とBluetoothPermissionResultstatus が与えられた場合、UA は以下を実行しなければなりません(MUST):-
status の 関連付けられたグローバルオブジェクトを global とします。
-
status.を desc の permission state に設定します。state -
status.が "statedenied" の場合、status.devicesを空のFrozenArrayに設定し、これらの手順を中止します。 -
matchingDevices を新しい
Arrayとします。 -
storage(
BluetoothPermissionStorage) を、"bluetooth" の 追加の許可データ(現在の設定オブジェクトに対するもの)とします。 -
storage.allowedDevices内の各 allowedDevice について、 次の副手順を実行します。-
desc.deviceIdが設定されており、allowedDevice.deviceId != desc.deviceIdの場合は、 次の allowedDevice に進みます。 -
desc.filtersが設定されている場合、次の副手順を実行します。-
desc.filters内の各フィルターを、 それを正規化した結果に置き換えます。 これらの正規化のいずれかがエラーを投げた場合、そのエラーを返し、これらの手順を中止します。 -
allowedDevice.が[[device]]desc.filters内の いずれかのフィルターに一致 しない場合、次の allowedDevice に進みます。
-
-
BluetoothDevice を取得して
global.navigator.bluetooth内でallowedDevice.を表すものを得て、その結果を matchingDevices に追加します。[[device]]
注記:desc.optionalServicesおよびdesc.optionalManufacturerDataフィールドは結果に影響しません。 -
-
status.devicesを新しいFrozenArrayとし、 その内容を matchingDevices に設定します。
-
- 許可取り消しアルゴリズム
-
ユーザーが公開する意図のなくなったデバイスへのアクセスを
取り消すために、
UA は以下の手順を実行しなければなりません(MUST):
-
storage(
BluetoothPermissionStorage) を、"bluetooth" の 追加の許可データ(現在の設定オブジェクトに対するもの)とします。 -
現在の realm 内の各
BluetoothDeviceインスタンス deviceObj について、次の副手順を実行します。-
storage.内に、次を満たすallowedDevicesAllowedBluetoothDeviceallowedDevice が存在する場合:-
allowedDevice.が 同一のデバイスであり、 それは[[device]]deviceObj.と同じであること、かつ[[representedDevice]]
この場合、
deviceObj.を[[allowedServices]]allowedDevice.に更新し、次の deviceObj に進みます。allowedServices -
-
それ以外の場合、残りの手順を実行して、deviceObj をそのデバイスから切り離します。
-
deviceObj.gatt.を呼び出します。disconnect()注記: これは deviceObj に対してgattserverdisconnectedイベントを発火します。 -
deviceObj.を[[representedDevice]]nullに設定します。
-
-
4.2. Bluetooth の全体的な利用可否
UA は Bluetooth 無線を搭載していないコンピューター上で動作している場合があります。
requestDevice()
はデバイスを一切発見できないことでこれを扱い、
その結果 NotFoundError
になりますが、ウェブサイト側でもより丁寧に対処できる場合があります。
const bluetoothUI= document. querySelector( '#bluetoothUI' ); navigator. bluetooth. getAvailability() . then( isAvailable=> { bluetoothUI. hidden= ! isAvailable; }); navigator. bluetooth. addEventListener( ' availabilitychanged ' , e=> { bluetoothUI. hidden= ! e. value; });
getAvailability()
メソッドは、
呼び出されたら 新しい promise promise を返し、
次の手順を並行して実行しなければなりません(MUST):
-
global を、this の 関連付けられたグローバルオブジェクトとします。
-
global の 関連する Document が、 "bluetooth" という ポリシー制御機能の 使用を許可されていない場合、グローバルタスクをキューして、 Bluetooth タスクソース上で global に resolve により promise を
falseで解決し、 これらの手順を中止します。 -
ユーザーが当該オリジンに対して本関数の返答を特定の値にするよう UA を構成している場合、その構成済みの値で タスクをキューして resolve により promise を解決し、 これらの手順を中止します。
注記: ユーザーによって Web Bluetooth の許可がブロックされている場合、 UA は resolve により promise をfalseで解決しても構いません。 -
simulatedBluetoothAdapter を、 this の navigable の top-level traversable が持つ シミュレートされた Bluetooth アダプター とします。
-
simulatedBluetoothAdapter が空でない場合、
-
simulatedBluetoothAdapter の adapter state が "absent" であるなら、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 resolve により promise を
falseで解決します。 -
simulatedBluetoothAdapter の LE supported state が
falseの場合、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 resolve により promise をfalseで解決します。 -
それ以外の場合は、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 resolve により promise を
trueで解決します。 -
これらの手順を中止します。
-
-
UA が Bluetooth 無線を備えたシステム上で動作している場合、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 Bluetooth 無線の電源状態に関わらず resolve により promise を
trueで解決します。 -
それ以外の場合は、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 resolve により promise を
falseで解決します。注記: UA が Bluetooth の可用性を判定するために他のシステムへ問い合わせできるよう、 この promise は並行して解決されます。
getAvailability
の promise を false で解決する場合、次の方法で
Bluetooth が再び利用可能になったことを検出して Bluetooth UI を表示できます:
function checkAvailability() { const bluetoothUI= document. querySelector( '#bluetoothUI' ); navigator. bluetooth. getAvailability() . then( isAvailable=> { bluetoothUI. hidden= ! isAvailable; }); } navigator. permissions. query({ name: "bluetooth" }). then( status=> { if ( status. state!== 'denied' ) checkAvailability(); // Bluetooth がブロックされています。PermissionStatus の変化を監視します。 status. onchange= () => { if ( this . state!== 'denied' ) checkAvailability(); }; });
getAvailability()
が返す答えが変更されたなど)、
UA は各 グローバルオブジェクト global に対して、
グローバルタスクをキューし、
Bluetooth
タスクソース上で
次の手順を実行しなければなりません(MUST):
-
変更前に
getAvailability()が返していた値を oldAvailability とします。 -
変更後に
getAvailability()が返す値を newAvailability とします。 -
oldAvailability が newAvailability と同一でない場合、
-
navigator を、global の 関連付けられた
Navigatorとします。 -
bluetooth を、navigator の 関連付けられた
Bluetoothとします。 -
イベントを発火させます。イベント名は
availabilitychanged、 インターフェイスはValueEvent、 対象は bluetooth で、 そのvalue属性を newAvailability に初期化します。
-
[Exposed =Window ,SecureContext ]interface :ValueEvent Event {(constructor DOMString ,type optional ValueEventInit = {});initDict readonly attribute any value ; };dictionary :ValueEventInit EventInit {any =value null ; };
ValueEvent
インスタンスは、
DOM § 2.5 Constructing events
に従って構築されます。
value 属性は、初期化時に設定された値を返さなければなりません。
このような汎用的なイベント型は、 ここではなく [HTML] または [DOM] に属するべきです。
5. デバイスの表現
UA は Bluetooth デバイスのプロパティを複数のレベル(グローバル、オリジンごと、そして グローバルオブジェクトごと)で追跡する必要があります。
5.1. グローバルな Bluetooth デバイスのプロパティ
物理的な Bluetooth デバイスには、UA が受信していない可能性のあるプロパティが保証されている場合があります。これらのプロパティはここでは任意と記述します。
Bluetooth device は次のプロパティを持ちます。任意のプロパティは存在せず、列(sequence)やマップのプロパティは、別途記述がない限り空です。その他のプロパティは既定値が指定されているか、デバイスが導入されるときに指定されます。
-
サポートされる物理トランスポートの集合。BR/EDR と LE の一方または両方を含みます。この集合は一般に、デバイスが発見されたトランスポートおよび Flags Data Type(Advertising Data または Extended Inquiry Response 内)に基づいて埋められます。
-
48 ビットアドレスの複数種のうち 1 つ以上:Public Bluetooth Address、 (ランダムな)Static Address、および解決可能または非解決の Private Address。
-
任意の 128 ビット Identity Resolving Key。
-
任意の部分的または完全な Bluetooth デバイス名。Shortened Local Name の AD データが受信されたが、まだ完全な名前が読み取られていない場合、デバイスは部分名を持ちます。Bluetooth デバイス名は UTF-8 としてエンコードされ、BOM なしの utf-8 デコードアルゴリズムを用いて DOMString に変換されます。
-
任意の ATT Bearer。すべての GATT 通信はこれを介して行われます。ATT Bearer は GAP Interoperability Requirements の「Connection Establishment」で記述される手順により作成されます。切断については [BLUETOOTH42] に完全には明記されていません。
-
Advertising Data または Extended Inquiry Response に含まれる、広告された Service UUIDs のリスト。
-
GATT の Attributes の階層。
UA は、2 つの Bluetooth device が、同一の Bluetooth デバイス(同一デバイス)であると判断すべきです(SHOULD)。それは、それらが同じ Public Bluetooth Address、 Static Address、 Private Address、または Identity Resolving Key を持つ場合、あるいは一方のデバイスの IRK と他方の Private Address(Resolvable)を用いて Resolvable Private Address Resolution Procedure が成功する場合に限ります。ただし、プラットフォーム API はデバイス同一性の判定方法を文書化していないため、UA は別の手順を用いてもかまいません(MAY)。
5.2. BluetoothDevice
BluetoothDevice
インスタンスは、特定の Bluetooth
device を、特定の
グローバルオブジェクト(同等に、特定の
Realm または
Bluetooth
インスタンス)に対して表現します。
[Exposed =Window ,SecureContext ]interface :BluetoothDevice EventTarget {readonly attribute DOMString id ;readonly attribute DOMString ?name ;readonly attribute BluetoothRemoteGATTServer ?gatt ;Promise <undefined >forget ();Promise <undefined >watchAdvertisements (optional WatchAdvertisementsOptions = {});options readonly attribute boolean watchingAdvertisements ; };BluetoothDevice includes BluetoothDeviceEventHandlers ;BluetoothDevice includes CharacteristicEventHandlers ;BluetoothDevice includes ServiceEventHandlers ;dictionary {WatchAdvertisementsOptions AbortSignal ; };signal
BluetoothDevice
属性id は、UA が 2 つの Bluetooth 接続が同一のデバイスであると判断できる範囲、かつユーザーが
その事実をスクリプトに公開することを望む範囲で、デバイスを一意に識別します。
name は当該デバイスの人間可読な名称です。
gatt
は、サイトにその権限がある場合、このデバイスの GATT サーバーと対話する手段を提供します。
forget()
は、ユーザーが付与した当該デバイスへのアクセスを、ページが取り消すことを可能にします。
watchingAdvertisements は、UA
が現在このデバイスからの広告をスキャンし、そのためのイベントを発火している場合に true です。
BluetoothDevice
のインスタンスは、以下の表で説明される
内部スロットとともに作成されます。
| Internal Slot | Initial Value | Description (non-normative) |
|---|---|---|
[[context]]
| <always set in prose> |
この Bluetooth
オブジェクトが返した BluetoothDevice。
|
[[representedDevice]]
| <always set in prose> |
このオブジェクトが表す Bluetooth device。
アクセスが 取り消された場合は null。
|
[[gatt]]
|
新しい BluetoothRemoteGATTServer
インスタンスで、
その device
属性は this に初期化され、
connected
属性は false に初期化されます。
| 変更されません。 |
[[allowedServices]]
| <always set in prose> |
このオリジンに対する本デバイスの
allowedServices
リスト。すべてのサービスが許可されている場合は "all"。たとえば、UA があるオリジンで URL を広告した
referringDevice
上のすべてのサービスへのアクセスをオリジンに許可することがあります。
|
[[allowedManufacturerData]]
| <always set in prose> |
このオリジンに対する本デバイスの
allowedManufacturerData
リスト。
|
[[watchAdvertisementsState]]
| 'not-watching'
|
現在の
watchAdvertisements()
操作の状態を表す文字列列挙。取り得る列挙値は次のとおりです:
|
Bluetooth
インスタンス
context 内で表現するには、UA は次の手順を実行しなければなりません(MUST):
-
storage を、
BluetoothPermissionStorageとし、"bluetooth" の 追加の許可データ(現在の設定オブジェクトについてのもの)とします。 -
storage.の中から、allowedDevicesallowedDevice.が 同一のデバイスである allowedDevice を見つけます。そのようなオブジェクトがなければ、[[device]]SecurityErrorを投げて、これらの手順を中止します。 -
context.
[[deviceInstanceMap]]に device と 同一のデバイスであるキーが存在しない場合、次の副手順を実行します:-
result を、新しい
BluetoothDeviceのインスタンスとします。 -
result の任意フィールドをすべて
nullに初期化します。 -
result.を context に初期化します。[[context]] -
result.を device に初期化します。[[representedDevice]] -
result.idをallowedDevice.に初期化し、deviceIdresult.を[[allowedServices]]allowedDevice.に初期化します。allowedServices -
device に部分的または完全な Bluetooth デバイス名がある場合、
result.nameをその文字列に設定します。 -
result.watchingAdvertisementsをfalseに初期化します。 -
context.
[[deviceInstanceMap]]に、device から result への対応を追加します。
-
-
context.
[[deviceInstanceMap]]のうち、キーが 同一のデバイスである device に対応する値を返します。
gatt
属性の取得は、次の手順を実行しなければなりません(MUST):
-
"bluetooth" の 追加の許可データ(
thisの 関連する設定オブジェクトに対するもの)に、 次を満たすAllowedBluetoothDeviceallowedDevice がallowedDevicesリスト内にあり、 そのallowedDevice.が 同一のデバイス ([[device]]this.に対して)であり、 かつ[[representedDevice]]allowedDevice.がmayUseGATTtrueに等しい場合、this.を返します。[[gatt]] -
それ以外の場合、
nullを返します。
forget()
メソッドは、
呼び出されたとき、新しい promise promise を返し、次の手順を実行しなければなりません(MUST):
-
device を対象の
BluetoothDeviceオブジェクトとします。 -
storage を、現在のスクリプト実行環境における
BluetoothPermissionStorageオブジェクトとします。 -
Remove device from storage を storage に対して実行します。
-
Resolve により promise を解決します。
ユーザーエージェントは関連付けられた watch advertisements manager を持ちます。これは 新しい並列キューの開始の結果です。
watchAdvertisements(options)
メソッドは、呼び出されたとき、新しい promise
promise を返し、
次の手順を実行しなければなりません(MUST):
-
global を、this の関連付けられたグローバルオブジェクトとします。 これは this のものです。
-
options.が存在する場合、次の副手順を実行します:signal-
options.が 中止されている場合、 abort watchAdvertisements をsignalthisで実行し、これらの手順を中止します。 -
以下の中止手順を追加します:
options.に対して。signal-
Abort watchAdvertisements を
thisで実行します。 -
Reject により promise を
AbortErrorで拒否します。
-
-
-
this.が次のいずれかの場合:[[watchAdvertisementsState]]'not-watching'-
-
this.を[[watchAdvertisementsState]]'pending-watch'に設定します。 -
以下の手順をエンキューして watch advertisements manager に追加します。ただし、
this.が[[watchAdvertisementsState]]not-watchingになった場合は中止します:-
UA がこのデバイスの広告をスキャンしていることを保証します。UA は、同一デバイスの「重複した」広告をフィルタすべきではありません(SHOULD NOT)。
-
UA がスキャンの有効化に失敗した場合、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、次の手順を実行し、これらの手順を中止します:
-
this.を[[watchAdvertisementsState]]'not-watching'に設定します。 -
Reject により promise を以下のいずれかのエラーで拒否します:
- UA が広告のスキャンをサポートしていない
- Bluetooth がオフである
- その他の理由
-
-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、以下の手順を実行します。ただし、 次の場合中止します:
this.が[[watchAdvertisementsState]]not-watchingになった場合。-
this.を[[watchAdvertisementsState]]watchingに設定します。 -
this.をwatchingAdvertisementstrueに設定します。 -
Resolve により promise を
undefinedで解決します。
-
-
-
'pending-watch'-
-
Reject により promise を
InvalidStateErrorで拒否します。
-
'watching'-
-
Resolve により promise を
undefinedで解決します。
-
-
中止された場合は、 reject により promise を
AbortErrorで拒否します。
Note:
スキャンは電力を消費するため、ウェブサイトは不要に広告の監視を行わないようにし、可能な限り早く電力消費を停止できるよう
AbortController
を使用すべきです(SHOULD)。
watchAdvertisements
を中止する
ために、
BluetoothDevice
device に対して、次の手順を実行します:
-
this.を[[watchAdvertisementsState]]'not-watching'に設定します。 -
device.をwatchingAdvertisementsfalseに設定します。 -
以下の手順をエンキューして watch advertisements manager に追加します:
-
UA 全体で
BluetoothDeviceのうちwatchingAdvertisementsがtrueに設定されているものがなくなった場合、UA は広告のスキャンを停止すべきです(SHOULD)。それ以外の場合で、thisと同一のデバイスを表すBluetoothDeviceのうちwatchingAdvertisementsがtrueに設定されているものがなくなった場合、UA はこのデバイスのレポートを受信しないようスキャンを再設定すべきです(SHOULD)。
-
watchAdvertisements
を中止する
ために、Bluetooth
bluetooth が与えられたとき、次の手順を実行します:
-
各 device について、 bluetooth.
[[deviceInstanceMap]]内を走査し、次の手順を実行します:-
もし device.
[[watchAdvertisementsState]]がpending-watchまたはwatchingであれば、 abort watchAdvertisements を device で実行します。
-
5.2.1. 可視状態の変更への対応
Bluetooth デバイスのスキャンを開始する操作は、可視な
document においてのみ実行できます。visibility state が
"visible" でなくなったとき、その document
に対する
スキャン操作は中止される必要があります。
-
global を document の 関連付けられたグローバルオブジェクトとします。
-
グローバルタスクをキューし、global を与えて Bluetooth タスクソース上で 次を実行します:
-
navigator を global の 関連付けられた
Navigatorとします。 -
bluetooth を navigator の 関連付けられた
Bluetoothとします。 -
visibilityState が
"visible"でない場合、 すべてのアクティブな watchAdvertisements を中止 する操作を bluetooth 上で実行します。
-
5.2.2. ドキュメントの完全なアクティビティ喪失への対応
Bluetooth デバイスのスキャンを開始する操作は、完全にアクティブな document においてのみ実行できます。 完全なアクティビティを喪失した場合、その document に対するスキャン操作は中止される必要があります。
Document
が
もはや 完全にアクティブではないと判断したとき、次の手順を実行しなければなりません(MUST):
-
global を document の 関連付けられたグローバルオブジェクトとします。
-
グローバルタスクをキューし、global を与えて Bluetooth タスクソース上で 次を実行します:
-
navigator を global の 関連付けられた
Navigatorとします。 -
bluetooth を navigator の 関連付けられた
Bluetoothとします。 -
すべてのアクティブな watchAdvertisements を中止 する操作を bluetooth 上で実行します。
-
5.2.3. 広告イベントへの応答
watchingAdvertisements
が設定された BluetoothDevice
に
advertising event
が到着したとき、
UA は "advertisementreceived"
イベントを配信します。
[Exposed =Window ,SecureContext ]interface BluetoothManufacturerDataMap {readonly maplike <unsigned short ,DataView >; }; [Exposed =Window ,SecureContext ]interface BluetoothServiceDataMap {readonly maplike <UUID ,DataView >; }; [Exposed =Window ,SecureContext ]interface :BluetoothAdvertisingEvent Event {constructor (DOMString ,type BluetoothAdvertisingEventInit ); [init SameObject ]readonly attribute BluetoothDevice device ;readonly attribute FrozenArray <UUID >uuids ;readonly attribute DOMString ?name ;readonly attribute unsigned short ?appearance ;readonly attribute byte ?txPower ;readonly attribute byte ?rssi ; [SameObject ]readonly attribute BluetoothManufacturerDataMap manufacturerData ; [SameObject ]readonly attribute BluetoothServiceDataMap serviceData ; };dictionary :BluetoothAdvertisingEventInit EventInit {required BluetoothDevice ;device sequence <(DOMString or unsigned long )>;uuids DOMString ;name unsigned short ;appearance byte ;txPower byte ;rssi BluetoothManufacturerDataMap ;manufacturerData BluetoothServiceDataMap ; };serviceData
BluetoothAdvertisingEvent
属性device は、この広告を送信した
BluetoothDevice
です。
uuids は、この広告が示す
device
の GATT サーバーがサポートする Service UUID を列挙します。
name は
device
のローカル名、またはその接頭辞です。
appearance は Appearance であり、
gap.appearance
特性で定義される値の一つです。
txPower はデバイスが送信している
送信電力(dBm)です。これは this.txPower - this.rssi としてパスロスを計算するために使用されます。
rssi は、広告が受信されたときの
受信電力(dBm)です。これは this.txPower -
this.rssi としてパスロスを計算するために使用されます。
manufacturerData は、
unsigned short の Company Identifier Code を
DataView
に写像します。
requestDevice ダイアログでこのデバイスを選択できるよう、iBeacon は既知のサービスを含むように
広告をローテーションする必要があります。
var known_service= "A service in the iBeacon’s GATT server" ; return navigator. bluetooth. requestDevice({ filters: [{ services: [ known_service]}] }). then( device=> { device. watchAdvertisements(); device. addEventListener( 'advertisementreceived' , interpretIBeacon); }); function interpretIBeacon( event) { var rssi= event. rssi; var appleData= event. manufacturerData. get( 0x004C ); if ( appleData. byteLength!= 23 || appleData. getUint16( 0 , false ) !== 0x0215 ) { console. log({ isBeacon: false }); } var uuidArray= new Uint8Array( appleData. buffer, 2 , 16 ); var major= appleData. getUint16( 18 , false ); var minor= appleData. getUint16( 20 , false ); var txPowerAt1m= - appleData. getInt8( 22 ); console. log({ isBeacon: true , uuidArray, major, minor, pathLossVs1m: txPowerAt1m- rssi}); });
iBeacon 広告のフォーマットは、Adam Warski による How do iBeacons work? を基にしています。
-
device を、その広告イベントを送信した Bluetooth device とします。
-
UA 内の各
BluetoothDevicedeviceObj について、device がdeviceObj.と 同一のデバイスである場合、 タスクをキューし、deviceObj の 関連する設定オブジェクトの 責任イベントループ上で次の副手順を実行します:[[representedDevice]]-
deviceObj.がwatchingAdvertisementsfalseの場合、これらの副手順を中止します。 -
advertisementreceived イベントを発火し、 当該広告イベントについて deviceObj 上で通知します。
-
BluetoothDevice
deviceObj に対して
advertisementreceived
イベントを発火するには、UA は次の手順を実行しなければなりません(MUST):
-
event を次のようにします
{ bubbles: true , device: deviceObj, uuids: [], manufacturerData: new Map(), serviceData: new Map() } -
adv 内のいずれかのパケットについて 受信信号強度が 利用可能であれば、
event.rssiを dBm 単位のその値に設定します。 -
adv の広告パケットおよびスキャン応答内の各 AD 構造について、 AD タイプに応じて次のステップを実行します:
-
16 ビット Service UUID の不完全な一覧
- 16 ビット Service UUID の完全な一覧
- 32 ビット Service UUID の不完全な一覧
- 32 ビット Service UUID の完全な一覧
- 128 ビット Service UUID の不完全な一覧
- 128 ビット Service UUID の完全な一覧
- 16 ビット Service UUID の完全な一覧
-
列挙された各
uuidについて、それがthis.device.に含まれている場合、[[allowedServices]]uuidをevent.uuidsに追加します。 - 短縮された ローカル名
- 完全な ローカル名
-
AD データを BOM なしの UTF-8 デコードで復号し、
event.nameに設定します。注記: 既存の API ではこの情報を得るために生の広告を読む必要があり、 API にフィールドを追加する前にその有用性のさらなる根拠が必要なため、 名前が完全かどうかは公開しません。 - メーカー固有データ
-
各 16 ビットの Company Identifier Code
manufacturerCodeについて、 それがthis.device.に含まれており、かつメーカー固有データが ブロックリストのメーカー固有データ でない場合、[[allowedManufacturerData]]manufacturerCodeから、メーカー固有データを含むArrayBufferへの写像をevent.manufacturerDataに追加します。 - TX パワーレベル
-
event.txPowerを AD データに設定します。 - サービスデータ
- 16 ビット UUID
- サービスデータ - 32 ビット UUID
- サービスデータ - 128 ビット UUID
- サービスデータ - 32 ビット UUID
-
サービスデータ内の各 UUID
uuidについて、それがthis.device.に含まれている場合、uuid から、サービスデータを含む[[allowedServices]]ArrayBufferへの写像をevent.serviceDataに追加します。 - Appearance
-
event.appearanceを AD データに設定します。 - その他
- 次の AD 構造へ進みます。
-
16 ビット Service UUID の不完全な一覧
-
イベントを発火します。イベント名は "
advertisementreceived" で、BluetoothAdvertisingEventを event で初期化し、isTrusted属性をtrueに初期化して、 deviceObj 上で発火します。
BluetoothAdvertisingEvent
のすべてのフィールドは、最後に初期化または設定された値を返します。
BluetoothAdvertisingEvent(type, init)
コンストラクターは、次の手順を実行しなければなりません(MUST):
-
event を、DOM § 2.5 Constructing events の手順を、
uuids、manufacturerData、 およびserviceDataメンバーを除いて実行した結果とします。 -
init.uuidsが設定されている場合、event.uuidsを、新しいFrozenArrayに初期化し、 その内容をinit.uuids.map(の要素とします。そうでなければ、BluetoothUUID.getService)event.uuidsを空のFrozenArrayに初期化します。 -
init.manufacturerDataの各写像について:-
code を、キーを
unsigned shortに変換した値とします。 -
value を、その値とします。
-
value が
BufferSourceでない場合、TypeErrorを投げます。 -
bytes を、読み取り専用 ArrayBuffer の新しいインスタンスで、 保持しているバイト列のコピーとして value の内容を含むものとします。
-
event.manufacturerData の
[[BackingMap]]に、code からnew DataView(bytes)への写像を追加します。
-
-
init.serviceDataの各写像について:-
key を、キーとします。
-
service を、
BluetoothUUID.を呼び出した結果とします。getService(key) -
value を、その値とします。
-
value が
BufferSourceでない場合、TypeErrorを投げます。 -
bytes を、読み取り専用 ArrayBuffer の新しいインスタンスで、 保持しているバイト列のコピーとして value の内容を含むものとします。
-
event.serviceData の
[[BackingMap]]に、service からnew DataView(bytes)への写像を追加します。
-
-
event を返します。
5.2.3.1. BluetoothManufacturerDataMap
BluetoothManufacturerDataMap
のインスタンスは、
[[BackingMap]]
スロットを持ちます。これは maplike であり、メーカーコードを
メーカーのデータ(DataView
に変換されたもの)へ写像します。
5.2.3.2. BluetoothServiceDataMap
BluetoothServiceDataMap
のインスタンスは、
[[BackingMap]]
スロットを持ちます。これは maplike であり、サービス UUID を
サービスのデータ(DataView
に変換されたもの)へ写像します。
6. GATT の相互作用
6.1. GATT 情報モデル
Profile は純粋に論理的な概念です。Profile の仕様は、その Profile が包含する他の GATT エンティティ間の期待される相互作用を記述しますが、 デバイスがどの Profile をサポートしているかを問い合わせることはできません。
GATT Client は、GATT 手続きの集合を用いて、 デバイス上の Service、Characteristic、Descriptor を発見し相互作用できます。本仕様では Service、Characteristic、Descriptor をまとめて Attribute と呼びます。 すべての Attribute は UUID によって識別される型を持ちます。 各 Attribute はまた、同一の GATT Server 上にある同じ型の他の Attribute と区別する 16 ビットの Attribute Handle を持ちます。 Attribute はその GATT Server 内で、その Attribute Handle によって概念的に順序付けられますが、 プラットフォームのインターフェイスは何らかの順序で属性を提供するものの、その順序が Attribute Handle の順序と一致することは保証しません。
Service は Included Service と Characteristic の集合を含みます。 Included Service は他の Service への参照であり、1 つの Service は複数の別の Service に含まれることがあります。 GATT Server の直下に現れる Service は Primary Services と呼ばれ、 他の Service にのみ含まれている場合は Secondary Services と呼ばれますが、Primary Service が含まれることもあります。
Characteristic は バイト配列である値と、 Descriptor の集合を含みます。 Characteristic の properties に応じて、 GATT Client はその値を読み書きしたり、値が変化したときに通知を受け取るよう登録したりできます。
最後に、Descriptor は (再びバイト配列である)値を含み、それが自身の Characteristic を記述または構成します。
6.1.1. 接続間の永続性
Bluetooth の Attribute
Caching システムは、
bonded なクライアントが 1 回の接続から次の接続にわたって
属性への参照を保存できるようにします。Web Bluetooth は、サイトがアクセス権を持つデバイスに対して
bonded ではない と見なします。つまり、
BluetoothRemoteGATTService、
BluetoothRemoteGATTCharacteristic、
および BluetoothRemoteGATTDescriptor
オブジェクトは 切断時に無効になり、サイトは再接続時に
それらを再取得しなければなりません。
6.1.2. Bluetooth キャッシュ
UA は、あるデバイス上で発見した Service、Characteristic、Descriptor の階層について、
Bluetooth キャッシュを
維持しなければなりません(MUST)。UA は、同じデバイスにアクセスする複数のオリジン間でこのキャッシュを共有してもかまいません(MAY)。
キャッシュ内の各可能なエントリは、known-present(存在が既知)、known-absent(非存在が既知)、あるいは unknown(不明)のいずれかです。
キャッシュは 同一の attribute に対する
2 つのエントリを含んではなりません(MUST NOT)。キャッシュ内の各 known-present エントリは、
それぞれの Bluetooth
インスタンスごとに、
任意の
Promise<、
BluetoothRemoteGATTService>Promise<、
または
BluetoothRemoteGATTCharacteristic>Promise<
インスタンスに関連付けられます。
BluetoothRemoteGATTDescriptor>
serviceA.getCharacteristic(uuid1) 関数を、初期状態で空の
Bluetooth キャッシュに対して呼び出すと、
UA は返される Promise
を満たすために必要なキャッシュエントリを埋めるべく
Discover Characteristics by UUID 手続きを用い、
1 つの Characteristic だけが必要であるためにその手続きを早期終了します。
このとき serviceA 内の UUID uuid1 を持つ最初の Characteristic は known-present となり、
それ以降の同 UUID の Characteristic は unknown のままです。ユーザーが後で
serviceA.getCharacteristics(uuid1) を呼び出した場合、UA は
Discover Characteristics by UUID
手続きを再開または再実行する必要があります。
もし serviceA に UUID uuid1 を持つ Characteristic が 1 つしかなかったことが判明すれば、
それ以降の Characteristic は known-absent となります。
Bluetooth キャッシュ内の known-present エントリには順序があります。 Primary Service はデバイス内で特定の順序で現れ、Included Service と Characteristic は各 Service 内で特定の順序で、 Descriptor は各 Characteristic 内で特定の順序で現れます。順序はデバイス上の Attribute Handle の順序と一致すべきです(SHOULD)が、 デバイスの順序が利用できない場合は UA は別の順序を用いてもかまいません(MAY)。
-
一致するキャッシュ内のすべてのエントリを known-present か known-absent のいずれかにしようと試みます。 その際、[BLUETOOTH42] が 十分な情報が返ると規定している任意の GATT 手続きの並びを使用します。 エラー処理は § 6.7 エラー処理 に記述されているとおりに行います。
-
前の手順がエラーを返した場合、このアルゴリズムからそのエラーを返します。
BluetoothDevice
インスタンス
deviceObj において、ある記述に一致するエントリを
Bluetooth
キャッシュに問い合わせる
には、UA は deviceObj.gatt
の
接続チェックラッパーで
新しい
promise promise を包んで返し、
次の手順を並行して実行します。
-
global を deviceObj の 関連付けられたグローバルオブジェクトとします。
-
記述に一致するエントリで Bluetooth キャッシュを構築します。
-
前の手順がエラーを返した場合、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、reject により そのエラーで promise を拒否し、これらの手順を中止します。
-
記述に一致する known-present のキャッシュエントリの列を entries とします。
-
context を deviceObj.
[[context]]とします。 -
result を新しい列とします。
-
entries の各 entry について:
-
もし context.
[[attributeInstanceMap]]にPromise<BluetoothGATT*>インスタンスが関連付けられていなければ、 entry が Service の場合はBluetoothRemoteGATTServiceを表すオブジェクトを作成し、 Characteristic の場合はBluetoothRemoteGATTCharacteristicを表すオブジェクトを作成し、 Descriptor の場合はBluetoothRemoteGATTDescriptorを表すオブジェクトを作成し、 context.[[attributeInstanceMap]]に entry から得られたPromiseへの対応を追加します。 -
context.
[[attributeInstanceMap]]において entry に関連付けられているPromise<BluetoothGATT*>インスタンスを result に追加します。
-
-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、resolve により 全要素の完了待ちの結果で promise を解決します。
6.1.3. Bluetooth 階層のナビゲーション
single: boolean,
uuidCanonicalizer: function,
uuid: optional
(DOMString or unsigned int),allowedUuids: optional
("all" or Array<DOMString>),child type: GATT declaration type),
を実行するために、UA は以下の手順を実行しなければなりません(MUST):
-
uuid が存在する場合、uuid を uuidCanonicalizer(uuid) に設定します。 uuidCanonicalizer が例外を投げた場合は、その例外で 拒否された promise を返し、 これらの手順を中止します。
-
uuid が存在し、かつ blocklisted である場合、
SecurityErrorで 拒否された promise を返し、 これらの手順を中止します。 -
attribute の型に応じて、deviceObj を次のように定めます:
BluetoothDeviceattributeBluetoothRemoteGATTServiceattribute.deviceBluetoothRemoteGATTCharacteristicattribute.service.device
-
もし
deviceObj.gatt.がconnectedfalseであれば、NetworkErrorで 拒否された promise を返し、 これらの手順を中止します。 -
もし Represented(attribute) が
nullであれば、InvalidStateErrorで 拒否された promise を返し、 これらの手順を中止します。注記: これは、Service または Characteristic がデバイスから削除されたり、 切断によって無効化された後に、そのオブジェクトが再度使用されたときに発生します。
-
deviceObjの Bluetooth キャッシュへの問い合わせを実行し、 次の条件を満たすエントリを取得します:-
Represented(attribute) の内部にあること
-
child type で記述される型を持つこと
-
UUID が blocklisted でないこと
-
uuid が存在する場合、その UUID が uuid であること
-
allowedUuids が存在し、かつ
"all"でない場合、 その UUID が allowedUuids に含まれること -
single フラグが設定されている場合、これらのうち最初のものであること
結果を promise とします。
-
-
fulfillment により promise が result で満たされたとき、次を実行します:
-
result が空であれば、
NotFoundErrorを投げます。 -
それ以外で single フラグが設定されている場合、result の最初(かつ唯一)の要素を返します。
-
それ以外の場合、result を返します。
-
6.1.4. Service、Characteristic、Descriptor の識別
2 つの Service、Characteristic、または Descriptor、a と b が 同一の attribute であるかどうかを確認する際、 UA は、a と b が 同一のデバイス 内にあり、 かつ同じ Attribute Handle を持つ場合に 同一であると判断すべきです(SHOULD)。ただし、以下の条件のいずれかに該当する場合には、 a と b を 同一の attribute と 見なしてはなりません(MUST NOT)。UA はこの制約の範囲で任意のアルゴリズムを用いてもかまいません(MAY)。
-
両方が Service、両方が Characteristic、または両方が Descriptor のいずれでもない。
-
両方が Service であるが、両方とも Primary ではない、または両方とも Secondary ではない。
-
UUID が異なる。
-
それらの親 Device が 同一のデバイス ではない、 または親 Service あるいは親 Characteristic が 同一の attribute ではない。
x === y は、それらのオブジェクトが
Bluetooth
キャッシュへの問い合わせアルゴリズムが
新しいオブジェクトを作成・キャッシュする方法により、同一の
attribute を表すかどうかを返します。
6.2. BluetoothRemoteGATTServer
BluetoothRemoteGATTServer
は、
リモートデバイス上の GATT Server を表します。
[Exposed =Window ,SecureContext ]interface { [BluetoothRemoteGATTServer SameObject ]readonly attribute BluetoothDevice device ;readonly attribute boolean connected ;Promise <BluetoothRemoteGATTServer >connect ();undefined disconnect ();Promise <BluetoothRemoteGATTService >getPrimaryService (BluetoothServiceUUID );service Promise <sequence <BluetoothRemoteGATTService >>getPrimaryServices (optional BluetoothServiceUUID ); };service
BluetoothRemoteGATTServer
の属性device は、このサーバーを実行しているデバイスです。
connected は、
このインスタンスが this.device に接続されている間は true です。
物理的には UA が接続されていても、例えば他の
グローバルオブジェクト向けの
他の BluetoothRemoteGATTServer
インスタンスが接続されている場合などには false になり得ます。
もはやいかなる ECMAScript コードからも
BluetoothRemoteGATTServer
インスタンス server が観測されなくなった場合、UA は
server.
を
実行すべきです(SHOULD)。
disconnect()
navigator.bluetooth.[[deviceInstanceMap]]
に
BluetoothDevice
インスタンスが保存されるため、
少なくともナビゲーションによってグローバルオブジェクトが解放されるか、タブやウィンドウを閉じて
閲覧コンテキストが破棄されるまでは、
これは起こりません。
BluetoothRemoteGATTServer
のインスタンスは、
以下の表で説明する 内部スロットとともに作成されます:
| Internal Slot | Initial Value | Description (non-normative) |
|---|---|---|
[[activeAlgorithms]]
| new
|
このサーバーの接続を使用している各アルゴリズムに対応する
Promise
を含みます。
disconnect()
は
このセットを空にし、アルゴリズムが実行中に自身の
realm が一度でも切断されたかどうかを判定できるようにします。
|
[[automatedGATTConnectionResponse]]
| "not-expected"
| GATT 接続試行に対するシミュレートされた GATT 接続応答コード。 |
connect()
メソッドは、呼び出されたとき、以下の手順を実行しなければなりません(MUST):
-
global を this の 関連付けられたグローバルオブジェクトとします。
-
もし this.
device.[[representedDevice]]がnullであれば、 "NetworkError" のDOMExceptionで 拒否された promise を返します。 -
UA が現在 Bluetooth システムを使用中である場合、UA は "
NetworkError" のDOMExceptionで 拒否された promise を返してもよいです(MAY)。実装によってはこの
NetworkErrorを回避できるかもしれませんが、 現時点ではサイトはこの API の使用を直列化する必要があり、 かつ/または失敗した操作を再試行できる手段をユーザーに提供する必要があります。 [Issue #188] -
promise を 新しい promise とします。
-
もし this.
connectedがtrueであれば、resolve により promise を this で解決し、promise を返します。 -
this.
[[activeAlgorithms]]に promise を追加します。 -
次の手順を並行して実行します:
-
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でないなら、次を実行します:
-
gatt connection attempted イベントをトリガーし、 global の navigable と this.
deviceを与えます。 -
もし this.
[[automatedGATTConnectionResponse]]が"not-expected"であるなら、これを"expected"に設定します。 -
もし this.
[[automatedGATTConnectionResponse]]が"expected"であるなら、これが変化するまで待ちます。 -
response を、this.
[[automatedGATTConnectionResponse]]とします。 -
this.
[[automatedGATTConnectionResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
this.
[[activeAlgorithms]]から promise を削除します。 -
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。
-
-
-
それ以外の場合、次の手順を実行します:
-
もし this.
device.[[representedDevice]]が ATT Bearer を持たない場合、次の副手順を実行します:-
ATT Bearer を作成しようと試みます。 その際、GAP Interoperability Requirements の "Connection Establishment" に記述された手順を用います。 this.
[[activeAlgorithms]]から promise が削除された場合は、この試行を中断します。注記: 接続可能な広告が受信されない限り、これらの手順は永遠に待機する可能性があります。 ウェブサイトは、もはや接続を望まない場合にはdisconnect()を呼び出すべきです。 -
この試行が、promise が this.
[[activeAlgorithms]]から 削除されたために中断されたのであれば、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "AbortError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
この試行が別の理由で失敗した場合は、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
Exchange MTU 手続きを用いて、 サポートされる最大の MTU をネゴシエートします。この手順でのエラーは無視します。
-
UA は、BR/EDR Bonding Procedure または LE Bonding Procedure を用いて、 リモートデバイスとのボンディングを試みてもよいです(MAY)。
注記: 通常であれば、ボンディングの有無やタイミングの制御はウェブサイト側に任せたいところですが、 Core Bluetooth の プラットフォーム API は UA がそのような制御を実装する手段を提供していません。 ボンディングがある方がない場合よりも安全であるため、この仕様では、そのようなことが可能なプラットフォームにおいて UA が機会を見てボンディングを作成することを許容します。 これは、接続が作成された時点でユーザーが目にするペアリングダイアログが表示される可能性があり、 制限付きの characteristic にアクセスしたときではない場合があることを意味します。
-
-
-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、次の副手順を実行します:
-
もし promise が this.
[[activeAlgorithms]]に存在しないなら、 "AbortError" のDOMExceptionで reject により promise を拒否し、 接続のガベージコレクション を this.device.[[representedDevice]]に対して実行し、 これらの手順を中止します。 -
this.
[[activeAlgorithms]]から promise を削除します。 -
もし this.
device.[[representedDevice]]がnullであれば、 "NetworkError" のDOMExceptionで reject により promise を拒否し、 接続のガベージコレクション を this.device.[[representedDevice]]に対して実行し、 これらの手順を中止します。
-
-
-
promise を返します。
disconnect()
メソッドは、呼び出されたとき、以下の手順を実行しなければなりません(MUST):
-
this.をクリアして、 すべての アクティブな[[activeAlgorithms]]connect()呼び出し を中断します。 -
もし
this.がconnectedfalseであれば、これらの手順を中止します。 -
切断されたデバイスのクリーンアップを
this.deviceに対して実行します。 -
device を
this.device.とします。[[representedDevice]] -
接続のガベージコレクションを device に対して実行します。
-
この API を使用していないシステム(UA の内外を問わず)が device の ATT Bearer を使用している場合、 このアルゴリズムを中止します。
-
UA 全体のすべての
BluetoothDevicedeviceObjについて:-
もし
deviceObj.が device と 同一のデバイス でなければ、 次の deviceObj に進みます。[[representedDevice]] -
もし
deviceObj.gatt.がconnectedtrueであれば、このアルゴリズムを中止します。 -
もし
deviceObj.gatt.に[[activeAlgorithms]]Promise(connect()呼び出しのもの)が含まれている場合、 このアルゴリズムを中止します。
-
-
device の ATT Bearer を破棄します。
BluetoothRemoteGATTServer
が切断された場合、
たとえ UA が全期間を通じて物理的に接続を維持し、その後に
BluetoothRemoteGATTServer
が再接続されたとしても、
失敗しなければなりません。これを実現するために、返される
Promise
をラップします。
promise を包む、gattServer に対する 接続チェックラッパーを作成するには、 UA は次を行わなければなりません(MUST):
-
もし
gattServer.connectedがtrueであれば、 promise をgattServer.に追加します。[[activeAlgorithms]] -
promise の完了に反応します:
-
promise が値 result で fulfill された場合:
-
もし promise が
gattServer.に存在するなら、 これを削除して result を返します。[[activeAlgorithms]] -
それ以外の場合、
NetworkErrorを投げます。注記: このエラーは、gattServer がメインのアルゴリズムの実行中に切断されたために投げられます。
-
-
promise が理由 error で reject された場合:
-
もし promise が
gattServer.に存在するなら、 これを削除して error を投げます。[[activeAlgorithms]] -
それ以外の場合、
NetworkErrorを投げます。注記: このエラーは、gattServer がメインのアルゴリズムの実行中に切断されたために投げられます。
-
-
getPrimaryService(service)
メソッドは、呼び出されたとき、以下の手順を実行しなければなりません(MUST):
-
もし
this.device.が[[allowedServices]]"all"ではなく、かつ service がthis.device.に含まれていない場合、[[allowedServices]]SecurityErrorで 拒否された promise を返し、 これらの手順を中止します。 -
GetGATTChildren(attribute=
this.device,
single=true,
uuidCanonicalizer=BluetoothUUID.getService,
uuid=service,
allowedUuids=this.device.,[[allowedServices]]
child type="GATT Primary Service") を返します。
getPrimaryServices(service)
メソッドは、呼び出されたとき、以下の手順を実行しなければなりません(MUST):
-
もし
this.device.が[[allowedServices]]"all"ではなく、service が存在し、かつthis.device.に含まれていない場合、[[allowedServices]]SecurityErrorで 拒否された promise を返し、 これらの手順を中止します。 -
GetGATTChildren(attribute=
this.device,
single=false,
uuidCanonicalizer=BluetoothUUID.getService,
uuid=service,
allowedUuids=this.device.,[[allowedServices]]
child type="GATT Primary Service") を返します。
6.3. BluetoothRemoteGATTService
BluetoothRemoteGATTService
は GATT の Service(特性および他サービスとの関係の集合で、デバイスの一部の動作をカプセル化するもの)を表します。
[Exposed =Window ,SecureContext ]interface :BluetoothRemoteGATTService EventTarget { [SameObject ]readonly attribute BluetoothDevice device ;readonly attribute UUID uuid ;readonly attribute boolean isPrimary ;Promise <BluetoothRemoteGATTCharacteristic >getCharacteristic (BluetoothCharacteristicUUID );characteristic Promise <sequence <BluetoothRemoteGATTCharacteristic >>getCharacteristics (optional BluetoothCharacteristicUUID );characteristic Promise <BluetoothRemoteGATTService >getIncludedService (BluetoothServiceUUID );service Promise <sequence <BluetoothRemoteGATTService >>getIncludedServices (optional BluetoothServiceUUID ); };service BluetoothRemoteGATTService includes CharacteristicEventHandlers ;BluetoothRemoteGATTService includes ServiceEventHandlers ;
BluetoothRemoteGATTService
の属性device は、この GATT
サービスが属するリモート周辺機器を表す
BluetoothDevice
です。
uuid はサービスの UUID です。例:
'0000180d-0000-1000-8000-00805f9b34fb' は Heart Rate サービス。
isPrimary は、このサービスの種別が
primary か secondary かを示します。
BluetoothRemoteGATTService
のインスタンスは、以下の表で説明される
内部スロットを持って作成されます:
| Internal Slot | Initial Value | Description (non-normative) |
|---|---|---|
[[representedService]]
| <always set in prose> |
このオブジェクトが表す Service。
そのサービスが削除されるなどして無効になっている場合は null。
|
BluetoothRemoteGATTService
を作成して表現する
ために、Service service に対して UA は次の手順を実行しなければなりません(MUST):
-
global を、this の 関連付けられたグローバルオブジェクトとします。
-
promise を、新しい promise とします。
-
次の手順を並行して実行します:
-
result を、新しい
BluetoothRemoteGATTServiceのインスタンスとし、その[[representedService]]スロットを service に初期化します。 -
BluetoothDevice を取得して表現する を実行して、 service が存在するデバイスを取得し、結果を device とします。
-
前の手順でエラーが投げられた場合、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
result の
deviceを device から初期化します。 -
result の
uuidを service の UUID から初期化します。 -
service が Primary Service であれば、 result の
isPrimaryをtrueに、そうでなければfalseに初期化します。 -
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 resolve により promise を result で解決します。
-
-
promise を返します。
getCharacteristic(characteristic) メソッドは、この Service 内の
Characteristic
を取得します。呼び出されたとき、次を返さなければなりません(MUST)
GetGATTChildren(attribute=
this,
single=true,
uuidCanonicalizer=BluetoothUUID.getCharacteristic,
uuid=characteristic,
allowedUuids=undefined,
child type="GATT Characteristic")
getCharacteristics(characteristic) メソッドは、この Service 内の
Characteristic
の一覧を取得します。呼び出されたとき、次を返さなければなりません(MUST)
GetGATTChildren(attribute=
this,
single=false,
uuidCanonicalizer=BluetoothUUID.getCharacteristic,
uuid=characteristic,
allowedUuids=undefined,
child type="GATT Characteristic")
getIncludedService(service) メソッドは、この Service 内の
Included Service
を取得します。呼び出されたとき、次を返さなければなりません(MUST)
GetGATTChildren(attribute=
this,
single=true,
uuidCanonicalizer=BluetoothUUID.getService,
uuid=service,
allowedUuids=undefined,
child type="GATT Included Service")
getIncludedServices(service) メソッドは、この Service 内の
Included Service
の一覧を取得します。呼び出されたとき、次を返さなければなりません(MUST)
GetGATTChildren(attribute=
this,
single=false,
uuidCanonicalizer=BluetoothUUID.getService,
uuid=service,
allowedUuids=undefined,
child type="GATT Included Service")
6.4. BluetoothRemoteGATTCharacteristic
BluetoothRemoteGATTCharacteristic
は GATT の Characteristic
を表し、周辺機器のサービスに関する追加情報を提供する基本的なデータ要素です。
[Exposed =Window ,SecureContext ]interface :BluetoothRemoteGATTCharacteristic EventTarget { [SameObject ]readonly attribute BluetoothRemoteGATTService service ;readonly attribute UUID uuid ;readonly attribute BluetoothCharacteristicProperties properties ;readonly attribute DataView ?value ;Promise <BluetoothRemoteGATTDescriptor >getDescriptor (BluetoothDescriptorUUID );descriptor Promise <sequence <BluetoothRemoteGATTDescriptor >>getDescriptors (optional BluetoothDescriptorUUID );descriptor Promise <DataView >readValue ();Promise <undefined >writeValue (BufferSource );value Promise <undefined >writeValueWithResponse (BufferSource );value Promise <undefined >writeValueWithoutResponse (BufferSource );value Promise <BluetoothRemoteGATTCharacteristic >startNotifications ();Promise <BluetoothRemoteGATTCharacteristic >stopNotifications (); };BluetoothRemoteGATTCharacteristic includes CharacteristicEventHandlers ;
BluetoothRemoteGATTCharacteristic
の属性service は、この
characteristic が属する GATT サービスです。
uuid は characteristic の UUID
です。例:
'00002a37-0000-1000-8000-00805f9b34fb' は
Heart Rate Measurement characteristic。
properties は、この
characteristic のプロパティを保持します。
value は現在キャッシュされている
characteristic の値です。
この値は、読み出しや通知・インジケーションによる更新の際に更新されます。
BluetoothRemoteGATTCharacteristic
のインスタンスは、以下の表で説明される
内部スロットを持って作成されます。
| Internal Slot | Initial Value | Description (non-normative) |
|---|---|---|
[[representedCharacteristic]]
| <always set in prose> |
このオブジェクトが表す Characteristic。characteristic が削除されるなどして無効になっている場合は
null。
|
[[automatedCharacteristicReadResponse]]
| "not-expected"
| GATT characteristic の読み取り試行に対するシミュレートされた応答コード。 |
[[automatedCharacteristicReadResponseData]]
| 空の byte sequence | GATT characteristic の読み取り試行に対するシミュレートされた応答データ。 |
[[automatedCharacteristicWriteResponse]]
| "not-expected"
| GATT characteristic の書き込み試行に対するシミュレートされた応答コード。 |
[[automatedCharacteristicSubscribeToNotificationsResponse]]
| "not-expected"
| GATT characteristic 通知の購読試行に対するシミュレートされた応答コード。 |
[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]
| "not-expected"
| GATT characteristic 通知の購読解除試行に対するシミュレートされた応答コード。 |
-
global を、this の 関連付けられたグローバルオブジェクトとします。
-
promise を、新しい promise とします。
-
次の手順を並行して実行します:
-
result を、新しい
BluetoothRemoteGATTCharacteristicのインスタンスとし、[[representedCharacteristic]]スロットを characteristic に初期化します。 -
result の
service< を、BluetoothRemoteGATTServiceのうち characteristic が属する Service を表すインスタンスから初期化します。 -
result の
uuidを characteristic の UUID から初期化します。 -
Characteristic から BluetoothCharacteristicProperties のインスタンスを作成し、 結果を properties とします。
-
前の手順がエラーを返した場合、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
result の
propertiesを properties に初期化します。 -
result の
valueをnullに初期化します。UA は、可能であれば characteristic から直近に読み出した値を含む newDataViewで newArrayBufferをラップして result.valueを初期化してもよいです(MAY)。 -
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 resolve により promise を result で解決します。
-
-
promise を返します。
getDescriptor(descriptor) メソッドは、この Characteristic 内の
Descriptor
を取得します。呼び出されたとき、次を返さなければなりません(MUST)
GetGATTChildren(attribute=
this,
single=true,
uuidCanonicalizer=BluetoothUUID.getDescriptor,
uuid=descriptor,
allowedUuids=undefined,
child type="GATT Descriptor")
getDescriptors(descriptor) メソッドは、この Characteristic 内の
Descriptor
の一覧を取得します。呼び出されたとき、次を返さなければなりません(MUST)
GetGATTChildren(attribute=
this,
single=false,
uuidCanonicalizer=BluetoothUUID.getDescriptor,
uuid=descriptor,
allowedUuids=undefined,
child type="GATT Descriptor")
readValue()
メソッドは、呼び出されたとき、次の手順を実行しなければなりません(MUST):
-
global を、this の 関連付けられたグローバルオブジェクトとします。
-
もし this.
uuidが 読み取りに対してブロックリスト入りしている場合、 "SecurityError" の 拒否された promise (DOMException)を返し、これらの手順を中止します。 -
もし gatt.
connectedがfalseであれば、 "NetworkError" の 拒否された promise (DOMException)を返し、これらの手順を中止します。 -
characteristic を、 this.
[[representedCharacteristic]]とします。 -
もし characteristic が
nullであれば、 "InvalidStateError" の 拒否された promise (DOMException)を返し、これらの手順を中止します。 -
gatt に対する 接続チェックラッパーで 新しい promise promise を包んで返し、次の手順を並行して実行します:
-
もし characteristic の properties に
Readビットが設定されていなければ、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "NotSupportedError" の reject により promise を拒否して、これらの手順を中止します。 -
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でない場合、次を実行します:
-
もし this.
[[automatedCharacteristicReadResponse]]が"not-expected"でないなら、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "InvalidStateError" の reject により promise を拒否して、これらの手順を中止します。 -
simulated characteristic イベントをトリガーし、 global の navigable、 this.
device、 characteristic、およびreadを与えます。 -
this.
[[automatedCharacteristicReadResponse]]を"expected"に設定し、変化するまで待ちます。 -
response を、 this.
[[automatedCharacteristicReadResponse]]とします。 -
this.
[[automatedCharacteristicReadResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "
NetworkError" の reject により promise を拒否して、これらの手順を中止します。
-
-
それ以外の場合、buffer を、 new な
ArrayBufferとし、 this.[[automatedCharacteristicReadResponseData]]を含むものとします。
-
-
それ以外の場合、次の手順を実行します:
-
UA が現在 Bluetooth システムを使用中であれば、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、 "
NetworkError" の reject により promise を拒否して、これらの手順を中止してもよいです(MAY)。実装によってはこの
NetworkErrorを回避できるかもしれませんが、現状ではサイトはこの API の使用を直列化し、かつ失敗した操作を再試行できる手段をユーザーに提供する必要があります。[Issue #188] -
Characteristic Value Read 手続きの副手続きの任意の組み合わせを用いて characteristic の値を取得し、取得した値を保持する new な
ArrayBufferを buffer とします。エラー処理は § 6.7 Error handling に従います。
-
-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、次を実行します:
-
もし promise が gatt.
[[activeAlgorithms]]に存在しなければ、 "NetworkError" の reject により promise を拒否し、これらの手順を中止します。 -
上記の副手続きがエラーを返していれば、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
イベントを発火します。イベント名は "
characteristicvaluechanged" で、 そのbubbles属性をtrueに初期化して this に対して発火します。
-
-
value: BufferSource,
response: string),
を実行するために、UA は次の手順を実行しなければなりません(MUST):
-
global を this の 関連付けられたグローバルオブジェクトとします。
-
もし this.
uuidが 書き込みに対してブロックリスト入りしている場合は、"SecurityError" のDOMExceptionで 拒否された promise を返し、これらの手順を中止します。 -
bytes を、value が保持するバイト列のコピーとします。
-
もし bytes が 512 バイトを超える場合(Long Attribute Values による属性値の最大長)、 "
InvalidModificationError" のDOMExceptionで 拒否された promise を返し、これらの手順を中止します。 -
もし gatt.
connectedがfalseであれば、"NetworkError" のDOMExceptionで 拒否された promise を返し、これらの手順を中止します。 -
characteristic を this.
[[representedCharacteristic]]とします。 -
もし characteristic が
nullであれば、 "InvalidStateError" のDOMExceptionで 拒否された promise を返し、これらの手順を中止します。 -
gatt に対する 接続チェックラッパーで 新しい promise の promise を包んで返し、次の手順を並行して実行します。
-
表明: response は "required"、"never"、"optional" のいずれかです。
-
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でない場合、次の手順を実行します:
-
this.
[[automatedCharacteristicWriteResponse]]が"not-expected"でない場合は、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"InvalidStateError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
simulated characteristic イベントをトリガーし、 global の navigable、 this.
device、 characteristic、write、および bytes を与えます。 -
this.
[[automatedCharacteristicWriteResponse]]を"expected"に設定し、変化するまで待ちます。 -
response を this.
[[automatedCharacteristicWriteResponse]]とします。 -
this.
[[automatedCharacteristicWriteResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。
-
-
-
それ以外の場合、次の手順を実行します:
-
UA が現在 Bluetooth システムを使用中である場合、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否してもよく(MAY)、これらの手順を中止します。実装によってはこの
NetworkErrorを回避できるかもしれませんが、現状ではサイトはこの API の使用を直列化し、かつ/またはユーザーに失敗した操作を再試行できる手段を提供する必要があります。[Issue #188] -
characteristic に bytes を書き込むため、次の手順を実行します:
- もし response が "required" の場合
- Write Characteristic Value 手続きを用います。
- もし response が "never" の場合
- Write Without Response 手続きを用います。
- それ以外の場合
- Characteristic Value Write 手続きの副手続きの任意の組み合わせを用います。
-
-
グローバルタスクをキューして global 上で Bluetooth タスクソースを用い、次の手順を実行します:
-
もし promise が gatt.
[[activeAlgorithms]]に存在しなければ、"NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
上記の手続きがエラーを返した場合は、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
this.
valueを、 new なDataView(new なArrayBufferに bytes を格納したものをラップ)に設定します。 -
Resolve により promise を
undefinedで解決します。
-
-
writeValueWithResponse()
と
writeValueWithoutResponse()
を使用してください。
メソッドは、呼び出されたとき、次を返さなければなりません(MUST)
writeValue(value)
WriteCharacteristicValue( this=
this,
value=value,
response="optional")
このメソッドは後方互換性のためだけのものです。新しい実装ではこのメソッドを実装すべきではありません。[Issue #238]
writeValueWithResponse(value) メソッドは、呼び出されたとき、次を返さなければなりません(MUST)
WriteCharacteristicValue( this=
this,
value=value,
response="required")
writeValueWithoutResponse(value) メソッドは、呼び出されたとき、次を返さなければなりません(MUST)
WriteCharacteristicValue( this=
this,
value=value,
response="never")
UA は、既知の各 GATT Characteristic
から、特性の active
notification
context set と呼ばれる Bluetooth
オブジェクトの集合へのマップを維持しなければなりません(MUST)。
navigator.bluetooth
オブジェクトが保持されます。デバイスが切断されると、すべての通知は非アクティブになります。再接続後も通知を受け取り続けたいサイトは
startNotifications()
を再度呼び出す必要があり、startNotifications()
が有効になる前の隙間でいくつかの通知が取りこぼされるリスクは避けられません。
startNotifications() メソッドは、呼び出されたとき、次の手順を実行しなければなりません(MUST)。通知の受信の詳細は § 6.6.4 Responding to Notifications and Indications を参照してください。
-
global を this の 関連付けられたグローバルオブジェクトとします。
-
もし this.
uuidが 読み取りに対してブロックリスト入りしている場合は、"SecurityError" のDOMExceptionで 拒否された promise を返します。 -
もし gatt.
connectedがfalseであれば、"NetworkError" のDOMExceptionで 拒否された promise を返します。 -
characteristic を、this.
[[representedCharacteristic]]とします。 -
もし characteristic が
nullであれば、"InvalidStateError" のDOMExceptionで 拒否された promise を返します。 -
gatt に対する 接続チェックラッパーで 新しい promise の promise を包んで返し、次の手順を並行して実行します。
-
もし characteristic の properties に
NotifyとIndicateのいずれのビットも設定されていない場合は、 グローバルタスクをキューして Bluetooth タスクソース 上で global に与え、NotSupportedErrorで reject により promise を拒否して、これらの手順を中止します。 -
もし characteristic の active notification context set に
navigator.bluetoothが含まれている場合は、 グローバルタスクをキューして Bluetooth タスクソース 上で global に与え、resolve により promise を this で解決し、これらの手順を中止します。 -
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でない場合、次の手順を実行します:
-
this.
[[automatedCharacteristicSubscribeToNotificationsResponse]]が"not-expected"でない場合は、 グローバルタスクをキューして Bluetooth タスクソース 上で global に与え、"InvalidStateError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
simulated characteristic イベントをトリガーし、 global の navigable、 this.
device、 characteristic、およびsubscribe-to-notificationsを与えます。 -
this.
[[automatedCharacteristicSubscribeToNotificationsResponse]]を"expected"に設定し、変化するまで待ちます。 -
response を this.
[[automatedCharacteristicSubscribeToNotificationsResponse]]とします。 -
this.
[[automatedCharacteristicSubscribeToNotificationsResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。
-
-
それ以外の場合、success を
trueとします。
-
-
それ以外の場合、次の手順を実行します:
-
UA が現在 Bluetooth システムを使用中である場合、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否してもよく(MAY)、これらの手順を中止します。実装によってはこの
NetworkErrorを回避できるかもしれませんが、 現状ではサイトはこの API の使用を直列化し、かつ/またはユーザーに失敗した操作を再試行する手段を提供する必要があります。[Issue #188] -
特性に Client Characteristic Configuration デスクリプタがある場合、Characteristic Descriptors 手続きのいずれかを用いて、characteristic の Client Characteristic Configuration デスクリプタ内の
NotificationまたはIndicationのどちらか一方のビットが、characteristic の properties の制約に合うように設定されていることを確実にします。UA は両方のビットを設定することは避けるべき(SHOULD)であり、両方のビットが設定されている場合は value-change events を重複排除しなければなりません(MUST)。エラー処理は § 6.7 Error handling に従います。注記: 一部のデバイスには、プロパティに Notify または Indicate ビットが含まれているにもかかわらず、Client Characteristic Configuration デスクリプタを持たない characteristic があります。これらの仕様非準拠の characteristic は無条件に通知またはインジケーションを送信する傾向があるため、本仕様ではアプリケーションが単にそれらのメッセージを購読できるようにしています。 -
手続きが成功した場合、success を
trueとします。
-
-
もし success が
trueであれば、characteristic の active notification context set にnavigator.bluetoothを追加します。 -
グローバルタスクをキューして Bluetooth タスクソース 上で global に与え、次の手順を実行します:
-
もし promise が gatt.
[[activeAlgorithms]]に存在しなければ、"NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
上記の手続きがエラーを返した場合、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
-
.then ハンドラ内でハンドラを設定できます。
stopNotifications() メソッドは、呼び出されたとき、新しい promise
promise を返し、次の手順を並行して実行しなければなりません(MUST):
-
characteristic を
this.とします。[[representedCharacteristic]] -
もし characteristic が
nullであれば、拒否された promise(InvalidStateError)を返し、これらの手順を中止します。 -
もし characteristic の active notification context set に
navigator.bluetoothが含まれていれば、これを削除します。-
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でない場合、次の手順を実行します:
-
this.
[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]が"not-expected"でない場合は、 グローバルタスクをキューして Bluetooth タスクソース 上で global に与え、"InvalidStateError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
simulated characteristic イベントをトリガーし、 global の navigable、 this.
device、 characteristic、およびunsubscribe-from-notificationsを与えます。 -
this.
[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]を"expected"に設定し、変化するまで待ちます。 -
response を this.
[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]とします。 -
this.
[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。
-
-
-
それ以外の場合、次の手順を実行します:
-
もし characteristic の active notification context set が空になり、かつその characteristic が Client Characteristic Configuration デスクリプタを持つ場合、UA は Characteristic Descriptors 手続きのいずれかを用いて、characteristic の Client Characteristic Configuration デスクリプタ内の
NotificationとIndicationのビットをクリアするべきです(SHOULD)。
-
-
-
グローバルタスクをキューして Bluetooth タスクソース 上で、this の 関連付けられたグローバルオブジェクトに与え、resolve により promise を this で解決します。
6.4.1. BluetoothCharacteristicProperties
各 BluetoothRemoteGATTCharacteristic
は、特性プロパティを
BluetoothCharacteristicProperties
オブジェクトを通じて公開します。これらのプロパティは、その特性に対して有効な操作を表します。
[Exposed =Window ,SecureContext ]interface {BluetoothCharacteristicProperties readonly attribute boolean ;broadcast readonly attribute boolean ;read readonly attribute boolean ;writeWithoutResponse readonly attribute boolean ;write readonly attribute boolean ;notify readonly attribute boolean ;indicate readonly attribute boolean ;authenticatedSignedWrites readonly attribute boolean ;reliableWrite readonly attribute boolean ; };writableAuxiliaries
BluetoothCharacteristicProperties インスタンスを作成するために、
characteristic に対して UA は次の手順を実行しなければなりません(MUST):
-
propertiesObj を
BluetoothCharacteristicPropertiesの新しいインスタンスとします。 -
properties を characteristic の 特性プロパティとします。
-
properties 内の対応するビットに基づいて propertiesObj の属性を初期化します:
属性 ビット broadcastBroadcast readRead writeWithoutResponseWrite Without Response writeWrite notifyNotify indicateIndicate authenticatedSignedWritesAuthenticated Signed Writes -
もし 特性プロパティの Extended Properties ビットが 設定されていなければ、propertiesObj.
reliableWriteおよび propertiesObj.writableAuxiliariesをfalseに初期化します。そうでなければ、次の手順を実行します:-
検出により Characteristic Extended Properties デスクリプタを characteristic について見つけ、 その値を読み取り extendedProperties に格納します。 エラー処理は § 6.7 Error handling に従います。
Characteristic Extended Properties が、特定の Characteristic に対して 拡張プロパティが不変かどうかは明確ではありません。 もし不変であるなら、UA はそれらをキャッシュできるようにすべきです。
-
前の手順がエラーを返した場合は、そのエラーを返します。
-
propertiesObj.
reliableWriteを、extendedProperties の Reliable Write ビットに基づいて初期化します。 -
propertiesObj.
writableAuxiliariesを、extendedProperties の Writable Auxiliaries ビットに基づいて初期化します。
-
-
propertiesObj を返します。
6.5. BluetoothRemoteGATTDescriptor
BluetoothRemoteGATTDescriptor
は GATT の Descriptor を表し、
Characteristic
の値に関する追加情報を提供します。
[Exposed =Window ,SecureContext ]interface { [BluetoothRemoteGATTDescriptor SameObject ]readonly attribute BluetoothRemoteGATTCharacteristic characteristic ;readonly attribute UUID uuid ;readonly attribute DataView ?value ;Promise <DataView >readValue ();Promise <undefined >writeValue (BufferSource ); };value
BluetoothRemoteGATTDescriptor
の属性characteristic は、
このデスクリプタが属する GATT 特性です。
uuid は特性デスクリプタの
UUID です。例:
'00002902-0000-1000-8000-00805f9b34fb' は
Client Characteristic Configuration デスクリプタです。
value は現在キャッシュされている
デスクリプタ値です。この値はデスクリプタの値が読み取られたときに更新されます。
BluetoothRemoteGATTDescriptor
のインスタンスは、以下の表で説明される
内部スロットとともに作成されます:
| 内部スロット | 初期値 | 説明(非規範) |
|---|---|---|
[[representedDescriptor]]
| <always set in prose> |
このオブジェクトが表す Descriptor。
Descriptor が削除されるなどして無効になっている場合は null。
|
[[automatedDescriptorReadResponse]]
| "not-expected"
| GATT デスクリプタの読み取り試行に対するシミュレートされた応答コード。 |
[[automatedDescriptorReadResponseData]]
| 空の バイト列 | GATT デスクリプタの読み取り試行に対するシミュレートされた応答データ。 |
[[automatedDescriptorWriteResponse]]
| "not-expected"
| GATT デスクリプタの書き込み試行に対するシミュレートされた応答コード。 |
BluetoothRemoteGATTDescriptor
を作成して表現する
ために、デスクリプタ descriptor に対して UA は次の手順を実行しなければなりません(MUST)。
-
promise を 新しい promise とします。
-
次の手順を並行して実行します:
-
result を、新しい
BluetoothRemoteGATTDescriptorのインスタンスとし、その[[representedDescriptor]]スロットを descriptor に初期化します。 -
result の
characteristicを、BluetoothRemoteGATTCharacteristicのうち descriptor が現れる Characteristic を表すインスタンスから初期化します。 -
result の
uuidを descriptor の UUID から初期化します。 -
result の
valueをnullに初期化します。 UA は、可能であれば result のvalueを、 new なDataView( new なArrayBufferをラップし、 descriptor から直近に読み取られた値を含むもの)に初期化してもよいです(MAY)。 -
グローバルタスクをキューして、Bluetooth タスクソース上で this の 関連付けられたグローバルオブジェクトに与え、 resolve により promise を result で解決します。
-
-
promise を返します。
readValue() メソッドは、呼び出されたとき、次の手順を実行しなければなりません(MUST):
-
global を this の 関連付けられたグローバルオブジェクトとします。
-
gatt を this.
characteristic.service.device.gattとします。 -
もし this.
uuidが読み取りに対してブロックリスト入りしている場合は、"SecurityError" のDOMExceptionで 拒否された promise を返します。 -
もし gatt.
connectedがfalseであれば、"NetworkError" のDOMExceptionで 拒否された promise を返します。 -
descriptor を this.
[[representedDescriptor]]とします。 -
もし descriptor が
nullであれば、"InvalidStateError" のDOMExceptionで 拒否された promise を返します。 -
gatt に対する 接続チェックラッパーで 新しい promise の promise を包んで返し、 次の手順を並行して実行します:
-
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でない場合、次を実行します:
-
もし this.
[[automatedDescriptorReadResponse]]が"not-expected"でないなら、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"InvalidStateError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
シミュレートされたデスクリプタイベントをトリガーし、 global の navigable、 this.
device、 descriptor、およびreadを与えます。 -
this.
[[automatedDescriptorReadResponse]]を"expected"に設定し、変化するまで待ちます。 -
response を this.
[[automatedDescriptorReadResponse]]とします。 -
this.
[[automatedDescriptorReadResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。
-
-
それ以外の場合、buffer を new な
ArrayBufferとし、this.[[automatedDescriptorReadResponseData]]を含むものとします。
-
-
それ以外の場合、次の手順を実行します:
-
UA が現在 Bluetooth システムを使用中である場合、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否してもよく(MAY)、これらの手順を中止します。実装によってはこの
NetworkErrorを回避できるかもしれませんが、現状ではサイトはこの API の使用を直列化し、かつユーザーに失敗した操作を再試行できる手段を提供する必要があります。[Issue #188] -
Read Characteristic Descriptors または Read Long Characteristic Descriptors のいずれかの副手続きを用いて descriptor の値を取得し、その値を保持する new な
ArrayBufferを buffer とします。エラー処理は § 6.7 Error handling に従います。
-
-
グローバルタスクをキューして、Bluetooth タスクソース上で global に与え、次の手順を実行します:
-
もし promise が gatt.
[[activeAlgorithms]]に存在しなければ、"NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
上記の副手続きがエラーを返した場合は、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
-
writeValue(value) メソッドは、呼び出されたとき、次の手順を実行しなければなりません(MUST):
-
global を this の 関連付けられたグローバルオブジェクトとします。
-
gatt を this.
characteristic.service.device.gattとします。 -
もし this.
uuidが 書き込みに対してブロックリスト入りしている場合は、"SecurityError" のDOMExceptionで 拒否された promise を返します。 -
bytes を、value が保持するバイト列のコピーとします。
-
もし bytes が 512 バイトを超える場合(Long Attribute Values による属性値の最大長)、 "
InvalidModificationError" のDOMExceptionで 拒否された promise を返します。 -
もし gatt.
connectedがfalseであれば、"NetworkError" のDOMExceptionで 拒否された promise を返します。 -
descriptor を this.
[[representedDescriptor]]とします。 -
もし descriptor が
nullであれば、"InvalidStateError" のDOMExceptionで 拒否された promise を返します。 -
gatt に対する 接続チェックラッパーで 新しい promise の promise を包んで返し、 次の手順を並行して実行します。
-
もし global の navigable の top-level traversable の simulated Bluetooth adapter が空でない場合、次を実行します:
-
もし this.
[[automatedDescriptorWriteResponse]]が"not-expected"でないなら、 グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"InvalidStateError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
シミュレートされたデスクリプタイベントをトリガーし、 global の navigable、 this.
device、 descriptor、write、および bytes を与えます。 -
this.
[[automatedDescriptorWriteResponse]]を"expected"に設定し、変化するまで待ちます。 -
response を this.
[[automatedDescriptorWriteResponse]]とします。 -
this.
[[automatedDescriptorWriteResponse]]を"not-expected"に設定します。 -
もし response が
0でなければ、次の副手順を実行します:-
グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。
-
-
-
それ以外の場合、次の手順を実行します:
-
UA が現在 Bluetooth システムを使用中である場合、グローバルタスクをキューして Bluetooth タスクソース上で global に与え、"
NetworkError" のDOMExceptionで reject により promise を拒否してもよく(MAY)、これらの手順を中止します。実装によってはこの
NetworkErrorを回避できるかもしれませんが、現状ではサイトはこの API の使用を直列化し、かつユーザーに失敗した操作を再試行できる手段を提供する必要があります。[Issue #188] -
Write Characteristic Descriptors または Write Long Characteristic Descriptors のいずれかの副手続きを用いて、 bytes を descriptor に書き込みます。エラー処理は § 6.7 Error handling に従います。
-
-
グローバルタスクをキューして、Bluetooth タスクソース上で global に与え、次の手順を実行します:
-
もし promise が gatt.
[[activeAlgorithms]]に存在しなければ、"NetworkError" のDOMExceptionで reject により promise を拒否し、これらの手順を中止します。 -
上記の副手続きがエラーを返した場合、そのエラーで reject により promise を拒否し、これらの手順を中止します。
-
this.
valueを、new なDataView(new なArrayBufferに bytes を格納したものをラップ)に設定します。 -
Resolve により promise を
undefinedで解決します。
-
-
6.6. イベント
6.6.1. Bluetooth ツリー
Bluetooth tree は、
navigator.bluetooth
と、
BluetoothDevice、
BluetoothRemoteGATTService、
BluetoothRemoteGATTCharacteristic、
または BluetoothRemoteGATTDescriptor
インターフェイスを実装し、木構造に参加するオブジェクトに与えられた名称です。
-
navigator.bluetoothの 子は、BluetoothDeviceオブジェクトであり、allowedDevicesリスト("bluetooth" の 追加パーミッションデータ)内のデバイスを、navigator.bluetoothの 関連設定オブジェクトに対して表すものです。順序は未規定です。 -
BluetoothDeviceの 子は、BluetoothRemoteGATTServiceオブジェクトであり、その GATT Server 上の プライマリおよびセカンダリ Service を表します。これらの UUID はオリジンおよびデバイスのallowedServicesリストに含まれていなければなりません。プライマリサービスの順序は Discover Primary Service by Service UUID 手続きが返す順序と一致しなければなりません(MUST)が、セカンダリサービスや異なる UUID のプライマリサービスの順序は任意です。 -
BluetoothRemoteGATTServiceの 子は、BluetoothRemoteGATTCharacteristicオブジェクトであり、その Characteristic を表します。Characteristics の順序は Discover Characteristics by UUID 手続きが返す順序と一致しなければなりません(MUST)が、異なる UUID の characteristic の順序は任意です。 -
BluetoothRemoteGATTCharacteristicの 子は、BluetoothRemoteGATTDescriptorオブジェクトであり、Discover All Characteristic Descriptors 手続きが返す順序でその Descriptor を表します。
6.6.2. イベント型
-
advertisementreceived -
BluetoothDevice上で、そのデバイスからの広告イベントを受信したときに発火します。 availabilitychanged- navigator.bluetooth 上で、 Bluetooth システム全体が UA に対して利用可能または不可能になったときに発火します。
-
characteristicvaluechanged -
BluetoothRemoteGATTCharacteristic上で、その値が変更されたときに発火します。これは 読み出し要求の結果、または 値変更の通知/インジケーションの結果です。 -
gattserverdisconnected -
BluetoothDevice上で、アクティブな GATT 接続が失われたときに発火します。 -
serviceadded -
新しい
BluetoothRemoteGATTService上で、 リモートデバイス上で検出されたときに、Bluetooth ツリーに追加された直後に発火します。 -
servicechanged -
BluetoothRemoteGATTService上で、その状態が変更されたときに発火します。これは、サービスに追加または削除されたあらゆる characteristic および/または descriptor、 ならびにリモートデバイスからの Service Changed インジケーションを含みます。 -
serviceremoved -
BluetoothRemoteGATTService上で、そのサービスがデバイスから削除されたときに、Bluetooth ツリーから削除される直前に発火します。
6.6.3. 切断への応答
BluetoothDevice
deviceObj について、UA は グローバルタスクをキューして、Bluetooth タスクソース上で
deviceObj の 関連付けられたグローバルオブジェクトに与え、次の手順を実行しなければなりません(MUST):
-
deviceObj.が 同一のデバイス device でなければ、これらの手順を中止します。[[representedDevice]] -
!deviceObj.gatt.であれば、これらの手順を中止します。connected -
切断されたデバイスのクリーンアップ deviceObj を実行します。
-
deviceObj.gatt.をconnectedfalseに設定します。 -
deviceObj.gatt.をクリアします。[[activeAlgorithms]] -
deviceObj.gatt.を[[automatedGATTConnectionResponse]]"not-expected"に設定します。 -
context を
deviceObj.とします。[[context]] -
context.から、キーが[[attributeInstanceMap]]deviceObj.内にあるすべてのエントリを削除します。[[representedDevice]] -
UA の realm 内の各
BluetoothRemoteGATTServiceservice について、service.を[[representedService]]nullに設定します。 -
deviceObj の realm 内の各
BluetoothRemoteGATTCharacteristiccharacteristic について、次の副手順を行います:-
notificationContexts を
characteristic.の active notification context set とします。[[representedCharacteristic]] -
notificationContexts から context を削除します。
-
もし notificationContexts が空になり、かつ
deviceObj.への ATT Bearer がまだ存在し、 さらに characteristic が Client Characteristic Configuration デスクリプタを持つ場合、UA は Characteristic Descriptors 手続きのいずれかを用いて、 characteristic のそのデスクリプタ内の[[representedDevice]]NotificationとIndicationビットをクリアするべきです(SHOULD)。 -
characteristic.を[[representedCharacteristic]]nullに設定します。
-
-
deviceObj の realm 内の各
BluetoothRemoteGATTDescriptordescriptor について、descriptor.を[[representedDescriptor]]nullに設定します。 -
イベントを発火します。イベント名は
gattserverdisconnectedで、bubbles属性をtrueに初期化してdeviceObjに対して発火します。注記: このイベントはBluetoothRemoteGATTServerでは発火しません。
6.6.4. 通知・インジケーションへの応答
-
Characteristic の active notification context set 内の 各 bluetoothGlobal について、グローバルタスクをキューして、Bluetooth タスクソース上で bluetoothGlobal の 関連付けられたグローバルオブジェクトに与え、次の副手順を実行します:
-
characteristicObject を、bluetoothGlobal をルートとする Bluetooth ツリー内で その Characteristic を表す
BluetoothRemoteGATTCharacteristicとします。 -
characteristicObject .service.device.gatt.がconnectedfalseであれば、これらの副手順を中止します。 -
characteristicObject.valueを、 新しいDataView(新しいArrayBufferをラップし、Characteristic の新しい値を保持するもの)に設定します。 -
イベントを発火します。イベント名は
characteristicvaluechangedで、bubbles属性をtrueに初期化して characteristicObject に対して発火します。
-
6.6.5. サービス変更への応答
-
removedAttributes を、インジケーション前に UA が発見していた、 Service Changed characteristic が示す範囲内の属性のリストとします。
-
Primary Service Discovery、Relationship Discovery、 Characteristic Discovery、および Characteristic Descriptor Discovery 手続きを用いて、Service Changed characteristic が示す範囲内の属性を再発見します。 その発見の結果が、後述のイベントに影響しないことを UA が証明できる場合、示された範囲の全部または一部の発見を省略してもかまいません(MAY)。
-
addedAttributes を、前の手順で発見した属性のリストとします。
-
Service Interoperability Requirements に示す 同一の定義(Characteristic と Descriptor の値は無視)を持つ属性が removedAttributes と addedAttributes の両方に現れる場合、それを両方から削除します。
次のデバイス状態を仮定します:- 状態 1
-
-
Service A
- Characteristic C: 値
[1, 2, 3]
- Characteristic C: 値
- Service B
-
Service A
- 状態 2
-
-
Service A
- Characteristic C: 値
[3, 2, 1]
- Characteristic C: 値
- Service B
-
Service A
- 状態 3
-
-
Service A
- Characteristic D: 値
[3, 2, 1]
- Characteristic D: 値
- Service B
-
Service A
- 状態 4
-
-
Service A
- Characteristic C: 値
[1, 2, 3]
- Characteristic C: 値
-
Service B
- Include Service A
-
Service A
状態 1 から 2 への遷移では、サービス A は「Characteristic と Descriptor の値を無視した同じ定義」のままなので、 removedAttributes と addedAttributes の両方から削除され、 いかなる
servicechangedイベントにも現れません。状態 1 から 3 への遷移では、サービス定義に characteristic 定義が含まれるため、 サービス A は異なる定義となります。よってサービス A は removedAttributes と addedAttributes の両方に残ります。その後 手順 8 でサービスは changedServices に移され、
servicechangedイベントのみを引き起こし、serviceaddedとserviceremovedの両方にはなりません。 手順 9 でも、 Characteristic C が削除され D が追加されたため、サービス A が changedServices に追加されます。状態 1 から 4 への遷移は 1→3 の遷移に類似しています。サービス B は 手順 8 で changedServices に移されますが、 characteristic や descriptor は変更されていないため、 手順 9 で重複して追加されることはありません。
-
invalidatedAttributes を、 removedAttributes にあって addedAttributes にはない属性とします。
-
UA 内の各 environment settings object settings について、その responsible event loop 上で タスクをキューし、次の副手順を行います:
-
BluetoothRemoteGATTService
serviceのうち、 関連設定オブジェクトが settings であるものについて、service.が invalidatedAttributes に含まれていれば、[[representedService]]service.を[[representedService]]nullに設定します。 -
BluetoothRemoteGATTCharacteristic
characteristicのうち、 関連設定オブジェクトが settings であるものについて、characteristic.が invalidatedAttributes に含まれていれば、[[representedCharacteristic]]characteristic.を[[representedCharacteristic]]nullに設定します。 -
BluetoothRemoteGATTDescriptor
descriptorのうち、 関連設定オブジェクトが settings であるものについて、descriptor.が invalidatedAttributes に含まれていれば、[[representedDescriptor]]descriptor.を[[representedDescriptor]]nullに設定します。 -
global を settings の グローバルオブジェクトとします。
-
global.navigator.bluetooth.から、invalidatedAttributes に含まれる属性を表すすべてのエントリを削除します。[[attributeInstanceMap]]
-
-
changedServices を空集合の Service の集合とします。
-
同一の Service が removedAttributes と addedAttributes の両方に現れる場合、それを両方から削除し、changedServices に追加します。
-
removedAttributes または addedAttributes にある各 Characteristic および Descriptor について、 それを元のリストから削除し、その親の Service を changedServices に追加します。
注記: この時点以降、removedAttributes と addedAttributes には Service のみが含まれます。 -
ある Service が addedAttributes に含まれていても、それが過去の
getPrimaryService、getPrimaryServices、getIncludedService、 またはgetIncludedServicesのいずれの呼び出し時点でも存在していたとしても返されなかったであろう場合、 UA はその Service を addedAttributes から削除してもよい(MAY)とします。 -
changedDevices を、 removedAttributes、addedAttributes、changedServices のいずれかに Service を含む Bluetooth デバイスの集合とします。
-
changedDevices 内のデバイスに接続している各
BluetoothDevicedeviceObj について、グローバルタスクをキューして、 Bluetooth タスクソース上で deviceObj の 関連付けられたグローバルオブジェクトに与え、次の手順を実行します:-
removedAttributes 内の各 Service service について:
-
deviceObj.が[[allowedServices]]"all"であるか、当該 Service の UUID を含む場合、 イベントを発火します。イベント名はserviceremovedで、bubbles属性をtrueに初期化して、 その BluetoothRemoteGATTService に対して発火します。 -
この
BluetoothRemoteGATTServiceを Bluetooth ツリーから削除します。
-
-
addedAttributes 内の各 Service について、
deviceObj.が[[allowedServices]]"all"であるか、当該 Service の UUID を含む場合、 当該 Service を表すBluetoothRemoteGATTServiceを Bluetooth ツリーに追加し、 続いて イベントを発火します。イベント名はserviceaddedで、bubbles属性をtrueに初期化して、そのBluetoothRemoteGATTServiceに対して発火します。 -
changedServices 内の各 Service について、
deviceObj.が[[allowedServices]]"all"であるか、当該 Service の UUID を含む場合、 イベントを発火します。イベント名はservicechangedで、bubbles属性をtrueに初期化して、 当該BluetoothRemoteGATTServiceに対して発火します。
-
6.6.6. IDL イベントハンドラー
[SecureContext ]interface mixin {CharacteristicEventHandlers attribute EventHandler oncharacteristicvaluechanged ; };
oncharacteristicvaluechanged は、
Event handler IDL 属性であり、
characteristicvaluechanged
イベント型のためのものです。
[SecureContext ]interface mixin {BluetoothDeviceEventHandlers attribute EventHandler onadvertisementreceived ;attribute EventHandler ongattserverdisconnected ; };
onadvertisementreceived
は、Event handler IDL 属性であり、
advertisementreceived
イベント型のためのものです。
ongattserverdisconnected
は、Event handler IDL 属性であり、
gattserverdisconnected
イベント型のためのものです。
[SecureContext ]interface mixin {ServiceEventHandlers attribute EventHandler onserviceadded ;attribute EventHandler onservicechanged ;attribute EventHandler onserviceremoved ; };
onserviceadded は、
Event handler IDL 属性であり、
serviceadded
イベント型のためのものです。
onservicechanged は、
Event handler IDL 属性であり、
servicechanged
イベント型のためのものです。
onserviceremoved は、
Event handler IDL 属性であり、
serviceremoved
イベント型のためのものです。
6.7. エラー処理
Error Response
を返した場合、UA は次を実行しなければなりません(MUST):
-
もし 手続きがタイムアウトするか、 Profile Fundamentals に記述の ATT Bearer が何らかの理由で存在しない/終了している場合、 当該手順から
NetworkErrorを返し、これらの手順を中止します。 -
Error Codeに応じて、次のとおりにします:Invalid PDUInvalid OffsetAttribute Not FoundUnsupported Group Type-
これらのエラーコードはプロトコル層で予期しない事象(UA またはデバイスのバグの可能性)を示します。
当該手順から
NotSupportedErrorを返します。 Invalid Handle-
当該手順から
InvalidStateErrorを返します。 Invalid Attribute Value Length-
当該手順から
InvalidModificationErrorを返します。 Attribute Not Long-
このエラーコードを「Long」サブ手続きを用いずに受信した場合、デバイスのバグを示す可能性があります。 当該手順から
NotSupportedErrorを返します。それ以外の場合、「Long」サブ手続きを使用せずに当該手順を再試行します。 書き込み値の長さのためにそれが不可能であれば、
InvalidModificationErrorを返します。 Insufficient AuthenticationInsufficient EncryptionInsufficient Encryption Key Size-
UA は接続のセキュリティレベルを引き上げるよう試みるべきです(SHOULD)。
この試みが失敗した、または UA がより高いセキュリティをサポートしない場合、
当該手順から
SecurityErrorを返します。 そうでなければ、より高いセキュリティレベルで当該手順を再試行します。 Insufficient Authorization-
当該手順から
SecurityErrorを返します。 Application Error-
GATT 手続きが Write であった場合、
当該手順から
InvalidModificationErrorを返します。そうでなければ、NotSupportedErrorを返します。 Read Not PermittedWrite Not PermittedRequest Not SupportedPrepare Queue FullInsufficient ResourcesUnlikely Error- その他
-
当該手順から
NotSupportedErrorを返します。
7. UUID
typedef DOMString ;UUID
UUID 文字列は 128-bit の
[RFC4122] UUID を表します。
有効な
UUID は、
[ECMAScript]
の正規表現 /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/ に一致する文字列です。
つまり、有効な UUID は小文字であり、
Bluetooth 規格で定義される 16-bit や 32-bit の省略形は使用しません。
本仕様の関数や属性から返されるすべての UUID は 有効な UUID
でなければなりません(MUST)。
さらに、本仕様の関数が UUID 型のパラメータ、
あるいは UUID 属性を含む辞書を受け取り、
任意の UUID スロットに渡された引数が
有効な UUID でない場合、
その関数は 拒否された promise を返し、TypeError
で他の手順を中止しなければなりません(MUST)。
BluetoothUUID.canonicalUUID(alias)
関数を提供し、16-bit/32-bit の Bluetooth の
UUID エイリアスを 128-bit 形式にマップします。
7.1. 標準化された UUID
Bluetooth SIG は [BLUETOOTH-ASSIGNED] で、サービス、characteristic、descriptor、その他のエンティティを識別する UUID のレジストリを管理しています。 本節は、スクリプトがそれらの UUID を名前で参照できる方法を提供し、各アプリケーションで繰り返し定義する必要がないようにします。
有効な名前は、
[ECMAScript]
の正規表現 /^[a-z0-9_-.]+$/ に一致する文字列です。
[Exposed =Window ]interface {BluetoothUUID static UUID getService ((DOMString or unsigned long ));name static UUID getCharacteristic ((DOMString or unsigned long ));name static UUID getDescriptor ((DOMString or unsigned long ));name static UUID canonicalUUID ([EnforceRange ]unsigned long ); };alias typedef (DOMString or unsigned long )BluetoothServiceUUID ;typedef (DOMString or unsigned long )BluetoothCharacteristicUUID ;typedef (DOMString or unsigned long )BluetoothDescriptorUUID ;
静的メソッド BluetoothUUID. は、呼び出されたとき、
16-bit または 32-bit の UUID エイリアス alias が表す
128-bit UUID を返さなければなりません(MUST)。
canonicalUUID(alias)
00000000-0000-1000-8000-00805f9b34fb」の上位 32 ビットをエイリアスのビットで置き換えることから成ります。
例えば、canonicalUUID(0xDEADBEEF) は
"deadbeef-0000-1000-8000-00805f9b34fb" を返します。
BluetoothServiceUUID は、
16/32-bit の UUID エイリアス、有効な UUID、
および GATT assigned
services のキーからの
有効な名前を表します。言い換えると、
BluetoothUUID.getService()
が例外を投げない値に相当します。
BluetoothCharacteristicUUID は、
16/32-bit の UUID エイリアス、有効な UUID、
および GATT assigned characteristics のキーからの
有効な名前を表します。言い換えると、
BluetoothUUID.getCharacteristic()
が例外を投げない値に相当します。
BluetoothDescriptorUUID は、
16/32-bit の UUID エイリアス、有効な UUID、
および GATT
assigned descriptors のキーからの
有効な名前を表します。言い換えると、
BluetoothUUID.getDescriptor()
が例外を投げない値に相当します。
-
もし name が
unsigned longであれば、BluetoothUUID.canonicalUUID(name) を返し、これらの手順を中止します。 -
もし name が 有効な UUID であれば、 name を返し、これらの手順を中止します。
-
もし name が 有効な名前 で、 GATT assigned numbers において 有効な UUID に対応しているなら、 その割り当て番号を alias とし、
BluetoothUUID.canonicalUUID(alias) を返します。 -
それ以外の場合、
TypeErrorを投げます。
静的メソッド BluetoothUUID. は、呼び出されたとき、
ResolveUUIDName(
getService(name)name, GATT assigned services)
を返さなければなりません(MUST)。
静的メソッド BluetoothUUID. は、呼び出されたとき、
ResolveUUIDName(
getCharacteristic(name)name, GATT assigned
characteristics) を返さなければなりません(MUST)。
静的メソッド BluetoothUUID. は、呼び出されたとき、
ResolveUUIDName(
getDescriptor(name)name, GATT assigned
descriptors) を返さなければなりません(MUST)。
BluetoothUUID.getService(" cycling_power")
は "00001818-0000-1000-8000-00805f9b34fb" を返します。
は BluetoothUUID.getService("00001801-0000-1000-8000-00805f9b34fb")"00001801-0000-1000-8000-00805f9b34fb" を返します。
は BluetoothUUID.getService("unknown-service")TypeError
を投げます。
は BluetoothUUID.getCharacteristic("ieee_11073-20601_regulatory_certification_data_list")"00002a2a-0000-1000-8000-00805f9b34fb" を返します。
は BluetoothUUID.getDescriptor("gatt.characteristic_presentation_format")"00002904-0000-1000-8000-00805f9b34fb" を返します。
7.2. GATT 割り当て番号
この仕様は、標準化された GATT のサービス、characteristic、descriptor を利用する開発者の可読性を高めるために、 GATT 割り当て番号に対する人間が読める名前を提供します。GATT 割り当て番号のファイルは https://github.com/WebBluetoothCG/registries リポジトリにあります。
-
url をフェッチし、そのボディを UTF-8 でデコードしたものを contents とします。
-
lines を contents を
'\n'で分割したものとします。 -
result を空のマップとします。
-
lines 内の各 line について、次の副手順を実行します:
-
もし line が空、または先頭文字が
'#'であれば、次の行へ進みます。 -
もし line が valid name、スペース (U+0020)、および valid UUID からなる場合、 name をその名前、uuid をその UUID とします。
-
それ以外の場合はエラーを返し、これらの手順を中止します。
-
もし name がすでに result にある場合はエラーを返し、これらの手順を中止します。
-
result において name から uuid への対応を追加します。
-
-
result を返します。
GATT 割り当てサービスは、 GATT 割り当て番号の構文解析を https://github.com/WebBluetoothCG/registries/blob/master/gatt_assigned_services.txt で行った結果です。 UA はこのファイルを定期的に再フェッチするべきですが、その頻度は未規定です。
GATT 割り当て characteristic は、 GATT 割り当て番号の構文解析を https://github.com/WebBluetoothCG/registries/blob/master/gatt_assigned_characteristics.txt で行った結果です。 UA はこのファイルを定期的に再フェッチするべきですが、その頻度は未規定です。
GATT 割り当て descriptor は、 GATT 割り当て番号の構文解析を https://github.com/WebBluetoothCG/registries/blob/master/gatt_assigned_descriptors.txt で行った結果です。 UA はこのファイルを定期的に再フェッチするべきですが、その頻度は未規定です。
8. Advertising Data Filter
広告データフィルターは、メーカーまたはサービスデータとの照合方法を表します。
-
words を、input を strictly split で
/区切りにしたものとします。 -
もし words の長さが
2に等しくなければ、エラーを返してこれらの手順を中止します。 -
もし words[0] の長さが words[1] の長さに等しくなければ、エラーを返して これらの手順を中止します。
-
prefixData を words[0] とします。
-
prefixMask を words[1] とします。
-
もし prefixData または prefixMask が ascii lower hex digit の並びでなければ、エラーを返します。
-
prefixIndex を
0とします。 -
dataList を空のリストとします。
-
maskList を空のリストとします。
-
prefixIndex が prefixData の長さより小さい間、次の副手順を実行します:
-
data を、prefixData のインデックス prefixIndex と
prefixIndex + 1の文字を 16 進数として解釈した結果とします。 -
mask を、prefixMask のインデックス prefixIndex と
prefixIndex + 1の文字を 16 進数として解釈した結果とします。 -
dataList に data を追加します。
-
maskList に mask を追加します。
-
prefixIndex を
|prefixIndex| + 2に設定します。
-
-
result を新しい
BluetoothDataFilterInit辞書とします。 -
result[
dataPrefix] を、dataList を用いて構築したUint8Arrayに設定します。 -
result[
mask] を、maskList を用いて構築したUint8Arrayに設定します。 -
result を返します。
9. ブロックリスト
この仕様は、ウェブサイトがアクセスできる GATT 属性およびメーカー・データの集合を制限するために、 https://github.com/WebBluetoothCG/registries リポジトリ内のブロックリストファイルに依存します。
valid company
identifier string は、
ascii lower hex digit の並びで、
長さが 0 より大きく 5 未満であるものです。公式の会社識別子一覧は
Bluetooth Assigned Numbers
のサイトにあります。
BluetoothDataFilterInit
のリストへのマップ、
またはエラーであり、次のアルゴリズムによって生成されます:
-
url をフェッチし、そのボディを UTF-8 でデコードしたものを contents とします。
-
lines を、contents に対してセパレーター
'\n'を用いてsplit(separator, limit)を呼び出した結果とします。 -
result を空のマップとします。
-
lines 内の各 line について、次の副手順を実行します:
-
もし line が空、または先頭文字が
'#'であれば、次の行へ進みます。 -
regExp を、'manufacturer\ ([0-9a-f]+)\ ([0-9a-f]+\/[0-9a-f]+)' で構築した
RegExpとします。 -
matchResult を、line に対して regExp.
exec(string)を呼び出した結果とし、matchResult がnullまたは matchResult の長さが3に等しくない場合はエラーを返します。 -
companyIdentifierStr を、matchResult[1] が valid company identifier string であるときは matchResult[1] とし、そうでなければエラーを返します。
-
companyIdentifier を、companyIdentifierStr を 16 進数として解釈した結果とします。
-
dataPrefixStr を matchResult[2] とします。
-
もし companyIdentifier が result に存在しなければ、 result[companyIdentifier] を空のリストに設定します。
-
dataFilter を、dataPrefixStr に対して advertising data filter を構文解析 した結果(エラーでない場合)とし、エラーであればエラーを返します。
-
result[companyIdentifier] に dataFilter を追加します。
-
-
result を返します。
-
url をフェッチし、そのボディを UTF-8 でデコードしたものを contents とします。
-
lines を contents を
'\n'で分割したものとします。 -
result を空のマップとします。
-
lines 内の各 line について、次の副手順を実行します:
-
もし line が空、または先頭文字が
'#'であれば、次の行へ進みます。 -
もし line が valid UUID のみから成る場合、 uuid をその UUID、token を "
exclude" とします。 -
もし line が valid UUID、スペース (U+0020)、および "
exclude-reads" または "exclude-writes" のいずれかのトークンから成る場合、 uuid をその UUID、token をそのトークンとします。 -
それ以外の場合はエラーを返し、これらの手順を中止します。
-
もし uuid がすでに result にある場合はエラーを返し、これらの手順を中止します。
-
result において uuid から token への対応を追加します。
-
-
result を返します。
GATT blocklist は、 gatt blocklist の構文解析を https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt で行った結果です。 Manufacturer Data blocklist は、 manufacturer data blocklist の構文解析を https://github.com/WebBluetoothCG/registries/blob/master/manufacturer_data_blocklist.txt で行った結果です。 UA はブロックリストを定期的に再フェッチするべきですが、その頻度は未規定です。
UUID は、
blocklisted であるのは、
GATT blocklist
の値がエラーである場合、または
その UUID が GATT blocklist で
"exclude" にマップされる場合です。
UUID は、
blocklisted for
reads であるのは、
GATT blocklist
の値がエラーである場合、または
その UUID が GATT blocklist で
"exclude" もしくは "exclude-reads" にマップされる場合です。
UUID は、
blocklisted for
writes であるのは、
GATT blocklist
の値がエラーである場合、または
その UUID が GATT blocklist で
"exclude" もしくは "exclude-writes" にマップされる場合です。
blocked を返す場合に
blocklisted
manufacturer data です:
-
もし Manufacturer Data blocklist の値がエラーであれば、
blockedを返します。 -
manufacturerBlocklist を、 Manufacturer Data blocklist の値とします。
-
companyIdentifier を manufacturerData の会社識別子とします。
-
もし companyIdentifier が manufacturerBlocklist に存在しなければ、
unblockedを返します。 -
manufacturerBlocklist[companyIdentifier] 内の各 dataFilter について、 次の副手順を実行します:
-
もし manufacturerData の広告データが matches で dataFilter に一致するなら、
blockedを返します。
-
-
unblockedを返します。
blocked を返す場合に
blocklisted manufacturer data filter
です:
-
もし Manufacturer Data blocklist の値がエラーであれば、
blockedを返します。 -
manufacturerBlocklist を、 Manufacturer Data blocklist の値とします。
-
companyIdentifier を manufacturerDataFilter["
companyIdentifier"] とします。 -
もし companyIdentifier が manufacturerBlocklist に存在しなければ、
unblockedを返します。 -
manufacturerBlocklist[companyIdentifier] 内の各 dataFilter について、 次の副手順を実行します:
-
もし manufacturerDataFilter が dataFilter の strict subset であれば、
blockedを返します。
-
-
unblockedを返します。
10. Navigator インターフェイスの拡張
[SecureContext ]partial interface Navigator { [SameObject ]readonly attribute Bluetooth bluetooth ; };
各 Navigator
は、associated
Bluetooth(Bluetooth
オブジェクト)を持ちます。
Navigator
オブジェクトの作成時に、その
associated
Bluetooth は、
その Navigator
オブジェクトの
relevant realm で作成された新しい
Bluetooth
オブジェクトに設定されなければなりません。
Navigator
の
bluetooth ゲッター手順は、
this の associated
Bluetooth を返すことです。
11. 統合
11.1. Permissions Policy
この仕様は、トークン "bluetooth" によって識別される
policy-controlled feature を定義します。
これは、bluetooth
属性によって公開されるメソッドが
Navigator
オブジェクト上で利用可能かどうかを制御します。
この機能の
default allowlist は
["self"] です。
12. 自動テスト
ユーザーエージェントの自動化およびアプリケーションテストの目的のために、この文書は [WebDriver-BiDi] 仕様への拡張を定義します。
Web Bluetooth API とその拡張仕様は、物理的なハードウェアデバイスが予測可能な方法で応答することを必要とするため、 それらのインターフェイスを完全にテストすることがテスト作成者にとって課題となります。 この課題に対処するために、本書は物理デバイスとその広告と同様に振る舞う、シミュレートされた周辺機器と広告を定義・制御する いくつかの WebDriver-BiDi の拡張コマンドを定義します。これらのシミュレートされた周辺機器と広告は特定のプロパティを持つデバイスを表し、 その読み取り値はユーザーによって完全に定義できます。
各 top-level traversable は、 ソフトウェアで定義された Bluetooth アダプターで、発見済みの simulated Bluetooth devices を保持し、 Central のような役割を担うことができる simulated Bluetooth adapter を持つことがあります。
各 simulated Bluetooth adapter は、
Bluetooth アドレスの strings
から
simulated Bluetooth devices への
ordered
map である
simulated
Bluetooth device mapping
を持ちます。
各 simulated Bluetooth adapter は、 現在のアダプターの状態を表す文字列の列挙である adapter state を持ちます。 取り得る列挙値は次のとおりです:
-
"powered-on"
-
"powered-off"
-
"absent"
各 simulated Bluetooth adapter は、 アダプターが Bluetooth Low Energy をサポートするかどうかを示す boolean である low-energy supported state を持ちます。
シミュレートされたBluetoothデバイスは、物理デバイスのように動作するソフトウェア定義のBluetoothデバイスであり、シミュレートされたBluetoothアダプターに接続される場合があり、Manufacturer Specific DataやサービスUUIDなどの関連プロパティを持つ場合があり、そしてシミュレートされたGATTサービスマッピングを持っている。これはBluetooth順序付きマップであり、UUID文字列からシミュレートされたGATTサービスへの対応関係を持つ。
simulated GATT service は、ソフトウェアで定義された Service で、 simulated Bluetooth device に属し、 UUID のプロパティを持ち、 Bluetooth cache に既知の存在として登録され、 さらに Bluetooth の ordered map である simulated GATT characteristic mapping (UUID 文字列から simulated GATT characteristics へのマップ)を持ちます。
simulated GATT characteristic は、ソフトウェアで定義された Characteristic で、 simulated GATT service に属し、 UUID と Characteristic Properties のプロパティを持ち、 Bluetooth cache に既知の存在として登録され、 さらに Bluetooth の ordered map である simulated GATT descriptor mapping (UUID 文字列から simulated GATT descriptors へのマップ)を持ちます。
Simulated GATT characteristic properties は、 Characteristic Properties のソフトウェアで定義されたもので、 simulated GATT characteristic に属し、 Bluetooth cache に既知の存在として登録されます。
simulated GATT descriptor は、ソフトウェアで定義された Descriptor で、 simulated GATT characteristic に属し、 UUID のプロパティを持ち、 Bluetooth cache に既知の存在として登録されます。
CDDL スニペットは、 CDDL スニペットの独立したプログラム処理を可能にするために "browsingContext.BrowsingContext" の代わりに "text" 型を使用します。現在、他のモジュールは参照できません。
12.1. 定義
bluetooth.BluetoothUuid= text;bluetooth.BluetoothManufacturerData= {key: uint,data: tstr };bluetooth.CharacteristicProperties= { ?broadcast: bool, ?read: bool, ?writeWithoutResponse: bool, ?write: bool, ?notify: bool, ?indicate: bool, ?authenticatedSignedWrites: bool, ?extendedProperties: bool }
key- Company Identifier Code です。
data- メーカー・データの byte sequence を base64 エンコードしたものです。
12.2. bluetooth モジュール
bluetooth モジュールには、リモート側の Bluetooth の挙動を管理するためのコマンドが含まれます。
12.2.1. 型
12.2.1.1. bluetooth.RequestDevice 型
bluetooth.RequestDevice = text
bluetooth.RequestDevice は、デバイス選択プロンプト内の 1 つのデバイスを識別するための識別子です。
device prompt は、
tuple で、
文字列である device prompt id と、
set
である
set of devices(BluetoothDevice
オブジェクトの集合)
から構成されます。これはユーザーが
choose によって
Bluetooth device
を選択できるプロンプトを表します。
12.2.1.2. bluetooth.RequestDeviceInfo 型
bluetooth.RequestDeviceInfo = { id : bluetooth.RequestDevice , name : text/ null, }
bluetooth.RequestDeviceInfo は、デバイス選択プロンプト内の 1 つのデバイスを表します。
BluetoothDevice
device が与えられたときに、
デバイスを直列化するには:
12.2.1.3. bluetooth.RequestDevicePrompt 型
bluetooth.RequestDevicePrompt = text
bluetooth.RequestDevicePrompt は、単一のプロンプトを識別するための識別子です。
リモート側は、map である map of navigables to device prompts を持ち、 そのキーは navigable ids、値は device prompts です。
-
promptMap を map of navigables to device prompts とします。
-
もし promptMap[navigableId] が exist しなければ:
-
error を返します。error code は no such prompt です。
-
-
prompt を map of navigables to device prompts[navigableId] とします。
-
もし prompt の device prompt id が promptId でない場合:
-
error を返します。error code は no such prompt です。
-
-
success をデータ prompt とともに返します。
-
prompt の set of devices 内の各 device について:
-
それ以外の場合:
-
error を返します。error code は no such device です。
-
-
devices を空の list とします。
-
prompt の set of devices 内の各 device について。
-
devices を返します。
12.2.1.4. bluetooth.ScanRecord 型
bluetooth.ScanRecord = { ? name : text, ? uuids : [ * bluetooth.BluetoothUuid ], ? appearance : number, ? manufacturerData : [ * bluetooth.BluetoothManufacturerData ], }
bluetooth.ScanRecord は、
Bluetooth device
によって送信された
広告パケットのデータを表します。
name- Bluetooth device のローカル名、 もしくはそのプレフィックスです。
uuids- このスキャンレコードが、その Bluetooth device の GATT サーバーがサポートしていると示す Service UUID の一覧です。
appearance- Appearance であり、
gap.appearancecharacteristic によって定義される値の一つです。 manufacturerDataBluetoothManufacturerDataのリストで、unsigned shortの Company Identifier Code から、 base64 エンコードされたメーカー・データの byte sequences へのマッピングです。
12.2.2. エラー
この仕様は、エラーコードの集合を WebDriver BiDi から拡張し、以下の追加コードを定義します:
- no such device
- 未知の
BluetoothDeviceを参照しようとしました。 - no such prompt
- 未知の device prompt を参照しようとしました。
12.2.3. コマンド
BluetoothCommand = ( bluetooth.HandleRequestDevicePrompt // bluetooth.SimulateAdapter // bluetooth.DisableSimulation // bluetooth.SimulatePreconnectedPeripheral // bluetooth.SimulateAdvertisement // bluetooth.SimulateGattConnectionResponse // bluetooth.SimulateGattDisconnection // bluetooth.SimulateService // bluetooth.SimulateCharacteristic // bluetooth.SimulateCharacteristicResponse // bluetooth.SimulateDescriptor // bluetooth.SimulateDescriptorResponse )
12.2.3.1. bluetooth.handleRequestDevicePrompt コマンド
bluetooth.HandleRequestDevicePrompt = ( method : "bluetooth.handleRequestDevicePrompt" , params : bluetooth.HandleRequestDevicePromptParameters , ) bluetooth.HandleRequestDevicePromptParameters = { context : text, prompt : bluetooth.RequestDevicePrompt , ( bluetooth.HandleRequestDevicePromptAcceptParameters // bluetooth.HandleRequestDevicePromptCancelParameters ) } bluetooth.HandleRequestDevicePromptAcceptParameters = ( accept : true, device : bluetooth.RequestDevice , ) bluetooth.HandleRequestDevicePromptCancelParameters = ( accept : false, )
-
contextId を params[
"context"] とします。 -
promptId を params[
"prompt"] とします。 -
accept を、command parameters の
acceptフィールドの値とします。 -
もし accept が true の場合:
-
deviceId を、command parameters の
deviceフィールドの値とします。 -
device を、試行して プロンプト内のデバイスに一致 させた結果とし、 引数は prompt と deviceId とします。
-
device を用いて prompt を承認します。
-
-
それ以外の場合:
-
prompt を却下します。
-
-
success をデータ
nullとともに返します。
{ "method" : "bluetooth.handleRequestDevicePrompt" , "params" : { "context" : "cxt-d03fdd81" , "prompt" : "pmt-e0a234b" , "accept" : true , "device" : "dvc-9b3b872" } }
12.2.3.2. bluetooth.simulateAdapter コマンド
bluetooth.SimulateAdapter = ( method : "bluetooth.simulateAdapter" , params : bluetooth.SimulateAdapterParameters , ) bluetooth.SimulateAdapterParameters = { context : text, ? leSupported : bool, state : "absent" / "powered-off" / "powered-on" }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
もし navigable が トップレベルトラバーサブルでなければ、error を エラーコード invalid argument とともに返します。
-
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、次の手順を実行します:
-
もし params[
"leSupported"] が 存在しない 場合、 params["leSupported"] をtrueに設定します。 -
simulatedBluetoothAdapter を新しい simulated Bluetooth adapter とします。
-
simulatedBluetoothAdapter の LE supported state を params[
"leSupported"] に設定します。 -
simulatedBluetoothAdapter の adapter state を params[
"state"] に設定します。 -
navigable の simulated Bluetooth adapter を simulatedBluetoothAdapter に設定します。
-
success をデータ
nullとともに返します。
-
-
もし simulatedBluetoothAdapter が空でない場合、次の手順を実行します:
-
もし params[
"leSupported"] が 存在する 場合、error を エラーコード invalid argument とともに返します。 -
simulatedBluetoothAdapter の adapter state を params[
"state"] に設定します。 -
success をデータ
nullとともに返します。
-
{ "method" : "bluetooth.simulateAdapter" , "params" : { "context" : "cxt-d03fdd81" , "leSupported" : true , "state" : "powered-on" , } }
{ "method" : "bluetooth.simulateAdapter" , "params" : { "context" : "cxt-d03fdd81" , "state" : "powered-off" , } }
12.2.3.3. bluetooth.disableSimulation コマンド
bluetooth.DisableSimulation = ( method : "bluetooth.disableSimulation" , params : bluetooth.DisableSimulationParameters , ) bluetooth.DisableSimulationParameters = { context : text}
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
もし navigable が トップレベルトラバーサブルでなければ、error を エラーコード invalid argument とともに返します。
-
navigable の simulated Bluetooth adapter を空に設定します。
-
success をデータ
nullとともに返します。
{ "method" : "bluetooth.disableSimulation" , "params" : { "context" : "cxt-d03fdd81" } }
12.2.3.4. bluetooth.simulatePreconnectedPeripheral コマンド
bluetooth.SimulatePreconnectedPeripheral = ( method : "bluetooth.simulatePreconnectedPeripheral" , params : bluetooth.SimulatePreconnectedPeripheralParameters , ) bluetooth.SimulatePreconnectedPeripheralParameters = { context : text, address : text, name : text, manufacturerData : [ * bluetooth.BluetoothManufacturerData ], knownServiceUuids : [ * bluetooth.BluetoothUuid ] }
-
contextId を params["context"] とします。
-
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
もし navigable が トップレベルトラバーサブルでなければ、error を エラーコード invalid argument とともに返します。
-
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceAddress を params[
"address"] とします。 -
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合、 error を エラーコード invalid argument とともに返します。
-
simulatedBluetoothDevice を新しい simulated Bluetooth device とします。
-
simulatedBluetoothDevice の name を params[
"name"] に設定します。 -
simulatedBluetoothDevice の address を params[
"address"] に設定します。 -
simulatedBluetoothDevice の manufacturer specific data を、params[
"manufacturerData"] に対して実行した forgiving-base64 decode の出力に設定します。 -
simulatedBluetoothDevice の service UUIDs を params[
"knownServiceUuids"] に設定します。 -
deviceMapping[deviceAddress] に simulatedBluetoothDevice を設定します。
-
success をデータ
nullとともに返します。
{ "method" : "bluetooth.simulatePreconnectedPeripheral" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "name" : "Some Device" , "manufacturerData" : [ { key: 17 , data : "AP8BAX8=" } ], "knownServiceUuids" : [ "12345678-1234-5678-9abc-def123456789" , ], } }
12.2.3.5. bluetooth.simulateAdvertisement コマンド
bluetooth.SimulateAdvertisement = ( method : "bluetooth.simulateAdvertisement" , params : bluetooth.SimulateAdvertisementParameters , ) bluetooth.SimulateAdvertisementParameters = { context : text, scanEntry : bluetooth.SimulateAdvertisementScanEntryParameters } bluetooth.SimulateAdvertisementScanEntryParameters = { deviceAddress : text, rssi : number, scanRecord : bluetooth.ScanRecord }
-
contextId を params[
"context"] とします。 -
topLevelNavigable を、試行して navigable を取得した contextId に対する結果とします。
-
もし topLevelNavigable が トップレベルトラバーサブルでなければ、error を エラーコード invalid argument とともに返します。
-
scanEntry を params[
"scanEntry"] とします。 -
deviceAddress を scanEntry[
"deviceAddress"] とします。 -
simulatedBluetoothAdapter を、topLevelNavigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とし、そうでない場合は simulatedDevice を新しい simulated Bluetooth device(deviceAddress を持つ)とし、 deviceMapping[deviceAddress] に simulatedDevice を設定します。
-
もし topLevelNavigable が現在 scan for devices アルゴリズムを実行中なら、 そのアルゴリズム内の変数 simulatedBluetoothDevices に simulatedDevice を挿入します。
他のアルゴリズムの変数へデータを挿入することは厳密には定義されていません。 実装に合わせるため、scan for devices アルゴリズムは非同期デバイス発見を定義する必要があります。
-
navigables を、topLevelNavigable の アクティブドキュメントの 包括的子孫 navigables とします。
-
navigables の各 navigable について:
-
document を navigable の アクティブドキュメント とします。
-
タスクをキューして、document の 関連設定オブジェクトの 責務を負うイベントループ上で次の副手順を実行します:
-
simulatedDeviceInstance を、
BluetoothDeviceを表すオブジェクトを取得した結果とし、 navigable の アクティブウィンドウの 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
もし simulatedDeviceInstance.
[[watchAdvertisementsState]]がnot-watchingであれば、これらの副手順を中止します。 -
advertisementreceivedイベントを発火し、 scanEntry["scanRecord"] が表す広告イベントに対して simulatedDeviceInstance 上で発生させます。
-
-
-
success をデータ
nullとともに返します。
{ "method" : "bluetooth.simulateAdvertisement" , "params" : { "context" : "cxt-d03fdd81" , "scanEntry" : { "deviceAddress" : "08:08:08:08:08:08" , "rssi" : -10 , "scanRecord" : { "name" : "Heart Rate" , "uuids" : [ "0000180d-0000-1000-8000-00805f9b34fb" ], "manufacturerData" : [ { key: 17 , data : "AP8BAX8=" } ], "appearance" : 1 , "txPower" : 1 } } } }
12.2.3.6. bluetooth.simulateGattConnectionResponse コマンド
bluetooth.SimulateGattConnectionResponse = ( method : "bluetooth.simulateGattConnectionResponse" , params : bluetooth.SimulateGattConnectionResponseParameters , ) bluetooth.SimulateGattConnectionResponseParameters = { context : text, address : text, code : uint}
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とし、 そうでない場合は error を エラーコード invalid argument とともに返します。
-
simulatedDeviceInstance を、
BluetoothDeviceを表すオブジェクトを取得した結果とし、 navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
もし simulatedDeviceInstance.
[[gatt]].[[automatedGATTConnectionResponse]]が"expected"であれば、 simulatedDeviceInstance.[[gatt]].[[automatedGATTConnectionResponse]]を params["code"] に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
0x00)の
デバイス gatt 接続レスポンスを、次のメッセージを送信することでシミュレートできます:
{ "method" : "bluetooth.simulateGattConnectionResponse" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "code" : 0 } }
12.2.3.7. bluetooth.simulateGattDisconnection コマンド
bluetooth.SimulateGattDisconnection = ( method : "bluetooth.simulateGattDisconnection" , params : bluetooth.SimulateGattDisconnectionParameters , ) bluetooth.SimulateGattDisconnectionParameters = { context : text, address : text, }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とし、 そうでない場合は error を エラーコード invalid argument とともに返します。
-
simulatedDeviceInstance を、
BluetoothDeviceを表すオブジェクトを取得した結果とし、 navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
もし simulatedDeviceInstance.
[[gatt]].[[automatedGATTConnectionResponse]]が"expected"であれば、 simulatedDeviceInstance.[[gatt]].[[automatedGATTConnectionResponse]]を0x15に設定します。0x15は List of Error Codes によれば"Remote Device Terminated Connection due to Power Off"を表します。これは、Bluetooth デバイスが GATT 接続試行に応答できない状況をシミュレートします。 -
それ以外の場合は、切断されたデバイスのクリーンアップを simulatedDeviceInstance に対して実行します。
{ "method" : "bluetooth.simulateGattDisconnection" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , } }
12.2.3.8. bluetooth.simulateService コマンド
bluetooth.SimulateService = ( method : "bluetooth.simulateService" , params : bluetooth.SimulateServiceParameters , ) bluetooth.SimulateServiceParameters = { context : text, address : text, uuid : bluetooth.BluetoothUuid , type : "add" / "remove" , }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
simulatedDeviceInstance を、
BluetoothDeviceを表すオブジェクトを取得した結果とし、 navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
serviceMapping を、simulatedDevice の simulated GATT service mapping とします。
-
uuid を params[
"uuid"] とします。 -
もし params[
"type"] が"add"の場合:-
もし serviceMapping[uuid] が 存在する 場合、error を エラーコード invalid element state とともに返します。
-
simulatedGattService を新しい simulated GATT service とします。
-
simulatedGattService の UUID を uuid に設定します。
-
serviceMapping[uuid] を simulatedGattService に設定します。
-
BluetoothRemoteGATTServiceを表すオブジェクトを作成し、 その結果のPromiseへの simulatedGattService からのマッピングを simulatedDeviceInstance.[[context]].[[attributeInstanceMap]]に追加します。 -
success をデータ
nullとともに返します。
-
-
もし params[
"type"] が"remove"の場合:-
もし serviceMapping[uuid] が 存在する 場合、simulatedGattService を serviceMapping[uuid] とします。
-
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
simulatedGattService を simulatedDeviceInstance.
[[context]].[[attributeInstanceMap]]から削除します。 -
serviceMapping から uuid を削除します。
-
success をデータ
nullとともに返します。
-
-
error を エラーコード invalid argument とともに返します。
{ "method" : "bluetooth.simulateService" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "uuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "type" : "add" } }
{ "method" : "bluetooth.simulateService" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "uuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "type" : "remove" } }
12.2.3.9. bluetooth.simulateCharacteristic コマンド
bluetooth.SimulateCharacteristic = ( method : "bluetooth.simulateCharacteristic" , params : bluetooth.SimulateCharacteristicParameters , ) bluetooth.SimulateCharacteristicParameters = { context : text, address : text, serviceUuid : bluetooth.BluetoothUuid , characteristicUuid : bluetooth.BluetoothUuid , ? characteristicProperties : bluetooth.CharacteristicProperties , type : "add" / "remove" }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
BluetoothDeviceを表すオブジェクトを取得した結果を simulatedDeviceInstance とし、navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
serviceMapping を、simulatedDevice の simulated GATT service mapping とします。
-
serviceUuid を params[
"serviceUuid"] とします。 -
もし serviceMapping[serviceUuid] が 存在する 場合は simulatedService を serviceMapping[serviceUuid] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
characteristicMapping を、simulatedService の simulated GATT characteristic mapping とします。
-
characteristicUuid を params[
"characteristicUuid"] とします。 -
もし params[
"type"] が"add"の場合:-
もし characteristicMapping[characteristicUuid] が 存在する 場合、error を エラーコード invalid element state とともに返します。
-
もし params[
"characteristicProperties"] が 存在しない 場合、error を エラーコード invalid argument とともに返します。 -
simulatedGattCharacteristicProperties を新しい simulated GATT characteristic properties とし、次を実行します:
-
properties を params[
"characteristicProperties"] とします。 -
もし properties[
"broadcast"] が 存在する 場合、 properties["broadcast"] がtrueなら simulatedGattCharacteristicProperties のBroadcastビットをセットします。 -
もし properties[
"read"] が 存在する 場合、 properties["read"] がtrueなら simulatedGattCharacteristicProperties のReadビットをセットします。 -
もし properties[
"writeWithoutResponse"] が 存在する 場合、 properties["writeWithoutResponse"] がtrueなら simulatedGattCharacteristicProperties のWrite Without Responseビットをセットします。 -
もし properties[
"write"] が 存在する 場合、 properties["write"] がtrueなら simulatedGattCharacteristicProperties のWriteビットをセットします。 -
もし properties[
"notify"] が 存在する 場合、 properties["notify"] がtrueなら simulatedGattCharacteristicProperties のNotifyビットをセットします。 -
もし properties[
"indicate"] が 存在する 場合、 properties["indicate"] がtrueなら simulatedGattCharacteristicProperties のIndicateビットをセットします。 -
もし properties[
"authenticatedSignedWrites"] が 存在する 場合、 properties["authenticatedSignedWrites"] がtrueなら simulatedGattCharacteristicProperties のAuthenticated Signed Writesビットをセットします。 -
もし properties[
"extendedProperties"] が 存在する 場合、 properties["extendedProperties"] がtrueなら simulatedGattCharacteristicProperties のExtended Propertiesビットをセットします。
-
-
simulatedGattCharacteristic を新しい simulated GATT characteristic とします。
-
simulatedGattCharacteristic の UUID を characteristicUuid に設定します。
-
simulatedGattCharacteristic の Characteristic Properties を simulatedGattCharacteristicProperties に設定します。
-
characteristicMapping[characteristicUuid] を simulatedGattCharacteristic に設定します。
-
BluetoothRemoteGATTCharacteristicを表すオブジェクトを作成し、 その結果のPromiseへの simulatedGattCharacteristic からのマッピングを simulatedDeviceInstance.[[context]].[[attributeInstanceMap]]に追加します。 -
success をデータ
nullとともに返します。
-
-
もし params[
"type"] が"remove"の場合:-
もし params[
"characteristicProperties"] が 存在する 場合、error を エラーコード invalid argument とともに返します。 -
もし characteristicMapping[characteristicUuid] が 存在する 場合、simulatedGattCharacteristic を characteristicMapping[characteristicUuid] とします。
-
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
simulatedGattCharacteristic を simulatedDeviceInstance.
[[context]].[[attributeInstanceMap]]から削除します。 -
characteristicUuid を characteristicMapping から削除します。
-
success をデータ
nullとともに返します。
-
-
error を エラーコード invalid argument とともに返します。
{ "method" : "bluetooth.simulateCharacteristic" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "serviceUuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "characteristicUuid" : "00002a21-0000-1000-8000-00805f9b34fb" , "characteristicProperties" : { "read" : true , "write" : true , "notify" : true }, "type" : "add" } }
{ "method" : "bluetooth.simulateCharacteristic" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "serviceUuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "characteristicUuid" : "00002a21-0000-1000-8000-00805f9b34fb" , "type" : "remove" } }
12.2.3.10. bluetooth.simulateCharacteristicResponse コマンド
bluetooth.SimulateCharacteristicResponse = ( method : "bluetooth.simulateCharacteristicResponse" , params : bluetooth.SimulateCharacteristicResponseParameters , ) bluetooth.SimulateCharacteristicResponseParameters = { context : text, address : text, serviceUuid : bluetooth.BluetoothUuid , characteristicUuid : bluetooth.BluetoothUuid , type : "read" / "write" / "subscribe-to-notifications" / "unsubscribe-from-notifications" , code : uint, ? data : [ * uint] }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とし、 それ以外の場合は error を エラーコード invalid argument とともに返します。
-
serviceMapping を、simulatedDevice の simulated GATT service mapping とします。
-
serviceUuid を params[
"serviceUuid"] とします。 -
もし serviceMapping[serviceUuid] が 存在する 場合は simulatedService を serviceMapping[serviceUuid] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
characteristicMapping を、simulatedService の simulated GATT characteristic mapping とします。
-
characteristicUuid を params[
"characteristicUuid"] とします。 -
もし characteristicMapping[characteristicUuid] が 存在する 場合は simulatedGattCharacteristic を characteristicMapping[characteristicUuid] とします。
-
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
BluetoothDeviceを表すオブジェクトを取得した結果を simulatedDeviceInstance とし、navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
promise を simulatedDeviceInstance.
[[context]].[[attributeInstanceMap]][simulatedGattCharacteristic] とします。 -
Upon fulfillment において、promise が characteristic で解決されたとき、次を実行します:
-
もし params[
"type"] がreadの場合、次を実行します:-
もし characteristic.
[[automatedCharacteristicReadResponse]]がexpectedであれば、 characteristic.[[automatedCharacteristicReadResponse]]を params["code"] に、 characteristic.[[automatedCharacteristicReadResponseData]]を a copy of the bytes held (params["data"] のバイト列のコピー)に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
-
もし params[
"type"] がwriteの場合、次を実行します:-
もし characteristic.
[[automatedCharacteristicWriteResponse]]がexpectedであれば、 characteristic.[[automatedCharacteristicWriteResponse]]を params["code"] に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
-
もし params[
"type"] がsubscribe-to-notificationsの場合、次を実行します:-
もし characteristic.
[[automatedCharacteristicSubscribeToNotificationsResponse]]がexpectedであれば、 characteristic.[[automatedCharacteristicSubscribeToNotificationsResponse]]を params["code"] に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
-
もし params[
"type"] がunsubscribe-from-notificationsの場合、次を実行します:-
もし characteristic.
[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]がexpectedであれば、 characteristic.[[automatedCharacteristicUnsubscribeFromNotificationsResponse]]を params["code"] に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
0x00(成功)となる
characteristic の読み取り操作のデータ付き応答を、次のメッセージを送信することでシミュレートできます:
{ "method" : "bluetooth.simulateCharacteristicResponse" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "serviceUuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "characteristicUuid" : "00002a21-0000-1000-8000-00805f9b34fb" , "type" : "read" , "code" : 0 , "data" : [ 1 , 2 ] } }
12.2.3.11. bluetooth.simulateDescriptor コマンド
bluetooth.SimulateDescriptor = ( method : "bluetooth.simulateDescriptor" , params : bluetooth.SimulateDescriptorParameters , ) bluetooth.SimulateDescriptorParameters = { context : text, address : text, serviceUuid : bluetooth.BluetoothUuid , characteristicUuid : bluetooth.BluetoothUuid , descriptorUuid : bluetooth.BluetoothUuid , type : "add" / "remove" }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
BluetoothDeviceを表すオブジェクトを取得した結果を simulatedDeviceInstance とし、navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
serviceMapping を、simulatedDevice の simulated GATT service mapping とします。
-
serviceUuid を params[
"serviceUuid"] とします。 -
もし serviceMapping[serviceUuid] が 存在する 場合は simulatedService を serviceMapping[serviceUuid] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
characteristicMapping を、simulatedService の simulated GATT characteristic mapping とします。
-
characteristicUuid を params[
"characteristicUuid"] とします。 -
もし characteristicMapping[characteristicUuid] が 存在する 場合は simulatedCharacteristic を characteristicMapping[characteristicUuid] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
descriptorMapping を、simulatedCharacteristic の simulated GATT descriptor mapping とします。
-
descriptorUuid を params[
"descriptorUuid"] とします。 -
もし params[
"type"] が"add"の場合:-
もし descriptorMapping[descriptorUuid] が 存在する 場合、error を エラーコード invalid element state とともに返します。
-
simulatedGattDescriptor を新しい simulated GATT descriptor とします。
-
simulatedGattDescriptor の UUID を descriptorUuid に設定します。
-
descriptorMapping[descriptorUuid] を simulatedGattDescriptor に設定します。
-
BluetoothRemoteGATTDescriptorを表すオブジェクトを作成し、 その結果のPromiseへの simulatedGattDescriptor からのマッピングを simulatedDeviceInstance.[[context]].[[attributeInstanceMap]]に追加します。 -
success をデータ
nullとともに返します。
-
-
もし params[
"type"] が"remove"の場合:-
もし descriptorMapping[descriptorUuid] が 存在する 場合、simulatedGattDescriptor を descriptorMapping[descriptorUuid] とします。
-
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
simulatedGattDescriptor を simulatedDeviceInstance.
[[context]].[[attributeInstanceMap]]から削除します。 -
descriptorUuid を descriptorMapping から削除します。
-
success をデータ
nullとともに返します。
-
-
error を エラーコード invalid argument とともに返します。
{ "method" : "bluetooth.simulateDescriptor" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "serviceUuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "characteristicUuid" : "00002a21-0000-1000-8000-00805f9b34fb" , "descriptorUuid" : "00002901-0000-1000-8000-00805f9b34fb" , "type" : "add" } }
{ "method" : "bluetooth.simulateDescriptor" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "serviceUuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "characteristicUuid" : "00002a21-0000-1000-8000-00805f9b34fb" , "descriptorUuid" : "00002901-0000-1000-8000-00805f9b34fb" , "type" : "remove" } }
12.2.3.12. bluetooth.simulateDescriptorResponse コマンド
bluetooth.SimulateDescriptorResponse = ( method : "bluetooth.simulateDescriptorResponse" , params : bluetooth.SimulateDescriptorResponseParameters , ) bluetooth.SimulateDescriptorResponseParameters = { context : text, address : text, serviceUuid : bluetooth.BluetoothUuid , characteristicUuid : bluetooth.BluetoothUuid , descriptorUuid : bluetooth.BluetoothUuid , type : "read" / "write" , code : uint, ? data : [ * uint] }
-
contextId を params[
"context"] とします。 -
navigable を、試行して navigable を取得した contextId に対する結果とします。
-
deviceAddress を params[
"address"] とします。 -
simulatedBluetoothAdapter を、navigable の simulated Bluetooth adapter とします。
-
もし simulatedBluetoothAdapter が空であれば、error を エラーコード invalid argument とともに返します。
-
deviceMapping を、simulatedBluetoothAdapter の simulated Bluetooth device mapping とします。
-
もし deviceMapping[deviceAddress] が 存在する 場合は simulatedDevice を deviceMapping[deviceAddress] とし、 それ以外の場合は error を エラーコード invalid argument とともに返します。
-
serviceMapping を、simulatedDevice の simulated GATT service mapping とします。
-
serviceUuid を params[
"serviceUuid"] とします。 -
もし serviceMapping[serviceUuid] が 存在する 場合は simulatedService を serviceMapping[serviceUuid] とします。
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
characteristicMapping を、simulatedService の simulated GATT characteristic mapping とします。
-
characteristicUuid を params[
"characteristicUuid"] とします。 -
もし characteristicMapping[characteristicUuid] が 存在する 場合は simulatedCharacteristic を characteristicMapping[characteristicUuid] とします。
-
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
descriptorMapping を、simulatedCharacteristic の simulated GATT descriptor mapping とします。
-
descriptorUuid を params[
"descriptorUuid"] とします。 -
もし descriptorMapping[descriptorUuid] が 存在する 場合は simulatedDescriptor を descriptorMapping[descriptorUuid] とします。
-
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
BluetoothDeviceを表すオブジェクトを取得した結果を simulatedDeviceInstance とし、navigable の アクティブウィンドウ の 対応するNavigatorの associated Bluetooth 内で simulatedDevice を表すものとします。 -
promise を simulatedDeviceInstance.
[[context]].[[attributeInstanceMap]][simulatedDescriptor] とします。 -
Upon fulfillment において、promise が descriptor で解決されたとき、次を実行します:
-
もし params[
"type"] がreadの場合、次を実行します:-
もし descriptor.
[[automatedDescriptorReadResponse]]がexpectedであれば、 descriptor.[[automatedDescriptorReadResponse]]を params["code"] に、 descriptor.[[automatedDescriptorReadResponseData]]を a copy of the bytes held (params["data"] のバイト列のコピー)に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
-
もし params[
"type"] がwriteの場合、次を実行します:-
もし characteristic.
[[automatedDescriptorWriteResponse]]がexpectedであれば、 characteristic.[[automatedDescriptorWriteResponse]]を params["code"] に設定します。 -
それ以外の場合は、error を エラーコード invalid element state とともに返します。
-
-
それ以外の場合は、error を エラーコード invalid argument とともに返します。
-
0x00(成功)となる
descriptor の読み取り操作のデータ付き応答を、次のメッセージを送信することでシミュレートできます:
{ "method" : "bluetooth.simulateDescriptorResponse" , "params" : { "context" : "cxt-d03fdd81" , "address" : "09:09:09:09:09:09" , "serviceUuid" : "0000180d-0000-1000-8000-00805f9b34fb" , "characteristicUuid" : "00002a21-0000-1000-8000-00805f9b34fb" , "descriptorUuid" : "00002901-0000-1000-8000-00805f9b34fb" , "type" : "read" , "code" : 0 , "data" : [ 1 , 2 ] } }
12.2.4. イベント
BluetoothEvent = ( bluetooth.RequestDevicePromptUpdated // bluetooth.GattConnectionAttempted )
12.2.4.1. bluetooth.requestDevicePromptUpdated イベント
bluetooth.RequestDevicePromptUpdated = ( method : "bluetooth.requestDevicePromptUpdated" , params : bluetooth.RequestDevicePromptUpdatedParameters ) bluetooth.RequestDevicePromptUpdatedParameters = { context : text, prompt : bluetooth.RequestDevicePrompt , devices : [ * bluetooth.RequestDeviceInfo ], }
-
navigableId を navigable の navigable id とします。
-
prompt を、device prompt (promptId, devices) とします。
-
serialized devices を、prompt で serialize prompt devices を実行した結果とします。
-
map of navigables to device prompts[navigableId] を prompt に設定します。
-
params を、map で
bluetooth.RequestDevicePromptUpdatedParameters生成規則に合致するものとし、contextフィールドを navigableId、promptフィールドを promptId、devicesフィールドを serialized devices に設定します。 -
body を、map で
bluetooth.RequestDevicePromptUpdated生成規則に合致するものとし、paramsフィールドを params に設定します。 -
relatedNavigables を、navigable を含む set とします。
-
set of sessions for which an event is enabled("
bluetooth.requestDevicePromptUpdated" と relatedNavigables が与えられたもの)の各 session について:-
イベントを送出し、session と body を用います。
-
12.2.4.2. bluetooth.gattConnectionAttempted イベント
bluetooth.GattConnectionAttempted = ( method : "bluetooth.gattConnectionAttempted" , params : bluetooth.GattConnectionAttemptedParameters ) bluetooth.GattConnectionAttemptedParameters = { context : text, address : text}
BluetoothDevice
device が与えられたときは次のとおりです:
-
navigableId を navigable の navigable id とします。
-
params を、map で
bluetooth.GattConnectionAttemptedParameters生成規則に合致するものとし、contextフィールドを navigableId に、addressフィールドを device.[[representedDevice]]の address に設定します。 -
body を、map で
bluetooth.GattConnectionAttempted生成規則に合致するものとし、paramsフィールドを params に設定します。 -
relatedNavigables を、navigable を含む set とします。
-
set of sessions for which an event is enabled の各 session( "
bluetooth.gattEventGenerated" と relatedNavigables が与えられたもの)について:-
イベントを送出し、session と body を用います。
-
12.2.4.3. bluetooth.characteristicEventGenerated イベント
bluetooth.CharacteristicEventGenerated = ( method : "bluetooth.characteristicEventGenerated" , params : bluetooth.CharacteristicEventGeneratedParameters ) bluetooth.CharacteristicEventGeneratedParameters = { context : text, address : text, serviceUuid : bluetooth.BluetoothUuid , characteristicUuid : bluetooth.BluetoothUuid , type : "read" / "write-with-response" / "write-without-response" / "subscribe-to-notifications" / "unsubscribe-from-notifications" , ? data : [ * uint] }
シミュレートされた characteristic
イベントをトリガーする ために、navigable navigable、BluetoothDevice
device、
simulated GATT characteristic
characteristic、string type、任意の byte sequence
bytes が与えられたときは次のとおりです:
-
navigableId を navigable の navigable id とします。
-
params を、map で
bluetooth.CharacteristicEventGeneratedParameters生成規則に合致するものとし、次を実行します:-
params[
"context"] を navigableId に設定します。 -
params[
"address"] を device.[[representedDevice]]の address に設定します。 -
service を、simulated GATT service で characteristic を含むものとします。
-
params[
"serviceUuid"] を service の UUID に設定します。 -
params[
"characteristicUuid"] を characteristic の UUID に設定します。 -
params[
"type"] を type に設定します。 -
もし type が
writeであれば、次を実行します:-
data を空リストとします。
-
bytes 内の各 byte について:
-
byte の value を data に追加します。
-
-
params[
"data"] を data に設定します。
-
-
-
body を、map で
bluetooth.CharacteristicEventGenerated生成規則に合致するものとし、paramsフィールドを params に設定します。 -
relatedNavigables を、navigable を含む set とします。
-
set of sessions for which an event is enabled の各 session( "
bluetooth.characteristicEventGenerated" と relatedNavigables が与えられたもの)について:-
イベントを送出し、session と body を用います。
-
12.2.4.4. bluetooth.descriptorEventGenerated イベント
bluetooth.DescriptorEventGenerated = ( method : "bluetooth.descriptorEventGenerated" , params : bluetooth.DescriptorEventGeneratedParameters ) bluetooth.DescriptorEventGeneratedParameters = { context : text, address : text, serviceUuid : bluetooth.BluetoothUuid , characteristicUuid : bluetooth.BluetoothUuid , descriptorUuid : bluetooth.BluetoothUuid , type : "read" / "write" , ? data : [ * uint] }
シミュレートされた descriptor イベントをトリガーする ために、navigable navigable、BluetoothDevice
device、
simulated GATT descriptor descriptor、string
type、任意の byte sequence
bytes が与えられたときは次のとおりです:
-
navigableId を navigable の navigable id とします。
-
params を、map で
bluetooth.DescriptorEventGeneratedParameters生成規則に合致するものとし、次を実行します:-
params[
"context"] を navigableId に設定します。 -
params[
"address"] を device.[[representedDevice]]の address に設定します。 -
characteristic を、simulated GATT characteristic で descriptor を含むものとします。
-
service を、simulated GATT service で characteristic を含むものとします。
-
params[
"serviceUuid"] を service の UUID に設定します。 -
params[
"characteristicUuid"] を characteristic の UUID に設定します。 -
params[
"descriptorUuid"] を descriptor の UUID に設定します。 -
params[
"type"] を type に設定します。 -
もし type が
writeであれば、次を実行します:-
data を空リストとします。
-
bytes 内の各 byte について:
-
byte の value を data に追加します。
-
-
params[
"data"] を data に設定します。
-
-
-
body を、map で
bluetooth.DescriptorEventGenerated生成規則に合致するものとし、paramsフィールドを params に設定します。 -
relatedNavigables を、navigable を含む set とします。
-
set of sessions for which an event is enabled の各 session( "
bluetooth.descriptorEventGenerated" と relatedNavigables が与えられたもの)について:-
イベントを送出し、session と body を用います。
-
13. 用語と規約
この仕様は、いくつかの規約と他の仕様からの複数の用語を使用します。本節ではそれらを列挙し、その一次定義へのリンクを示します。
この仕様のアルゴリズムが本仕様または他の仕様で定義された名前を使用する場合、その名前は現在の実行環境でその名前に対して加えられた変更を無視し、初期値に解決されなければなりません。例えば、requestDevice()
アルゴリズムが
を呼び出すよう指示する場合、これは [ECMAScript] に定義された Array.prototype.map.call(filter.services,
BluetoothUUID.getService)Array.prototype.map
アルゴリズムを、その this 引数として filter.services を用い、
§ 7.1 Standardized UUIDs に定義された
BluetoothUUID.getService
のアルゴリズムを callbackfn 引数として適用しなければなりません。これは、window、Array、
Array.prototype、Array.prototype.map、Function、
Function.prototype、BluetoothUUID、BluetoothUUID.getService、その他の
オブジェクトに対して行われた変更に関わらず適用されます。
この仕様では、WebIDL の
FrozenArray
に類似した読み取り専用型を使用します。
-
read only ArrayBuffer は、
ArrayBufferの 値とインターフェイスを持ちますが、その内容への書き込みや転送を試みることは、FrozenArrayの内容への書き込みを試みるのと同じ効果を持ちます。これは、 当該ArrayBufferを包むTypedArrayおよびDataViewにも適用されます。
- [BLUETOOTH42]
-
-
アーキテクチャと用語の概要
-
概要
- Bluetooth Low Energy の動作概要 (定義: advertising events)
-
通信トポロジと動作
-
運用手順とモード
-
BR/EDR 手順
-
Inquiry(探索)手順
- Extended Inquiry Response
-
Inquiry(探索)手順
-
BR/EDR 手順
-
運用手順とモード
-
概要
-
コアシステムパッケージ [BR/EDR コントローラー巻]
-
エラーコード
-
エラーコードの概要
- List of Error Codes
-
エラーコードの概要
-
ホストコントローラインターフェイス機能仕様
-
HCI コマンドとイベント
-
情報パラメータ
- Read BD_ADDR Command
-
ステータスパラメータ
- 読み取り RSSI コマンド
-
情報パラメータ
-
HCI コマンドとイベント
-
エラーコード
-
コアシステムパッケージ [ホスト巻]
-
サービス検出プロトコル(SDP)仕様
-
概要
-
Searching for Services
- UUID (定義: UUID alias と、 UUID alias により the 128-bit UUID represented を計算するアルゴリズム)
-
Searching for Services
-
概要
-
一般アクセスプロファイル
-
プロファイル概要
-
プロファイルロール
-
LE 物理トランスポート上でのロール
- Broadcaster ロール
- Observer ロール
- Peripheral ロール
- Central ロール
-
LE 物理トランスポート上でのロール
-
プロファイルロール
-
ユーザーインターフェイスの側面
-
Bluetooth パラメータの表現
- Bluetooth Device Name(ユーザーフレンドリー名)
-
Bluetooth パラメータの表現
-
アイドルモード手順 — BR/EDR 物理トランスポート
- Device Discovery Procedure
- BR/EDR Bonding Procedure
-
運用モードと手順 — LE 物理トランスポート
-
ブロードキャストモードと観測手順
- Observation Procedure
-
検出モードと手順
- General Discovery Procedure
- Name Discovery Procedure
- 接続モードと手順
-
ボンディングモードと手順
- LE Bonding Procedure
-
ブロードキャストモードと観測手順
-
セキュリティの側面 — LE 物理トランスポート
- Privacy Feature
-
ランダムデバイスアドレス
- Static Address
-
Private address
- Resolvable Private Address Resolution Procedure
- Advertising Data とスキャン応答データ形式 (定義: AD structure)
-
Bluetooth デバイス要件
-
Bluetooth デバイスアドレス(定義: BD_ADDR)
-
Bluetooth デバイスアドレスタイプ
- Public Bluetooth Address
-
Bluetooth デバイスアドレスタイプ
-
Bluetooth デバイスアドレス(定義: BD_ADDR)
- 定義 (定義: bond)
-
プロファイル概要
-
Attribute Protocol (ATT)
-
プロトコル要件
-
基本概念
- Attribute Type
- Attribute Handle
- Long Attribute Values
-
Attribute Protocol Pdus
-
エラー処理
- Error Response
-
エラー処理
-
基本概念
-
プロトコル要件
-
Generic Attribute Profile (GATT)
-
プロファイル概要
- 構成とロール (定義: GATT Client および GATT Server)
- Profile Fundamentals、 ATT Bearer を定義
-
Attribute Protocol
- Attribute Caching
-
GATT Profile Hierarchy
- Service
- Included Services
- Characteristic
-
Service Interoperability
Requirements
- Service Definition
-
Characteristic 定義
-
Characteristic 宣言
- Characteristic Properties
-
Characteristic Descriptor 宣言
- Characteristic Extended Properties
- Client Characteristic Configuration
-
Characteristic 宣言
-
GATT 機能要件 —
GATT procedures を定義。
-
サーバー構成
- Exchange MTU
-
Primary Service Discovery
- すべてのプライマリサービスを検出
- Discover Primary Service by Service UUID
-
Relationship Discovery
- 含まれるサービスの検出
-
Characteristic Discovery
- サービスのすべての Characteristic を検出
- Discover Characteristics by UUID
-
Characteristic Descriptor
Discovery
- Discover All Characteristic Descriptors
- Characteristic Value Read
-
Characteristic Value Write
- Write Without Response
- Write Characteristic Value
- Characteristic Value Notification
- Characteristic Value Indications
-
Characteristic Descriptors
- Read Characteristic Descriptors
- Read Long Characteristic Descriptors
- Write Characteristic Descriptors
- Write Long Characteristic Descriptors
- Procedure Timeouts
-
サーバー構成
-
GAP 相互運用要件
-
BR/EDR GAP 相互運用要件
- 接続確立
-
LE GAP 相互運用要件
- 接続確立
-
BR/EDR GAP 相互運用要件
-
定義済み Generic Attribute Profile サービス
- Service Changed
-
プロファイル概要
-
セキュリティマネージャ仕様
-
セキュリティマネージャ
-
Bluetooth Low Energy におけるセキュリティ
- Definition of Keys and Values、 定義: Identity Resolving Key (IRK)
-
Bluetooth Low Energy におけるセキュリティ
-
セキュリティマネージャ
-
サービス検出プロトコル(SDP)仕様
-
コアシステムパッケージ [Low Energy コントローラー巻]
-
リンクレイヤ仕様
-
概要
-
デバイスアドレス
- Public Device Address
-
ランダムデバイスアドレス
- Static Device Address
-
デバイスアドレス
-
空中インターフェイスプロトコル
-
非接続状態
-
スキャン状態
- Passive Scanning
-
スキャン状態
-
非接続状態
-
概要
-
リンクレイヤ仕様
-
アーキテクチャと用語の概要
- [BLUETOOTH-SUPPLEMENT6]
-
-
データタイプ仕様
-
データタイプの定義とフォーマット
- Service UUID Data Type
- Local Name Data Type
- Flags Data Type (定義: Discoverable Mode フラグ)
- Manufacturer Specific Data
- TX Power Level
- Service Data
- Appearance
-
データタイプの定義とフォーマット
-
データタイプ仕様