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

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

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

ארכיטקטורה

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

תמונה

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

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

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

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

רכיב תוכנה ב-Android תיאור
שירות רכב שירות של AAOS framework שמספק ממשקי API לגישה מרחוק.
לקוח משימות מרוחק מחלקת Service שנכתבה על ידי ספק ומבצעת משימות מרחוק. מערכת Android אחת יכולה להריץ כמה לקוחות של משימות מרוחקות.
Remote access 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. הלקוח של המשימה מרחוק מודיע לשירות הרכב כשהמשימה הושלמה.

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

תמונה

איור 3. להעביר משימות.

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

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

Remote access 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

שכבת הפשטת חומרה לרכב

כדי לתמוך בתכונת הגישה מרחוק, 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 שפועלת במעבד האפליקציות יכולה לתקשר עם לקוח ההפעלה שפועל ב-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]