אנדרואיד 14 מציגה את תכונת הגישה מרחוק החדשה, המאפשרת לשותפים להעיר מרחוק את אנדרואיד ברכב כדי לבצע משימות ספציפיות. לדוגמה, כדי להפעיל מצב Garage בן לילה כדי להחיל עדכוני תוכנה. נדרשים מספר רכיבים שאינם אנדרואיד עבור זרימת העבודה מקצה לקצה. אנדרואיד אינה מגדירה או מספקת יישום עבור רכיבים שאינם אנדרואיד (אחריות זו שייכת לך).
למידע נוסף, עיין בסעיפים הבאים:
זרימת עבודה . זרימת עבודה בין מספר רכיבים בארכיטקטורה לדוגמה לרישום לקוח והעברת משימות.
כתוב לקוח משימות מרחוק . השתמש בגישה מרחוק ולמד כיצד לכתוב לקוח משימות מרחוק.
יישום הספק . רכיבי ספק בארכיטקטורה לדוגמה לתמיכה בגישה מרחוק.
איפוס יצרן והעברת בעלות . למד כיצד לטפל באיפוס היצרן והעברת בעלות על רכב.
בדוק את לקוח הגישה מרחוק . למד כיצד לבדוק את תכונת הגישה מרחוק.
ארכיטקטורה
התוכן הבא מניח שנעשה שימוש בארכיטקטורה לדוגמה הבאה, שהיא היפותטית ועשויה שלא לשקף את הארכיטקטורה בפועל. יצרני OEM צריכים להתאים יישום בפועל לארכיטקטורות הרכב והשרתים שלהם.
איור 1. ארכיטקטורה לדוגמה.
ארכיטקטורת הדוגמה מורכבת ממרכיבי החומרה הבאים:
רכיב חומרה | תיאור |
---|---|
מעבד אפליקציות | מעבד שמריץ אנדרואיד. אנדרואיד עשוי לפעול על זיכרון וירטואלי (VM) (לא על חומרה בפועל) במעבד זה. |
מעבד רכב | מעבד האחראי על בקרת הספק עבור מעבד האפליקציה. |
יחידת בקרת טלמטיקה (TCU) | מעבד ברכב מסוגל תמיד לקבל הודעות מרחוק מהענן. ההנחה היא שה-TCU תמיד פועל או במצב צריכת חשמל נמוכה. השתמש בהודעות מרחוק כדי להעיר את ה-TCU. |
שרת השכמה | שרת מרוחק שפועל בענן ואחראי לתקשורת עם ה-TCU ברכב להוצאת פקודות השכמה. |
שרת משימות מרוחק | שרת משימות מרוחק פועל בענן ומקיים אינטראקציה עם אנשים ומנהל משימות מרוחקות. |
הארכיטקטורה לדוגמה מורכבת ממרכיבי התוכנה הללו, שכולם פועלים על אנדרואיד:
רכיב תוכנה באנדרואיד | תיאור |
---|---|
שירות מכוניות | שירות מסגרת AAOS המספק ממשקי API של גישה מרחוק. |
לקוח משימות מרחוק | מחלקת Service שנכתבה על ידי הספק המבצעת משימות מרוחקות. מערכת אנדרואיד אחת יכולה להריץ מספר לקוחות משימות מרוחקות. |
גישה מרחוק HAL | חייב להיות מיושם עבור גישה מרחוק. שכבת הפשטה לתקשורת בין AAOS לרכיב שאינו אנדרואיד כגון TCU. |
רכיבי תוכנה שאינם אנדרואיד מתוארים להלן:
רכיב תוכנה שאינו אנדרואיד | תיאור |
---|---|
לקוח השכמה | תוכנה הפועלת על TCU השומרת על חיבור ארוך חיים עם שרת ההתעוררות. הוא גם שומר על קשר עם ה-Remote Access HAL כדי לספק משימות מרוחקות לשירות המכוניות. |
הטמעת שרת השכמה | שרת שמתקשר עם לקוח ההתעוררות הפועל ב-TCU. יכול לשלוח בקשות השכמה ללקוח ההשכמה. |
הטמעת שרת משימות מרחוק | שרת שמנהל משימות מרוחקות. משתמשים מקיימים אינטראקציה עם שרת זה כדי להנפיק ולנטר משימות מרוחקות. |
זרימת עבודה
סעיף זה מפרט את השלבים בזרימת עבודה לדוגמה.
זרימת עבודה לדוגמה
זרימת עבודה מפורטת יכולה לדמות את הדברים הבאים:
משתמש מחנה רכב במוסך.
פרטנר מבקשת לעדכן את הרכב בן לילה כאשר אינטראקציות ברכב אינן סבירות.
שרת ענן פרטנר שולח משימה מרחוק של מערכת עדכון לרכב. באופן ספציפי, יחידת הבקרה הטלמטית (TCU).
ה-TCU של הרכב מעיר את יחידת הבקרה האלקטרונית של אנדרואיד (ECU) ושירות OEM מפעיל את מצב Garage.
אנדרואיד מפעיל את מצב Garage כדי להוריד ולהתקין עדכונים דרך Google Play.
לאחר החלת העדכון, אנדרואיד מסמן את המשימה כהשלמה או מסיים את החיבור או מגיע לזמן קצוב מוגדר.
זרימת עבודה מפורטת
יש שני שלבים חשובים הנדרשים לגישה מרחוק. הראשון הוא רישום הלקוח, כלומר קישור משתמש ספציפי ללקוח משימות מרוחק ספציפי הפועל על רכב ספציפי. השני הוא לספק משימה, שהיא לספק את המשימה המרוחקת עבור משתמש ספציפי ללקוח המשימה המרוחק הספציפי הפועל על הרכב הספציפי.
רשום לקוח
כדי להשתמש בתכונת הגישה מרחוק, משתמש צריך לפתוח את אפליקציית לקוח המשימות המרוחקות לפחות פעם אחת ולסיים את תהליך רישום הלקוח (טקסט מודגש מציין משימות שיושמו על ידי AAOS):
בעת האתחול, Car Service מקבל מידע על הרכב מה-HAL לגישה מרחוק.
בעת האתחול, Car Service משיק את כל לקוחות המשימות המרוחקות על סמך סינון כוונות והרשאה.
עם התחלת לקוח משימות מרחוק, לקוח המשימות המרוחק רושם את עצמו בשירות המכוניות.
Car Service מודיע ללקוח המשימה המרוחקת על פרטי רישום, כולל מזהה רכב ומזהה לקוח. מזהה הלקוח הוא ייחודי ומוקצה על ידי Car Service ללקוח זה. מובטח שזה יהיה ייחודי בין כל לקוחות המשימות המרוחקות באותו רכב.
המשתמש מתחבר לשרת המשימות המרוחק דרך לקוח המשימות המרוחק ומאפשר את תכונת הגישה מרחוק עבור רכב זה. שלב זה כולל בדרך כלל אימות דרך שרת המשימות המרוחק.
לקוח המשימות המרוחק מעלה את המידע של המשתמש יחד עם מזהה הרכב ומזהה הלקוח לשרת המשימות המרוחק ומבקש ממנו לקשר את המשתמש עם הלקוח הספציפי הזה ורכב הספציפי הזה.
לחלופין, שלב זה עשוי לכלול אימות דו-גורמי נוסף מהמשתמש.
שרת המשימות המרוחק חייב לאמת שמזהה הרכב שסופק בבקשה תואם את מזהה הרכב של השולח, דבר שניתן לעשות באמצעות אישור רכב.
אלא אם יתבצע איפוס להגדרות היצרן, תהליך רישום הלקוח נדרש פעם אחת לכל משתמש לכל רכב. מזהה הלקוח מאוחסן באופן מקומי בשירות הרכב ונשאר זהה עבור אותו לקוח.
איור 2. רשום לקוח.
בטל רישום של לקוח
משתמש יכול לבטל את קישור הרכב מהחשבון שלו מהרכב או משרת המשימות המרוחק:
ברכב , משתמשים יכולים לפתוח את אפליקציית לקוח המשימות המרוחקת ולהוציא בקשת ביטול קישור לביטול קישור הרכב הזה מחשבונות המשתמש שלו מקושרים בעבר.
בשרת המשימות המרוחק , משתמשים יכולים להיכנס לחשבון שלהם ולבטל קישור של רכב מקושר בעבר מחשבון זה.
אם המשתמש מבטל את קישור הרכב מהחשבון שלו, שרת המשימות המרוחק חייב להסיר את המיפוי המאוחסן עבור המשתמש הספציפי.
לספק משימות
בענן:
משתמש משתמש בשרת המשימות המרוחק כדי לשלוח משימה מרוחקת לרכב ספציפי.
שרת המשימות המרוחק ממפה את מזהה המשתמש למזהה הרכב ומזהה הלקוח. הוא שולח את נתוני המשימה, מזהה הרכב ומזהה הלקוח לשרת ההשכמה.
שרת ההשכמה מוצא את ה-TCU הספציפי עבור מזהה הרכב (בהנחה שהרישום TCU כבר נעשה) ושולח את נתוני המשימה ומזהה הלקוח ל-TCU.
על הרכב (טקסט מודגש מציין משימות שבוצעו על ידי AAOS):
TCU מקבל משימות מרוחקות משרת מרוחק.
אם מעבד האפליקציות (AP) הפועל AAOS כבוי, TCU משתמש במעבד הרכב (VP) כדי להעיר את ה-AP.
Car Service מקבל משימות מ-TCU.
Car Service מפיץ משימות ללקוח המשימות המרוחק המתאים.
לקוח משימות מרוחק מקבל ומבצע את המשימה.
( אופציונלי ) שרת משימות לקוח משימות מרחוק יוצר קשר עם שרת המשימות לקבלת פרטים נוספים על המשימה ומבצע את המשימה.
( אופציונלי ) שירות לקוח משימות מרחוק מדווח על תוצאת המשימות לשרת המשימות.
לקוח משימות מרחוק מודיע לשירות רכב כאשר המשימה הושלמה.
במידת הצורך, שירות הרכב משחזר את מצב החשמל של הרכב.
איור 3. העברת משימות.
כתוב לקוח משימות מרחוק
CarRemoteAccessManager
מספק את ה-API לתכונות גישה מרחוק. למידע נוסף, ראה CarRemoteAccessManager . לקוח משימות מרחוק הוא שירות אנדרואיד שמבצע משימות מרוחקות ומשתמש 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>
לקוח משימות מרחוק צריך לרשום את עצמו לשירות המכוניות במהלך היצירה:
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 מתנתק לשירות זה כשהמשימה תושלם. למידע נוסף, ראה ניהול מחזור החיים של שירות .
לקוח המשימות המרוחק פועל כמשתמש המערכת כך שאין לו גישה לנתונים ספציפיים למשתמש.
הדוגמה הבאה מראה כיצד לטפל בהתקשרויות חוזרות רשומות:
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 הבאה ב-userdebug/eng build:
adb shell cmd car_service enable-feature car_remote_access_service
דרישות ב-Android
גישה מרחוק HAL
שכבת ההפשטה של החומרה לגישה מרחוק (HAL) היא שכבת הפשטה המיושמת על ידי ספק לתקשורת בין AAOS ל-ECU אחר (לדוגמה, TCU). זה חובה לתמיכה בתכונת הגישה מרחוק. אין צורך ליישם אותו אם תכונת הגישה מרחוק אינה מיושמת.
הממשק מוגדר ב- IRemoteAccess.aidl וכולל את השיטות הבאות:
מעמד | תיאור |
---|---|
String getVehicleId() | מקבל מזהה רכב ייחודי שניתן לזהות על ידי שרת ההשכמה. |
String getWakeupServiceName() | מקבל את השם של שרת ההשכמה המרוחק. |
String getProcessorId() | מקבל מזהה מעבד ייחודי שניתן לזהות על ידי הערת הלקוח. |
void setRemoteTaskCallback(IRemoteTaskCallback callback) מגדיר התקשרות חוזרת שתתבצע כאשר מתבקשת משימה מרוחקת. | |
void clearRemoteTaskCallback() | מנקה קריאה חוזרת של משימה מרחוק שהוגדרה בעבר. |
void notifyApStateChange(in ApState state) מזהה אם מעבד האפליקציה מוכן לקבל משימות מרוחקות. |
ממשק ההתקשרות חזרה מוגדר בכתובת IRemoteTaskCallback.aid
.
מעמד | תיאור |
---|---|
oneway void onRemoteTaskRequested(String clientId, in byte[] data) התקשרות חוזרת שנקראת כאשר מתבקשת משימה מרוחקת. |
ראה את יישום ההתייחסות עם TCU חיצוני. היישום משתמש בזרם קריאה ארוך חיים כדי לקבל משימות מרוחקות ותומך בפקודת debug
הבאה:
dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default
רכב HAL
כדי לתמוך בתכונת הגישה מרחוק, VHAL חייב לתמוך במאפיינים הבאים:
מעמד | תיאור |
---|---|
SHUTDOWN_REQUEST | מבקש כיבוי יחידת הראש. |
VEHICLE_IN_USE |
|
למידע נוסף, ראה מאפייני מערכת נתמכים .
מצב שקט
יש לתמוך במצב שקט עבור תכונת הגישה מרחוק כדי שהרכב יוכל לאתחל במצב שקט כדי לבצע משימות מרוחקות כאשר אין משתמש נוכח. במצב שקט, מכשיר AAOS מופעל כשהתצוגה והשמע כבויים.
מצב שקט נשלט באמצעות שני קבצי sysfs
של ליבת לינוקס.
מעמד | תיאור |
---|---|
/sys/kernel/silent_boot/pm_silentmode_kernel_state מייצג את המצב השקט הנוכחי. | |
/sys/kernel/silent_boot/pm_silentmode_hw_state מייצג את אות החומרה להגדרת מצב שקט חדש. |
מעבד הרכב שולח אות HW ל-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 כך שהמערכת מופעלת כשהתצוגה/שמע כבויה.
רכיבים שאינם אנדרואיד לרכב
מעבד רכב
מעבד הרכב הוא מעבד ברכב שיכול לשלוט בכוח של מעבד האפליקציה המריץ אנדרואיד. בארכיטקטורה לדוגמה, TCU מעיר את מעבד האפליקציה באמצעות שליחת אות למעבד הרכב.
רכיבים שאינם אנדרואיד לרכב
ה-TCU של הרכב יכול תמיד לקבל הודעות מרחוק.
לקוח ההתעוררות פועל על ה-TCU כדי להבטיח חיבור ארוך חיים עם שרת ההתעוררות המרוחק.
AAOS הפועל ב-AP יכול לתקשר עם לקוח ההתעוררות הפועל ב-TCU דרך HAL הגישה מרחוק.
איור 4. TCU (לקוח התעוררות).
רכיבים על הענן
שרת השכמה
שרת ההתעוררות מתקשר עם לקוח ההשכמה ב-TCU כדי:
- שמור על קשר ארוך חיים עם ה-TCU של הרכב.
- מצא TCU ספציפי על סמך מזהה רכב.
- דווח על מצב רכב. לדוגמה, מקוון או לא מקוון, או זמן מקוון אחרון לשרת המשימות המרוחק.
ביישום בפועל, ניתן למזג שרת התעוררות עם שרת משימות מרוחק.
שרת משימות מרוחק
שרת המשימות המרוחק מנהל את המשימות המרוחקות הללו.
המשתמש מקיים אינטראקציה עם השרת כדי להתחיל משימות מרוחקות חדשות ולנטר משימות מרוחקות.
משתמש בשרת ההשכמה המרוחק כדי להעיר את מעבד האפליקציה ברכבים.
מקיים אינטראקציה עם לקוח המשימות המרוחק הפועל על הרכב.
מאחסן פרטי רישום לקוח. זה משייך משתמש ספציפי ללקוח משימות מרוחק ספציפי ברכב ספציפי.
בדרך כלל נתוני המשימות הנשלחים דרך שרת המשימות המרוחק לשרת ההתעוררות, ל-TCU של הרכב, ובסופו של דבר ללקוח המשימות המרוחק, הם פשוט מזהה משימה. לקוח המשימות המרוחק משתמש במזהה המשימה כדי להביא את המידע המפורט משרת המשימות המרוחק.
דרישות פרטיות ואבטחה
מְשִׁימָה | מַצָב | דְרִישָׁה |
---|---|---|
TCU (לקוח השכמה) | צריך |
|
שרת השכמה | צריך |
|
לקוח משימות מרחוק | צריך |
|
שרת משימות מרוחק | צריך |
|
איפוס להגדרות היצרן והעברת בעלות
אם משתמש מבצע איפוס להגדרות היצרן, מזהה הלקוח המאוחסן בשירות הרכב נמחק. עם זאת, השרתים (שרת משימות מרוחק ושרת השכמה מרוחק) אינם מקבלים מידע. השרתים שומרים מיפוי ממזהה הלקוח שפג תוקפו לרכב. כתוצאה מכך, אם המשתמש מתחיל משימה מרחוק חדשה עבור הרכב, הוא משתמש במזהה הלקוח שפג תוקפו. הרכב מתעורר, אך לא ניתן לבצע את המשימה המרוחקת מכיוון שללקוח המשימה המרוחקת יש מזהה לקוח אחר שאינו תואם.
להלן מתאר יישום אפשרי אחד לאיפוס היצרן.
כאשר משתמש מנפיק איפוס להגדרות היצרן, הספק מבקש מהמשתמש להיכנס לשרת המשימות המרוחק ולבטל את קישור הרכב מהחשבון שלו אם המשתמש קישר את הרכב בעבר. לא מובטחת שלמכשיר תהיה גישה לרשת בזמן איפוס היצרן. לכן, הוצאת בקשת ביטול הקישור בזמן איפוס היצרן מהמכשיר עשויה להיות בלתי אפשרית.
בכל פעם שהבעלות על רכב מועברת, יש לבצע פעולות מסוימות כדי להבטיח שהבעלים הקודם לא יוכל עוד להוציא משימות מרוחקות לרכב. לדוגמה, הבעלים החדש עשוי להתבקש:
בצע איפוס להגדרות היצרן. זה מבטיח שמזהה הלקוח נוצר מחדש. לאחר שלב זה, הבעלים הקודם עדיין יכול להעיר את הרכב, אך אינו יכול עוד לבצע משימות מרוחקות.
פתח את אפליקציית לקוח המשימות המרוחקת ובצע את תהליך בטל רישום לקוח כדי לבטל את קישור הרכב מחשבון הבעלים הקודם. הבעלים החדש יכול לעקוב אחר תהליך רישום לקוח כדי לקשר את הרכב לחשבון שלו ולהחליף את החשבון המקושר קודם לכן.
הבעלים החדש יכול להשתמש בתהליך רישום לקוח כדי לקשר את הרכב לחשבון שלו ולהחליף את החשבון שקושר קודם לכן.
בדוק את לקוח המשימות המרוחק
אנו מספקים את ספריית default
של גישה מרחוק HAL לבדיקת לקוחות משימות מרוחקות. אתה יכול להשתמש בפקודת debug
הבאה כדי להחדיר משימה מרוחקת מזויפת ל-HAL, אשר מועברת ללקוח המשימות המרוחקת שלך אם אתה מספק את מזהה הלקוח הנכון. אתה יכול לקבל את מזהה הלקוח על ידי רישום פרטי הרישום ביישום לקוח המשימות המרוחקות שלך.
adb root && adb shell dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default --inject-task [clientID] [taskData]