プロバイダの広告シグナル
広告: 検出可能な場合
プロバイダ デバイスが BR/EDR で検出可能(ペア設定モード)の場合、 は BLE 経由でファスト ペアリングのモデル ID データをアドバタイズし、BLE アドレスは 回転することはできません。
広告掲載間隔: 検出可能な場合
アドバタイズメントの間隔は 100 ミリ秒(10 Hz)以下でなければなりません。 高速通信速度により、シーカーはスキャン中でもプロバイダをすばやく見つけることができます。 低消費電力モードに切り替わります。
アドバタイジング ペイロード: ファスト ペアリングのモデル ID データ
広告にはサービスデータデータタイプ(前掲書)を§ 1.11.「
UUID は、0xFE2C
のファスト ペアリング サービスの UUID になります。サービスデータは
次の内容が含まれます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0~2 | uint24 |
24 ビットモデル ID | 場合によって異なる |
広告: 検出できない場合
検出できない場合(すなわちペアリングモードでない場合)、本提供者デバイスは 次のガイドラインに従って、ファスト ペアリングのアカウント データをアドバタイズする。
アカウントのデータを広告することで、近くにいる求職者はプロバイダがいつ 自動的にペア設定を開始できるため、 最初にペア設定モードに戻します。これは、 ユーザーが無視できる機会が与えられます。 プロバイダとのペア設定待ちがない場合や、このブロードキャストが ブロードキャストに関連性がない場合(すでにペア設定されている場合など)。 また、次のような明らかに不適切なブロードキャストも自動的に除外します。 アカウント データが誤って設定されている場合に通知されます。
広告掲載間隔: 検出できない場合
アドバタイズメントの間隔は 250 ミリ秒(4Hz)以下にする必要があります。
広告ペイロード: ファスト ペアリングのアカウント データ
広告には、サービスデータデータタイプ(前掲書)を§ 1.11.「
UUID は、0xFE2C
のファスト ペアリング サービスの UUID になります。サービスデータは
次の内容が含まれます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 | uint8 |
バージョンとフラグ 0bVVVVFFFF
|
0x00 (今後使用するために予約されています) |
1 - 場合によって異なる | アカウントキー データ | 可変(アカウントキーのリストが空の場合は または 0x00 ) |
アカウントキーデータには次のものが含まれます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 | uint8 |
フィールドの長さとタイプ 0bLLLLTTT
|
0bLLLL0000
|
1 ~秒 | アカウント キー フィルタ | 場合によって異なる | |
S+1 | uint8 |
フィールドの長さとタイプ 0bLLLLTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
Salt | 場合によって異なる |
アカウント キー フィルタ
アドバタイズされたアカウント キー フィルタを使用すると、シーカーは プロバイダが特定のアカウント キーを所有している場合があります(偽陽性が少なく、 次のインタラクションが発生する前に、その確率を平均 0.5% 未満に抑えることです。「 シーカーは、検出時に自動的に接続し、手続きの開始を試みることがあります。 タイプ 0 でブロードキャストされているフィルタ、すなわち UI 表示。 にアカウントキーの 1 つが含まれることがあります。これにより、誤検出のリスクが 向上します状況によっては、プロバイダは ペア設定の準備ができていないときにシーカーによって検出されます。イヤホンを装着したまま ケースに戻します。その後のペア設定通知の表示を停止します。 ヘッドセットで拒否される可能性があるためです。
アカウントキー フィルタは可変長 ブルーム フィルタ。次のように構成されます。 次のようになります。
- n を、永続化されたストレージ内のアカウントキーの数(n >= 1)とします。 アカウントキーのリスト。
- フィルタのサイズ(バイト単位)s を(1.2*n + 3)切り捨てます。対象
たとえば、1 つの鍵が永続化される場合、s = 4 バイトです。
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- フィルタ F を s バイトの配列として初期化し、それぞれを 0 に設定します。
uint8_t F[s] = {0};
永続的なアカウントキー リストのアカウント キー K ごとに、次のようにします。
a.V を連結(K, ソルト)とします。// In the sample code, the size of salt is 2 bytes. #define SALT_SIZE 2 uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE]; for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++) { // concat (K, Salt) fastpair_get_account_key_by_index(keyIndex, V); uint8_t randomSalt = (uint8_t)rand(); V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt; ... }
b. SHA256 でハッシュ V を実行し、32 バイトの値 H を取得 = {H0, ..., H31}。
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. H をビッグ エンディアンで 8 つの 4 バイト符号なし整数に分割します。 X = {X0, ..., X7} X0 = 0xH0H1H2H3。
uint32_t X[8]; for (index = 0; index < 8; index++) { X[index] = (((uint32_t)(H[index * 4])) << 24) | (((uint32_t)(H[index * 4 + 1])) << 16) | (((uint32_t)(H[index * 4 + 2])) << 8) | (((uint32_t)(H[index * 4 + 3])) << 0); }
d. 各 Xi について:
i.M を Xi とし、フィルタのビット数を剰余とします。 (s * 8)。
ii.F のインデックス(M / 8)にあるバイトを切り捨てて取得します。
iii.バイト内で、インデックスのビット(M % 8)を 1 に設定します。
iv.つまり、
のようになります。// M = Xi % (s * 8) // F[M/8] = F[M/8] | (1 << (M % 8)) for (index = 0; index < 8; index++) { uint32_t M = X[index] % (s * 8); F[M / 8] = F[M / 8] | (1 << (M % 8)); }
広告データに [アカウント キー フィルタ] 項目として [F] というフィルタを含めます。 「エンディアン」は存在しないことに注意してください。前者の場合はこの値より増減しないため、 意味します。バイト順序を変更しないでください。
塩田
ソルトは、プロジェクトの作成時にアカウント キーに追加されるランダムな値です。 ブルームフィルタです。このソルトは、RPA が更新されるたびに再生成する必要があります。 アドレス ローテーションをまたいでトラッキングするのを避ける必要があります。
ソルトを使用してアカウント キーフィルタを生成するには:
- ランダムな 2 バイトの S を生成します。「エンディアン」は存在しないことに注意してください。宛先: 上位バイトまたは下位バイトがないため、バイトを変更しないでください。 できます。
- 2 バイトの S をソルトとして使用します。
- アドバタイズされたファスト ペアリングのアカウント データで、生成されたフィルタを [Account Key Filter(アカウントキー フィルタ)] フィールドと [Salt(ソルト)] フィールドに「S」フィールド。