הגדרת גישה מרחוק

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

מידע נוסף זמין בסעיפים הבאים:

ארכיטקטורה

התוכן הבא מניח שנעשה שימוש בארכיטקטורה לדוגמה הבאה, שהיא היפותטית ועשויה שלא לשקף ארכיטקטורה בפועל. יצרני ציוד מקורי (OEM) צריכים להתאים הטמעה בפועל לארכיטקטורות של כלי הרכב והשרתים שלהם.

תמונה

איור 1. דוגמה לארכיטקטורה.

ארכיטקטורת הדוגמה מורכבת מרכיבי חומרה הבאים:

רכיב חומרה תיאור
מעבד אפליקציות המעבד שמריץ את Android. יכול להיות שמערכת Android תפעל בזיכרון וירטואלי (VM) (ולא בחומרה בפועל) במעבד הזה.
מעבד רכב מעבד שאחראי על בקרת ההספק של מעבד האפליקציה.
יחידת בקרה טלמטית (TCU) המעבד ברכב תמיד יכול לקבל הודעות מרחוק מהענן. ההנחה היא שה-TCU תמיד פועל או במצב צריכה מופחתת. משתמשים בהודעות מרוחקות כדי להפעיל את TCU.
הפעלת השרת שרת מרוחק שפועל בענן ואחראי על תקשורת עם יחידת TCU ברכב כדי להנפיק פקודות הפעלה.
שרת משימות מרוחק שרת משימות מרוחק פועל בענן ומקיים אינטראקציה עם אנשים ומנהל משימות מרוחקות.

ארכיטקטורת הדוגמה מורכבת מרכיבי התוכנה הבאים, שכולם פועלים ב-Android:

רכיב תוכנה ב-Android תיאור
שירות רכב שירות של מסגרת AAOS שמספק ממשקי API לגישה מרחוק.
לקוח משימות מרוחק מחלקת Service שנכתבה על ידי ספק ומבצעת משימות מרחוק. מערכת Android אחת יכולה להריץ כמה לקוחות של משימות מרוחקות.
שכבת הפשטה לחומרה (HAL) לגישה מרחוק חובה להטמיע את ההגדרה הזו כדי לאפשר גישה מרחוק.
שכבת הפשטה לתקשורת בין AAOS לבין רכיב שאינו Android, כמו TCU.

בהמשך מתוארים רכיבי תוכנה שאינם Android:

רכיב תוכנה שאינו Android תיאור
הוצאת לקוח ממצב שינה תוכנה שפועלת ב-TCU ושומרת על חיבור לטווח ארוך עם שרת ההפעלה. הוא גם שומר על חיבור ל-HAL של גישה מרחוק כדי להעביר משימות מרחוק לשירות הרכב.
הטמעה של שרת להפעלת מחשבים שרת שמקיים תקשורת עם לקוח ההפעלה שפועל ב-TCU. יכול לשלוח בקשות להפעלת הלקוח.
הטמעה של שרת משימות מרוחק שרת שמנהל משימות מרוחקות. המשתמשים יוצרים אינטראקציה עם השרת הזה כדי להנפיק משימות מרחוק ולעקוב אחריהן.

תהליך עבודה

בקטע הזה מפורטים השלבים בתהליך עבודה לדוגמה.

תהליך עבודה לדוגמה

תהליך עבודה מפורט יכול להיראות כך:

  1. המשתמש מחנה את הרכב בחניון.

  2. השותף מבקש לעדכן את הרכב במהלך הלילה, כשלא סביר שיהיו אינטראקציות עם הרכב.

  3. שרת הענן של השותף שולח לרכב משימה מרוחקת לעדכון המערכת. באופן ספציפי, יחידת הבקרה הטלמטית (TCU).

  4. יחידת ה-TCU של הרכב מעירה את יחידת הבקרה האלקטרונית (ECU) של Android ושירות OEM מפעיל את מצב החנייה.

  5. מערכת Android מפעילה את מצב המוסך כדי להוריד ולהתקין עדכונים דרך Google Play.

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

תהליך עבודה מפורט

יש שני שלבים חשובים שצריך לבצע כדי לקבל גישה מרחוק. הראשונה היא לרשום את הלקוח, כלומר לקשר משתמש ספציפי ללקוח משימה מרוחק ספציפי שפועל ברכב ספציפי. האפשרות השנייה היא להעביר משימה, כלומר להעביר את המשימה מרחוק למשתמש ספציפי ללקוח הספציפי של המשימה מרחוק שפועל ברכב הספציפי.

רישום לקוח

כדי להשתמש בתכונת הגישה מרחוק, המשתמש צריך לפתוח את אפליקציית הלקוח של המשימות מרחוק לפחות פעם אחת ולהשלים את תהליך רישום הלקוח (טקסט מודגש מציין משימות שמיושמות על ידי AAOS):

  1. במהלך האתחול, Car Service מקבל מידע על הרכב מ-HAL של הגישה מרחוק.

  2. בזמן האתחול, Car Service מפעיל את כל לקוחות המשימות מרחוק על סמך מסנן הכוונות וההרשאות.

  3. כשמפעילים את לקוח המשימות המרוחקות, הוא נרשם ב-Car Service.

  4. שירות הרכב מודיע ללקוח המשימה המרוחקת על פרטי הרישום, כולל מזהה הרכב ומספר הלקוח. מזהה הלקוח הוא ייחודי ומוקצה על ידי שירות הרכב ללקוח הזה. הוא מובטח להיות ייחודי

  5. המשתמש מתחבר לשרת המשימות המרוחק באמצעות לקוח המשימות המרוחק ומפעיל את תכונת הגישה מרחוק לרכב הזה. בשלב הזה בדרך כלל מתבצע אימות דרך שרת המשימות המרוחק.

  6. הלקוח של המשימה המרוחקת מעלה את פרטי המשתמש יחד עם מזהה הרכב ומזהה הלקוח לשרת של המשימה המרוחקת, ומבקש לקשר את המשתמש עם הלקוח הספציפי הזה והרכב הספציפי הזה.

    אופציונלית, השלב הזה עשוי לכלול אימות דו-שלבי נוסף מצד המשתמש.

    שרת המשימות המרוחק צריך לאמת שמזהה הרכב שצוין בבקשה תואם למזהה הרכב של השולח. אפשר לעשות זאת באמצעות אימות הרכב.

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

תמונה

איור 2. רושמים לקוח.

ביטול הרישום של לקוח

משתמש יכול לבטל את הקישור של הרכב לחשבון שלו מהרכב או משרת המשימות המרוחק:

  • ברכב, המשתמשים יכולים לפתוח את אפליקציית הלקוח של המשימות מרחוק ולשלוח בקשה לביטול הקישור של הרכב הזה לחשבונות המשתמשים שקושרו אליו בעבר.

  • בשרת המשימות המרוחק, המשתמשים יכולים להיכנס לחשבון שלהם ולבטל את הקישור של רכב שקושר בעבר לחשבון הזה.

אם המשתמש מבטל את הקישור של הרכב לחשבון שלו, שרת המשימות מרחוק צריך להסיר את המיפוי המאוחסן של המשתמש הספציפי.

העברת משימות

בענן:

  1. משתמש שולח משימה מרחוק לשרת המשימות מרחוק, כדי לבצע אותה ברכב ספציפי.

  2. שרת המשימות המרוחק ממפה את מזהה המשתמש למזהה הרכב ולמזהה הלקוח. הוא שולח את נתוני המשימה, מזהה הרכב ומזהה הלקוח לשרת ההפעלה.

  3. שרת ההפעלה מאתר את יחידת ה-TCU הספציפית לפי מזהה הרכב (בהנחה שהרישום של יחידת ה-TCU כבר בוצע) ושולח את נתוני המשימה ואת מספר הלקוח ליחידת ה-TCU.

ברכב (טקסט מודגש מציין משימות שמבוצעות על ידי AAOS):

  1. ‫TCU מקבל משימות מרחוק משרת מרוחק.

  2. אם מעבד האפליקציות (AP) שמריץ את AAOS כבוי, יחידת הבקרה הטלמטית (TCU) משתמשת במעבד הרכב (VP) כדי להפעיל את מעבד האפליקציות.

  3. שירות הרכב מקבל משימות מ-TCU.

  4. שירות Car מחלק את המשימות ללקוח המשימות המרוחק המתאים.

  5. הלקוח של המשימה מרחוק מקבל את המשימה ומבצע אותה.

    (אופציונלי) לקוח משימות מרוחק יוצר קשר עם שרת המשימות כדי לקבל פרטים נוספים על המשימה ומבצע אותה.

  6. (אופציונלי) שירות לקוח של משימה מרוחקת מדווח על תוצאת המשימה לשרת המשימות.

  7. הלקוח של המשימה המרוחקת מודיע ל-Car Service כשהמשימה הושלמה.

  8. אם נדרש, שירות הרכב משחזר את מצב ההפעלה של הרכב.

תמונה

איור 3. לשלוח משימות.

כתיבת לקוח למשימות מרחוק

CarRemoteAccessManager מספק את ה-API לתכונות של גישה מרחוק. מידע נוסף זמין במאמר בנושא CarRemoteAccessManager. לקוח של משימות מרחוק הוא שירות Android שמבצע משימות מרחוק ומשתמש ב-CarRemoteAccessManager. כדי לעשות זאת, צריך להשתמש ב-PERMISSION_USE_REMOTE_ACCESS וב-PERMISSION_CONTROL_REMOTE_ACCESS ולהצהיר על intent-filter עבור 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 מבטל את הקישור לשירות הזה כשהמשימה מסתיימת. מידע נוסף זמין במאמר בנושא ניהול מחזור החיים של שירות.

לקוח המשימות המרוחק פועל כמשתמש המערכת, ולכן אין לו גישה לנתונים ספציפיים למשתמש.

בדוגמה הבאה אפשר לראות איך מטפלים בפונקציות הקריאה החוזרות הרשומות:

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:

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() מחיקת קריאה חוזרת (callback) של משימה מרחוק שהוגדרה קודם.
void notifyApStateChange(in ApState state)

מזהה אם מעבד האפליקציה מוכן לקבל משימות מרחוק.

ממשק הקריאה החוזרת מוגדר בכתובת IRemoteTaskCallback.aid.

דרגה תיאור
oneway void onRemoteTaskRequested(String clientId, in byte[] data)

קריאה חוזרת שמתבצעת כשמבקשים משימה מרחוק.

מידע נוסף מופיע בהטמעה לדוגמה עם TCU חיצוני. ההטמעה משתמשת בזרם קריאה לטווח ארוך כדי לקבל משימות מרחוק, והיא תומכת בפקודה debug הבאה:

dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default

ממשק vehicle HAL

כדי לתמוך בתכונת הגישה מרחוק, VHAL צריך לתמוך במאפיינים הבאים:

דרגה תיאור
SHUTDOWN_REQUEST שולח בקשה ליחידת הראש להיסגר.
VEHICLE_IN_USE
  • המערכת מזהה אם הרכב נמצא בשימוש.
  • אחרי שהמשתמש מבטל את נעילת הרכב או כשהמשתמש מתקרב לרכב. הערך צריך להיות true.
  • משך זמן מסוים אחרי שהמשתמש מכבה את הרכב או כשהמשתמש נועל את הרכב. הערך צריך להיות false.
  • כשמגדירים את true, מערכת AAOS לא מנסה לכבות את הרכב כשמשימת השלט מסתיימת.

מידע נוסף מפורט במאמר בנושא מאפייני מערכת נתמכים.

מצב שקט

התכונה 'גישה מרחוק' צריכה לתמוך במצב שקט כדי שהרכב יוכל לאתחל במצב שקט ולהפעיל משימות מרחוק כשאין משתמש ברכב. במצב שקט, מכשיר AAOS מופעל כשהתצוגה והאודיו מושבתים.

השליטה במצב שקט מתבצעת באמצעות שני קובצי sysfs של ליבת Linux.

דרגה תיאור
/sys/kernel/silent_boot/pm_silentmode_kernel_state

מייצג את המצב השקט הנוכחי.

/sys/kernel/silent_boot/pm_silentmode_hw_state

מייצג את אות החומרה להגדרת מצב שקט חדש.

מעבד הרכב שולח אות חומרה ל-SoC של Android כדי להפעיל או להשבית את מצב שקט. האות (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
  • מאמתים את המשתמש במהלך ההרשמה.
  • מאמתים את שרת המשימות המרוחק.
  • עמידה בכל דרישות האבטחה של שירות Android. לדוגמה, הרשאות מוגבלות.
שרת משימות מרוחק MUST
  • חובה לאמת את שרת ההפעלה.
  • לספק אישור רכב. כלומר, לאמת שמזהה הרכב שצוין בבקשה זהה למזהה הרכב של השולח. אם אי אפשר לאמת את הרכב, צריך להשתמש באמצעים אחרים כדי לוודא שהמשתמש הוא הבעלים הנוכחי של הרכב.
  • מאמתים את זהות המשתמש.
  • עמידה בכל דרישות האבטחה של שרת שמטפל במידע על משתמשים.

איפוס להגדרות המקוריות והעברת בעלות

אם משתמש מבצע איפוס להגדרות היצרן, מזהה הלקוח שמאוחסן בשירות הרכב נמחק. עם זאת, השרתים (שרת המשימות המרוחק ושרת ההפעלה המרוחק) לא מקבלים הודעה. השרתים שומרים מיפוי ממזהה הלקוח שכבר לא בתוקף אל הרכב. כתוצאה מכך, אם המשתמש יתחיל משימה חדשה מרחוק לרכב, המערכת תשתמש במזהה הלקוח שתוקפו פג. הרכב מתעורר, אבל אי אפשר להפעיל את משימת השלט כי למשימת השלט יש מספר לקוח שונה שלא תואם.

בהמשך מפורטת שיטה אפשרית לאיפוס להגדרות המקוריות.

כשמשתמש מבצע איפוס להגדרות המקוריות, הספק מבקש מהמשתמש להתחבר לשרת המשימות המרוחק ולבטל את הקישור של הרכב לחשבון שלו, אם המשתמש קישר את הרכב לחשבון שלו בעבר. אין ערובה שלמכשיר תהיה גישה לרשת בזמן האיפוס להגדרות המקוריות. לכן, יכול להיות שלא תהיה אפשרות לשלוח את בקשת ביטול הקישור מהמכשיר בזמן האיפוס להגדרות המקוריות.

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

  • מבצעים איפוס להגדרות המקוריות. כך מובטח שמזהה הלקוח ייווצר מחדש. אחרי השלב הזה, הבעלים הקודם עדיין יכול להפעיל את הרכב, אבל הוא לא יכול יותר לבצע משימות מרחוק.

  • פותחים את אפליקציית הלקוח של המשימה מרחוק ופועלים לפי התהליך של ביטול הרישום של לקוח כדי לבטל את הקישור של הרכב לחשבון של הבעלים הקודמים. הבעלים החדשים יכולים לבצע את התהליך של רישום לקוח כדי לקשר את הרכב לחשבון שלהם ולהחליף את החשבון שקושר קודם.

  • הבעלים החדש יכול להשתמש בתהליך רישום לקוח כדי לקשר את הרכב לחשבון שלו ולהחליף את החשבון שקושר קודם.

בדיקת לקוח המשימות המרוחק

אנחנו מספקים את ספריית default HAL של גישה מרחוק לצורך בדיקה של לקוחות משימות מרחוק. אפשר להשתמש בפקודה debug הבאה כדי להחדיר משימה מרוחקת מזויפת ל-HAL, שמועברת ללקוח המשימה המרוחקת אם מספקים את מזהה הלקוח הנכון. אפשר לקבל את מזהה הלקוח על ידי רישום פרטי ההרשמה בהטמעה של לקוח המשימות המרוחק.

adb root && adb shell dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default --inject-task [clientID] [taskData]