Bluetooth

סמל של Android Bluetooth HAL

‫Android מספקת מחסנית Bluetooth שמוגדרת כברירת מחדל ותומכת ב-Bluetooth קלאסי וב-Bluetooth עם צריכת אנרגיה נמוכה. באמצעות Bluetooth, מכשירי Android יכולים ליצור רשתות אזור אישיות כדי לשלוח ולקבל נתונים עם מכשירי Bluetooth בקרבת מקום.

ב-Android מגרסה 4.3 ואילך, מחסנית ה-Bluetooth של Android מספקת את האפשרות להטמיע Bluetooth עם צריכת אנרגיה נמוכה (BLE). כדי להשתמש במלוא היכולות של ממשקי ה-API של BLE, צריך לפעול לפי הדרישות של Android Bluetooth HCI. מכשירי Android עם ערכת שבבים מתאימה יכולים להטמיע Bluetooth קלאסי או גם Bluetooth קלאסי וגם BLE. ‫BLE לא תואם לאחור עם ערכות שבבים ישנות יותר של Bluetooth.

ב-Android 8.0, מחסנית ה-Bluetooth עומדת בדרישות של Bluetooth 5. כדי להשתמש בתכונות הזמינות של Bluetooth 5, במכשיר צריך להיות ערכת שבבים שעומדת בדרישות של Bluetooth 5.

ארכיטקטורה ל-Android

אפליקציית Bluetooth מתקשרת עם תהליך ה-Bluetooth באמצעות Binder. תהליך ה-Bluetooth משתמש ב-JNI כדי לתקשר עם מחסנית ה-Bluetooth ומספק למפתחים גישה לפרופילים שונים של Bluetooth. הדיאגרמה הזו מציגה את המבנה הכללי של מחסנית Bluetooth:

דיאגרמה שבה מוצגות השכבות של מחסנית ה-Bluetooth ב-Android.

איור 1. ארכיטקטורת Bluetooth ב-Android.

app framework
ברמת מסגרת האפליקציה נמצא קוד האפליקציה, שמשתמש בממשקי ה-API‏ android.bluetooth כדי ליצור אינטראקציה עם חומרת ה-Bluetooth. באופן פנימי, הקוד הזה מפעיל את תהליך ה-Bluetooth באמצעות מנגנון ה-IPC של Binder.
אפליקציית Bluetooth
אפליקציית ה-Bluetooth, שנמצאת ב-packages/modules/Bluetooth/android/app, מגיעה כחבילה של אפליקציית Android ומיישמת את פרופילי ה-Bluetooth בשכבת מסגרת Android. האפליקציה הזו קוראת למערך Bluetooth דרך JNI.
JNI
קוד ה-JNI שמשויך ל-android.bluetooth נמצא ב-packages/modules/Bluetooth/android/app/jni. קוד ה-JNI קורא למערך Bluetooth כשמתרחשות פעולות מסוימות של Bluetooth, למשל כשמגלים מכשירים.
Bluetooth stack
מקבץ ברירת המחדל של Bluetooth מסופק ב-AOSP וממוקם ב-packages/modules/Bluetooth/system. המקבץ מיישם את ה-HAL הגנרי של Bluetooth ומתאים אותו אישית באמצעות תוספים ושינויים בהגדרות.
הטמעה של ספק
מכשירים של ספקים מקיימים אינטראקציה עם מחסנית Bluetooth באמצעות שפת Hardware Interface Design (HIDL).

HIDL

HIDL מגדיר את הממשק בין מחסנית Bluetooth לבין ההטמעה של הספק. כדי ליצור את קובצי ה-Bluetooth HIDL, מעבירים את קובצי ממשק ה-Bluetooth לכלי ליצירת HIDL. קבצי הממשק נמצאים בתיקייה hardware/interfaces/bluetooth.

פיתוח של Bluetooth stack

מקבץ הפיצ'רים של Bluetooth ב-Android הוא מקבץ פיצ'רים מלא של Bluetooth. רשימת ההסמכות נמצאת באתר של Bluetooth SIG בקטע QDID 169365.

מקבץ הפיצ'רים של Bluetooth נמצא ב- packages/modules/Bluetooth. הפיתוח מתבצע ב-AOSP, ואנחנו מקבלים בברכה הצעות לשיפורים.

ארכיטקטורה של Android מגרסה 7.x ומטה

שירות מערכת Bluetooth מתקשר עם מחסנית Bluetooth באמצעות JNI ועם אפליקציות באמצעות Binder IPC. שירות המערכת מספק למפתחים גישה לפרופילי Bluetooth שונים. הדיאגרמה הזו מציגה את המבנה הכללי של מחסנית Bluetooth:

תרשים של שכבות ארכיטקטורת ה-Bluetooth ב-Android מגרסה 7.x ומטה.

איור 2. ארכיטקטורת Bluetooth ב-Android מגרסה 7.x ומטה.

app framework
ברמת מסגרת האפליקציה נמצא קוד האפליקציה, שמשתמש בממשקי ה-API‏ android.bluetooth כדי ליצור אינטראקציה עם חומרת ה-Bluetooth. באופן פנימי, הקוד הזה מפעיל את תהליך ה-Bluetooth באמצעות מנגנון ה-IPC של Binder.
שירות מערכת Bluetooth
שירות המערכת Bluetooth, שנמצא ב-packages/apps/Bluetooth, ארוז כאפליקציית Android ומיישם את שירות ה-Bluetooth ואת הפרופילים בשכבת מסגרת Android. האפליקציה הזו קוראת לשכבת ה-HAL דרך JNI.
JNI
קוד ה-JNI שמשויך ל- android.bluetooth נמצא ב-packages/apps/Bluetooth/jni. קוד ה-JNI קורא לשכבת ה-HAL ומקבל קריאות חוזרות מה-HAL כשמתרחשות פעולות מסוימות של Bluetooth, כמו כשמגלים מכשירים.
HAL
שכבת הפשטת החומרה מגדירה את הממשק הסטנדרטי שאליו מתבצעת קריאה בתהליך Bluetooth על ידי ממשקי ה-API של android.bluetooth, ושצריך להטמיע כדי שהחומרה של Bluetooth תפעל בצורה תקינה. קובץ הכותרת של Bluetooth HAL הוא hardware/libhardware/include/hardware/bluetooth.h. בנוסף, כדאי לבדוק את כל הקבצים בתיקייה hardware/libhardware/include/hardware/bt_*.h.
Bluetooth stack
מקבץ ברירת המחדל של Bluetooth מסופק לכם ונמצא ב-system/bt. המקבץ מיישם את ה-HAL הגנרי של Bluetooth ומבצע בו התאמה אישית באמצעות תוספים ושינויים בהגדרות.
תוספים של ספקים
כדי להוסיף תוספים בהתאמה אישית ושכבת HCI למעקב, אפשר ליצור מודול libbt-vendor ולציין את הרכיבים האלה.

הטמעה של HAL

שכבת ה-HAL של Bluetooth נמצאת בתיקייה /hardware/libhardware/include/hardware/bluetooth.h. הקובץ bluetooth.h מכיל את הממשק הבסיסי למערך Bluetooth, וחובה להטמיע את הפונקציות שלו.

קבצים ספציפיים לפרופיל נמצאים באותה ספרייה. פרטים נוספים מופיעים במאמר בנושא הפניה לקובץ HAL.