ב-Android 14 נוספה התכונה החדשה של גישה מרחוק, שמאפשרת לשותפים להפעיל מרחוק את Android ברכב כדי לבצע משימות ספציפיות. לדוגמה, כדי להפעיל את מצב מוסך במהלך הלילה כדי להחיל עדכוני תוכנה. כדי לבצע את תהליך העבודה מקצה לקצה, נדרשים כמה רכיבים שאינם של Android. מערכת Android לא מגדירה רכיבים שאינם של Android או מספקת הטמעה שלהם (האחריות הזו היא שלכם).
מידע נוסף זמין בקטעים הבאים:
תהליך עבודה. תהליך העבודה בין כמה רכיבים בארכיטקטורה לדוגמה של רישום לקוחות והעברת משימות.
כתיבת לקוח משימות מרחוק. שימוש בגישה מרחוק ולימוד איך לכתוב לקוח של משימות מרחוק.
הטמעה על ידי הספק. רכיבי הספקים בארכיטקטורה לדוגמה לתמיכה בגישה מרחוק.
איפוס להגדרות המקוריות והעברת בעלות. איך מבצעים איפוס להגדרות המקוריות ומעבירים בעלות על רכב?
בדיקת לקוח הגישה מרחוק. איך בודקים את תכונת הגישה מרחוק
ארכיטקטורה
התוכן הבא מבוסס על הארכיטקטורה לדוגמה הבאה, שהיא היפותטית ועשויה שלא לשקף את הארכיטקטורה בפועל. יצרני ציוד מקורי צריכים להתאים את ההטמעה בפועל לארכיטקטורות של הרכבים והשרתים שלהם.
איור 1. דוגמה לארכיטקטורה.
הארכיטקטורה לדוגמה מורכבת מהרכיבים הבאים של חומרה:
רכיב חומרה | תיאור |
---|---|
מעבד אפליקציות | מעבד שבו פועלת מערכת Android. יכול להיות שמערכת Android תפעל בזיכרון וירטואלי (VM) (לא בחומרה בפועל) במעבד הזה. |
מעבד כלי רכב | מעבד שאחראי על בקרת הכוח של מעבד האפליקציה. |
יחידת בקרה של טלמטריה (TCU) | המעבד ברכב תמיד יכול לקבל הודעות מרחוק מהענן. ההנחה היא שה-TCU תמיד פועל או במצב צריכת אנרגיה נמוכה. משתמשים בהודעות מרחוק כדי להעיר את TCU. |
שרת ההשכמה | שרת מרוחק שפועל בענן ואחראי על התקשורת עם ה-TCU ברכב כדי להנפיק פקודות הפעלה. |
שרת משימות מרוחק | שרת המשימות מרחוק פועל בענן, יוצר אינטראקציה עם אנשים ומנהל משימות מרחוק. |
הארכיטקטורה לדוגמה מורכבת מהרכיבים הבאים של תוכנה, שכל אחד מהם פועל ב-Android:
רכיב תוכנה ב-Android | תיאור |
---|---|
שירות רכב | שירות מסגרת של AAOS שמספק ממשקי API לגישה מרחוק. |
לקוח משימות מרחוק | כיתה של Service שנכתבה על ידי הספק, שמבצעת משימות מרחוק. מערכת Android אחת יכולה להריץ כמה לקוחות של משימות מרוחקות. |
HAL לגישה מרחוק | חובה להטמיע את האפשרות הזו כדי לגשת מרחוק. שכבת הפשטה לתקשורת בין AAOS לבין רכיב שאינו Android, כמו TCU. |
הרכיבים של תוכנות שאינן של Android מתוארים בהמשך:
רכיב תוכנה שאינו של Android | תיאור |
---|---|
לקוח השכמה | תוכנה שפועלת ב-TCU ושומרת על חיבור ארוך טווח לשרת ההפעלה. הוא גם שומר על חיבור ל-HAL של הגישה מרחוק כדי להעביר משימות מרחוק לשירות הרכב. |
הטמעת שרת השכמה | שרת שמתקשר עם לקוח ההתעוררות שפועל ב-TCU. יכולה לשלוח בקשות להפעלה ללקוח ההפעלה. |
הטמעה של שרת משימות מרוחק | שרת שמנהל משימות מרחוק. המשתמשים יוצרים אינטראקציה עם השרת הזה כדי להקצות משימות מרחוק ולעקוב אחריהן. |
זרימת עבודה
בקטע הזה מפורטים השלבים בתהליך עבודה לדוגמה.
תהליך עבודה לדוגמה
תהליך עבודה מפורט יכול להיראות כך:
המשתמש מחנה את הרכב במוסך.
השותף מנסה לעדכן את הרכב במהלך הלילה, כשסביר להניח שלא יהיו אינטראקציות עם הרכב.
שרת הענן של השותף שולח למשאית משימה מרחוק לעדכון המערכת. באופן ספציפי, יחידת הבקרה הטלמטרית (TCU).
ה-TCU של הרכב מעיר את יחידת הבקרה האלקטרונית (ECU) של Android, ושירות של יצרן ציוד מקורי מפעיל את מצב המוסך.
Android מפעיל את מצב Garage כדי להוריד ולהתקין עדכונים דרך Google Play.
אחרי החלת העדכון, Android מסמנת את המשימה כ'הושלמה' ומפסיקה את החיבור או מגיע לתקופת זמן קצובה שצוינה.
תהליך עבודה מפורט
יש שני שלבים חשובים שנדרשים כדי לקבל גישה מרחוק. האפשרות הראשונה היא רישום הלקוח, כלומר קישור של משתמש ספציפי ללקוח משימות ספציפי מרחוק שפועל ברכב ספציפי. השני הוא שליחת משימה, כלומר העברת המשימה מרחוק למשתמש ספציפי ללקוח המשימות מרחוק הספציפי שפועל ברכב הספציפי.
רישום לקוח
כדי להשתמש בתכונה של גישה מרחוק, המשתמש צריך לפתוח את אפליקציית הלקוח של המשימות מרחוק לפחות פעם אחת ולהשלים את תהליך הרישום של הלקוח (טקסט מודגש מציין משימות שהופעלה בהן AAOS):
בזמן ההפעלה, שירות הרכב מקבל את פרטי הרכב מ-HAL של הגישה מרחוק.
בזמן ההפעלה, Car Service מפעיל את כל לקוחות המשימות מרחוק על סמך מסנן הכוונה והרשאה.
כשלקוח המשימות מרחוק מופעל, הוא מתעדכן ב-Car Service.
Car Service מודיע ללקוח המשימה מרחוק על פרטי הרישום, כולל מזהה הרכב ומספר הלקוח. מזהה הלקוח הוא ייחודי ומוקצה ללקוח הזה על ידי Car Service. המזהה הזה יהיה ייחודי לכל לקוחות המשימות מרחוק באותו רכב.
המשתמש מתחבר לשרת המשימות המרוחק דרך לקוח המשימות המרוחק ומפעיל את תכונת הגישה מרחוק ברכב הזה. בשלב הזה בדרך כלל מתבצע אימות דרך שרת המשימות המרוחק.
לקוח המשימות מרחוק מעלה את פרטי המשתמש, יחד עם מזהה הרכב ומזהה הלקוח, לשרת המשימות מרחוק ומבקש ממנו לקשר את המשתמש ללקוח הספציפי הזה ולרכב הספציפי הזה.
לחלופין, השלב הזה עשוי לכלול אימות דו-שלבי נוסף מהמשתמש.
שרת המשימות המרוחק צריך לאמת שמזהה הרכב שצוין בבקשה תואם למזהה הרכב של השולח. אפשר לעשות זאת באמצעות אימות הרכב.
אלא אם מתבצע איפוס להגדרות המקוריות, תהליך רישום הלקוח נדרש פעם אחת לכל משתמש לכל רכב. מזהה הלקוח מאוחסן באופן מקומי בשירות הרכב, והוא לא משתנה לאותו לקוח.
איור 2. רושמים לקוח.
ביטול הרישום של לקוח
משתמש יכול לבטל את הקישור של הרכב לחשבון שלו מהרכב או משרת המשימות המרוחק:
ברכב, המשתמשים יכולים לפתוח את אפליקציית הלקוח של המשימות מרחוק ולשלוח בקשה לבטל את הקישור כדי לבטל את הקישור של הרכב הזה לחשבונות המשתמשים המקושרים הקודמים.
בשרת המשימות המרוחק, המשתמשים יכולים להתחבר לחשבון שלהם ולבטל את הקישור של רכב מקושר בעבר לחשבון הזה.
אם המשתמש ינתק את הרכב מהחשבון שלו, שרת המשימות המרוחק צריך להסיר את המיפוי המאוחסן של המשתמש הספציפי.
מסירת משימות
בענן:
משתמש משתמש בשרת המשימות מרחוק כדי לשלוח משימה מרחוק לרכב ספציפי.
שרת המשימות המרוחק ממפה את מזהה המשתמש למזהה הרכב ולמזהה הלקוח. הוא שולח את נתוני המשימה, מזהה הרכב ומזהה הלקוח לשרת ההתעוררות.
שרת ההתעוררות מאתר את ה-TCU הספציפי למזהה הרכב (בהנחה שה-TCU כבר רשום) ושולח את נתוני המשימה ומזהה הלקוח ל-TCU.
ברכב (טקסט מודגש מציין משימות שמבוצעות על ידי AAOS):
TCU מקבל משימות מרחוק משרת מרוחק.
אם מעבד האפליקציות (AP) שפועל ב-AAOS כבוי, ה-TCU משתמש במעבד הרכב (VP) כדי להעיר את ה-AP.
שירות הרכב מקבל משימות מ-TCU.
Car Service מחלק משימות ללקוח המשימות הרחוק המתאים.
לקוח המשימות מרחוק מקבל את המשימה ומבצע אותה.
(אופציונלי) לקוח המשימות המרוחק יוצר קשר עם שרת המשימות כדי לקבל פרטים נוספים על המשימה ומבצע אותה.
(אופציונלי) שירות הלקוח של המשימה מרחוק מדווח על תוצאת המשימה לשרת המשימות.
לקוח המשימות מרחוק מודיע ל-Car Service כשהמשימה הושלמה.
אם צריך, שירות הרכב משחזר את מצב החשמל ברכב.
איור 3. מסירת משימות.
כתיבת לקוח של משימות מרחוק
CarRemoteAccessManager
מספק את ממשק ה-API לתכונות הגישה מרחוק. למידע נוסף, קראו את המאמר CarRemoteAccessManager.
לקוח משימות מרחוק הוא שירות Android שמריץ משימות מרחוק ומשתמש ב-CarRemoteAccessManager
. לשם כך, צריך להשתמש ב-PERMISSION_USE_REMOTE_ACCESS
וב-PERMISSION_CONTROL_REMOTE_ACCESS
, ולהצהיר על מסנן אינטרנט ל-RemoteTaskClientService
, למשל:
<service android:name=".remoteaccess.RemoteTaskClientService"
android:directBootAware="true"
android:exported="true">
<intent-filter>
<action android:name="android.car.remoteaccess.RemoteTaskClientService" />
</intent-filter>
</service>
לקוח של משימה מרוחקת צריך לרשום את עצמו ב-Car Service במהלך היצירה:
public final class RemoteTaskClientService extends Service {
@Override
public void onCreate() {
// mCar = Car.createCar()...
mRemoteAccessManager = (CarRemoteAccessManager)
mcar.getCarManager(Car.CAR_REMOTE_ACCESS_SERVICE);
if (mRemoteAccessManager == null) {
// Remote access feature is not supported.
return;
}
mRemoteAccessManager.setRemoteTaskClient(executor, mRemoteTaskClient);
}
}
צריך לשנות את ברירת המחדל של פונקציית onBind כדי שהיא תחזיר null.
@Override
public IBinder onBind(Intent intent) {
return null;
}
שירות הרכב מנהל את מחזור החיים שלו. Car Service מתחבר לשירות הזה במהלך ההפעלה וכאשר מגיעת משימה מרחוק. כשהמשימה תושלם, הקישור של Car Service לשירות הזה יבוטל. למידע נוסף, קראו את המאמר ניהול מחזור החיים של שירות.
לקוח המשימות המרוחק פועל בתור משתמש המערכת, ולכן אין לו גישה לנתונים ספציפיים למשתמש.
בדוגמה הבאה מוצגת דרך לטפל בקריאות החזרה (callbacks) הרשמות:
private final class RemoteTaskClient
implements CarRemoteAccessManager.RemoteTaskClientCallback {
@Override
public void onRegistrationUpdated(
RemoteTaskClientRegistrationInfo info) {
// Register to remote task server using info.
}
@Override
public void onRemoteTaskRequested(String taskId,
byte[] data, int remainingTimeSec) {
// Parses the data and execute the task.
// Report task result to remote task server.
mRemoteAccessManager.reportRemoteTaskDone(taskId);
}
@Override
public void onShutdownStarting(CompleteableRemoteTaskFuture future) {
// Stop the executing task.
// Clear the pending task queue.
future.complete();
}
}
הטמעה של הספק
התכונה של הגישה מרחוק היא אופציונלית ומושבתת כברירת מחדל. כדי להפעיל את התכונה, מוסיפים קובץ RRO כמו זה:
// res/xml/overlays.xml
<?xml version="1.0" encoding="utf-8"?>
<overlay>
<item target="array/config_allowed_optional_car_features" value="@array/config_allowed_optional_car_features" />
</overlay>
// res/values/config.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array translatable="false" name="config_allowed_optional_car_features">
<item>car_remote_access_service</item>
</string-array>
</resources>
// Android.bp
runtime_resource_overlay {
name: "RemoteAccessOverlay",
resource_dirs: ["res"],
manifest: "AndroidManifest.xml",
sdk_version: "current",
product_specific: true
}
לחלופין, אפשר להשתמש בפקודה הבאה של adb ב-build של userdebug/eng:
adb shell cmd car_service enable-feature car_remote_access_service
דרישות ב-Android
HAL לגישה מרחוק
שכבת ההפשטה של חומרת הגישה מרחוק (HAL) היא שכבת הפשטה שהוטמעה על ידי הספק, ומשמשת לתקשורת בין AAOS לבין יחידת בקרה אלקטרונית אחרת (למשל, TCU). הוא חובה כדי לתמוך בתכונה של גישה מרחוק. אין צורך להטמיע אותו אם לא מטמיעים את תכונת הגישה מרחוק.
הממשק מוגדר בקובץ IRemoteAccess.aidl וכולל את השיטות הבאות:
דרגה | תיאור |
---|---|
String getVehicleId() |
מקבל מזהה רכב ייחודי שאפשר לזהות בשרת ההתעוררות. |
String getWakeupServiceName() |
הפונקציה מקבלת את השם של שרת ההפעלה מרחוק. |
String getProcessorId() |
מקבל מזהה מעבד ייחודי שאפשר לזהות על ידי העירת הלקוח. |
void setRemoteTaskCallback(IRemoteTaskCallback callback)
הגדרת קריאה חוזרת (callback) שתתבצע כשמתבצעת בקשה לביצוע משימה מרחוק. |
|
void clearRemoteTaskCallback() |
מחיקת קריאה חוזרת (callback) של משימה מרחוק שהוגדרה קודם. |
void notifyApStateChange(in ApState state)
הבדיקה מזהה אם מעבד האפליקציה מוכן לקבל משימות מרחוק. |
ממשק הקריאה החוזרת מוגדר ב-IRemoteTaskCallback.aid
.
דרגה | תיאור |
---|---|
oneway void onRemoteTaskRequested(String clientId, in byte[] data)
קריאה חוזרת (callback) שנקראת כשמתבצעת בקשה לביצוע משימה מרחוק. |
הטמעת העזרה עם TCU חיצוני ההטמעה משתמשת בזרם קריאה לטווח ארוך כדי לקבל משימות מרחוק, ותומכת בפקודה debug
הבאה:
dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default
Vehicle HAL
כדי לתמוך בתכונה 'גישה מרחוק', VHAL צריך לתמוך במאפיינים הבאים:
דרגה | תיאור |
---|---|
SHUTDOWN_REQUEST |
בקשה להשבתת יחידת הראש. |
VEHICLE_IN_USE |
|
מידע נוסף זמין במאמר מאפייני מערכת נתמכים.
מצב שקט
התכונה 'גישה מרחוק' חייבת לתמוך במצב שקט כדי שהרכב יוכל להפעיל את המנוע במצב שקט כדי לבצע משימות מרחוק כשאין משתמש. במצב שקט, מכשיר Android OS מופעל עם המסך והאודיו מושבתים.
מצב השקט נשלט באמצעות שני קבצים של ליבה של Linux sysfs
.
דרגה | תיאור |
---|---|
/sys/kernel/silent_boot/pm_silentmode_kernel_state
מייצג את מצב ההשתקה הנוכחי. |
|
/sys/kernel/silent_boot/pm_silentmode_hw_state
האות מהחומרה להגדרת מצב שקט חדש. |
מעבד הרכב שולח אות חומרה ל-Android SoC כדי להפעיל או להשבית את המצב השקט. האות (0 או 1) נכתב ב-/sys/kernel/silent_boot/pm_silentmode_hw_state
. לאחר מכן, המסגרת של AAOS מעדכנת את הערך של /sys/kernel/silent_boot/pm_silentmode_kernel_state
בהתאם, והוא מייצג את מצב ההשתקה הנוכחי. המודולים של AAOS בודקים את הערך של /sys/kernel/silent_boot/pm_silentmode_kernel_state
כדי לדעת אם המערכת במצב שקט או לא.
כשמתקבלת משימה מרחוק ו-AAOS מופעל, מעבד הרכב מגדיר את המצב השקט ומפעיל את AAOS כך שהמערכת תופעל עם המסך או השמע מושבתים.
רכיבים ברכב שאינם של Android
מעבד כלי רכב
מעבד הרכב הוא מעבד ברכב שיכול לשלוט במתח של מעבד האפליקציה שפועל ב-Android. בארכיטקטורה לדוגמה, ה-TCU מעיר את מעבד האפליקציות על ידי שליחת אות למעבד הרכב.
רכיבים ברכב שאינם של Android
ה-TCU ברכב תמיד יכול לקבל הודעות מרחוק.
לקוח ההפעלה פועל ב-TCU כדי להבטיח חיבור ארוך טווח לשרת ההפעלה מרחוק.
מערכת AAOS שפועלת ב-AP יכולה לתקשר עם לקוח ההתעוררות שפועל ב-TCU דרך HAL של הגישה מרחוק.
איור 4. TCU (לקוח ההשכמה).
רכיבים בענן
שרת ההשכמה
שרת ההתעוררות מתקשר עם לקוח ההתעוררות ב-TCU כדי:
- שמירה על חיבור ארוך טווח ל-TCU של הרכב.
- חיפוש TCU ספציפי על סמך מזהה רכב.
- דיווח על סטטוס הרכב. לדוגמה, אונליין או אופליין, או מועד החיבור האחרון לשרת המשימות המרוחק.
בהטמעה בפועל, אפשר למזג שרת התעוררות עם שרת משימות מרוחק.
שרת משימות מרוחק
שרת המשימות המרוחק מנהל את המשימות האלה.
המשתמש יוצר אינטראקציה עם השרת כדי להתחיל משימות חדשות מרחוק ולעקוב אחרי משימות מרחוק.
שימוש בשרת ההפעלה מרחוק כדי להעיר את מעבד האפליקציה ברכב.
יוצר אינטראקציה עם לקוח המשימות מרחוק שפועל ברכב.
אחסון פרטי הרישום של הלקוח. כך אפשר לשייך משתמש ספציפי ללקוח משימות ספציפי מרחוק ברכב ספציפי.
בדרך כלל, נתוני המשימה שנשלחים דרך שרת המשימות המרוחק לשרת ההתעוררות, ל-TCU של הרכב ולבסוף ללקוח המשימות המרוחק, הם פשוט מזהה משימה. לקוח המשימות מרחוק משתמש במזהה המשימה כדי לאחזר את המידע המפורט משרת המשימות מרחוק.
דרישות בנושא פרטיות ואבטחה
משימה | תנאי | דרישה |
---|---|---|
TCU (לקוח ההשכמה) | MUST |
|
שרת ההשכמה | MUST |
|
לקוח משימות מרחוק | MUST |
|
שרת משימות מרוחק | MUST |
|
איפוס להגדרות המקוריות והעברת הבעלות
אם משתמש מבצע איפוס להגדרות המקוריות, מזהה הלקוח שנשמר בשירות הרכב נמחק. עם זאת, השרתים (שרת המשימות המרוחק ושרת ההפעלה המרוחק) לא יקבלו הודעה על כך. השרתים שומרים מיפוי של מזהה הלקוח שפג התוקף שלו לרכב. כתוצאה מכך, אם המשתמש מתחיל משימה חדשה מרחוק ברכב, המערכת משתמשת במזהה הלקוח שפג התוקף שלו. הרכב מתעורר, אבל לא ניתן להריץ את המשימה מרחוק כי למשתמש של המשימה מרחוק יש מספר לקוח שונה שלא תואם.
בהמשך מתוארת אחת מההטמעות האפשריות של איפוס להגדרות המקוריות.
כשמשתמש מבצע איפוס להגדרות המקוריות, הספק מבקש מהמשתמש להתחבר לשרת המשימות המרוחק ולבטל את הקישור של הרכב לחשבון שלו, אם המשתמש קישר בעבר את הרכב. אין ערובה לכך שהמכשיר יהיה עם גישה לרשת במהלך האיפוס להגדרות המקוריות. לכן, יכול להיות שלא תהיה אפשרות לשלוח את בקשת ביטול הקישור מהמכשיר בזמן האיפוס להגדרות המקוריות.
בכל פעם שמעבירים בעלות על רכב, צריך לבצע פעולות מסוימות כדי לוודא שהבעלים הקודם לא יוכל יותר להעביר לרכב משימות מרחוק. לדוגמה, יכול להיות שהבעלים החדש יתבקש:
לבצע איפוס להגדרות המקוריות. כך מוודאים שמזהה הלקוח ייווצר מחדש. אחרי השלב הזה, הבעלים הקודם עדיין יוכל להעיר את הרכב, אבל לא יוכל יותר לבצע משימות מרחוק.
פותחים את אפליקציית הלקוח של המשימות מרחוק ופועלים לפי התהליך של ביטול הרישום של לקוח כדי לבטל את הקישור של הרכב לחשבון של הבעלים הקודם. הבעלים החדש יכול לפעול לפי התהליך של רישום לקוח כדי לקשר את הרכב לחשבון שלו ולהחליף את החשבון המקושר הקודם.
הבעלים החדש יכול להשתמש בתהליך רישום לקוח כדי לקשר את הרכב לחשבון שלו ולהחליף את החשבון המקושר הקודם.
בדיקת לקוח המשימות מרחוק
אנחנו מספקים את הספרייה HAL של הגישה מרחוק default
למטרת בדיקת לקוחות של משימות מרחוק. אפשר להשתמש בפקודה הבאה של debug
כדי להחדיר למשימה מרוחקת מזויפת ל-HAL, שתישלח ללקוח המשימות המרוחקות אם תספקו את מזהה הלקוח הנכון. כדי לקבל את מזהה הלקוח, צריך לתעד את פרטי הרישום בהטמעה של לקוח המשימות מרחוק.
adb root && adb shell dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default --inject-task [clientID] [taskData]