אות פרסום של ספק
פרסום: כשהמרחב גלוי
כשמכשיר הספק ניתן לגילוי ב-BR/EDR (כלומר, במצב התאמה), הוא ישדר נתוני מזהה דגם של התאמה מהירה באמצעות BLE, וכתובת ה-BLE לא תשתנה.
מרווח הפרסום: כשהמכשיר גלוי
המרווח בין המודעות לא יכול להיות גדול מ-100 אלפיות השנייה (10 הרץ). קצב מהיר מאפשר למכשיר המחפש למצוא במהירות את המכשיר המספק, גם כשהסריקה מתבצעת במצב חיסכון בסוללה.
מטען ייעודי (payload) של פרסום: נתונים של מזהה הדגם של התאמה מהירה
המודעה צריכה להכיל את סוג הנתונים 'נתוני שירות', שם, § 1.11. ה-UUID צריך להיות ה-UUID של שירות ההתאמה המהירה 0xFE2C. נתוני השירות יכללו את הפרטים הבאים:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0-2 | uint24 |
מזהה מודל של 24 ביט | משתנה |
מטען ייעודי (payload) של פרסום שיתוף אודיו ב-LE: נתונים של מזהה הדגם של Fast Pair ומפת היכולות של FP
נתוני השירות יכללו את הפרטים הבאים:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
גרסה ודגלים 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
אורך השדה וסוגו 0bLLLLTTTT
|
0bLLLL0111
|
| 2 - s | מזהה דגם | משתנה | |
| s + 1 | uint8 |
אורך השדה וסוגו 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
מפת היכולות של FP | משתנה |
מפת היכולות של FP
מפת היכולות של FP היא מפת סיביות שמייצגת את תכונות ה-FP שהספק תומך בהן. הבייט הראשון של מפת הסיביות מוגדר כך:
| מפת סיביות | תיאור |
|---|---|
| 0bRRRRRRSO | R – ביט שמור, המערכת תתעלם ממנו בשלב הזה והוא יוגדר כ-0. S – תמיכה בשיתוף של FP LE Audio (הערך הוא 1 אם התכונה מופעלת, אחרת הוא 0). O – ביט של Out of Box (OOB), הערך הוא 1 אם המכשיר חדש מהמפעל. |
אם הספק תומך במפרט השיתוף של LE Audio של FP (כלומר, הוא תומך בצימוד זמני, במטען פרסום של שיתוף LE Audio ובגרסה 2 של Hearable control), צריך להגדיר את ביט התמיכה בשיתוף LE Audio של FP ל-1. אחרת, צריך להגדיר אותו ל-0.
אם הספק לא שויך לאף מחפש FP והוא חדש מהמפעל (כלומר, אין מפתחות חשבון FP בספק), צריך להגדיר את הביט OOB ל-1. אחרת, צריך להגדיר אותו ל-0.
פרסום: כשהמרחב לא גלוי
כשמכשיר הספק לא ניתן לגילוי (כלומר, לא במצב התאמה), הוא צריך לפרסם את נתוני החשבון של התכונה 'התאמה מהירה' בהתאם להנחיות הבאות.
פרסום נתוני החשבון מאפשר למשתמשים בקרבת מקום לזהות מתי ספק שייך לחשבון שלהם ולהתחיל את ההתאמה בלי להכריח את הספק לחזור למצב התאמה קודם. זו סיבה נפוצה לתלונות של משתמשים. התכונה 'חיפוש' תאפשר למשתמשים להתעלם מהשידור הזה אם הם לא רוצים להמתין לחיבור עם הספק או אם השידור לא רלוונטי (למשל, אם הם כבר התחברו). בנוסף, המערכת תסנן באופן אוטומטי שידורים שהם בבירור באיכות ירודה, למשל אם נתוני החשבון לא הוגדרו בצורה נכונה.
מרווח הפרסום: כשהמרחב לא גלוי
המרווח בין המודעות צריך להיות לכל היותר 250 אלפיות השנייה (4 הרץ).
מטען ייעודי (payload) של פרסום: נתוני חשבון של התאמה מהירה
המודעה צריכה להכיל את סוג הנתונים 'נתוני שירות', שם, § 1.11. ה-UUID צריך להיות ה-UUID של שירות ההתאמה המהירה 0xFE2C. נתוני השירות יכללו את הפרטים הבאים:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
גרסה ודגלים 0bVVVVFFFF
|
0x00(שמור לשימוש עתידי) |
| 1 – משתנה | נתוני מפתח החשבון | משתנה |
נתוני מפתח החשבון מכילים:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
אורך השדה וסוגו 0bLLLLTTTT
|
0bLLLL0000
|
| 1 - s | מסנן מפתח חשבון | משתנה | |
| s + 1 | uint8 |
אורך השדה וסוגו 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | משתנה |
מסנן מפתח חשבון
המסנן של מפתח החשבון שמוצג במודעה מאפשר למחפש לבדוק במהירות אם לספק יש מפתח חשבון מסוים (עם הסתברות נמוכה לתוצאת חיובית שגויה, בממוצע הרבה פחות מ-0.5%), לפני שהוא מבצע אינטראקציות נוספות. הכלי Seeker עשוי להתחבר באופן אוטומטי ולנסות להתחיל את התהליך כשהוא מזהה שידור של מסנן עם סוג 0, כלומר מוצג סימן בממשק המשתמש, שעשוי להכיל אחד ממפתחות החשבון שלו, כדי להקטין עוד יותר את שיעור התוצאות החיוביות השגויות. במצבים מסוימים, יכול להיות שהספק ירצה שהמכשיר המחפש יזהה אותו, אבל הוא לא יהיה מוכן לצימוד. לדוגמה, כשמחזירים את האוזניות למארז, אנחנו רוצים להפסיק להציג את התראת ההתאמה הבאה, כי יכול להיות שהאוזניות יסרבו להתחבר.
המסנן של מפתח החשבון הוא מסנן בלום באורך משתנה, שנבנה באופן הבא:
- n הוא מספר מפתחות החשבון (n >= 1) ברשימת מפתחות החשבון שנשמרה.
- נסמן ב-s את גודל המסנן בבייטים, שהוא (1.2*n + 3) אחרי קיטום. לדוגמה, אם נשמר מפתח אחד, s = 4 בייטים.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - מאתחלים את המסנן F כמערך של s בייטים, שכל אחד מהם מוגדר כ-0.
uint8_t F[s] = {0}; לכל מפתח חשבון K ברשימת מפתחות החשבון שנשמרה:
א. V הוא concat(K, Salt).// 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; ... }ב. מבצעים גיבוב (hash) של V באמצעות SHA256, ומקבלים ערך של 32 בייט H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);ג. מחלקים את H לשמונה מספרים שלמים לא מסומנים בני 4 בייטים בפורמט big-endian, 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); }ד. לכל 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 כשדה Account Key Filter (מסנן מפתח החשבון) בנתוני הפרסום. שימו לב שאין 'סדר בתים' לערך הזה, כי אין בית משמעותי יותר או פחות – אל תשנו את סדר הבתים.
שדה מלח
ה-salt הוא ערך אקראי שמצורף למפתחות של החשבון כשיוצרים את מסנן בלום. צריך ליצור מחדש את ה-salt הזה בכל פעם שמעדכנים את ה-RPA אצל הספק, כדי למנוע מעקב במהלך רוטציה של כתובות.
כדי ליצור את המסנן של מפתח החשבון באמצעות ה-salt:
- יוצרים S אקראי באורך 2 בייט. שימו לב שאין 'סדר בתים' לערך הזה, כי אין בייט משמעותי יותר או פחות – אל תשנו את סדר הבייטים.
- משתמשים ב-S בן 2 הבייטים בתור Salt.
- בנתוני החשבון של התכונה 'התאמה מהירה' שמוצגים, כוללים את המסנן שנוצר בשדה Account Key Filter ואת S בשדה Salt.