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

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

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

ארכיטקטורה

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

תמונה

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

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

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

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

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

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

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

זרימת עבודה

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

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

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

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

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

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

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

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

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

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

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

רישום לקוח

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

  1. עם ההפעלה, שירות הרכב מקבל את פרטי הרכב מהגישה מרחוק HAL.

  2. עם האתחול, Car Service מפעיל את כל הלקוחות של המשימות המרוחקות על סמך Intent-filter והרשאה.

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

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

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

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

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

    שרת המשימות המרוחק צריך לאמת שמזהה הרכב שסופק הבקשה תואמת למזהה הרכב של השולח. אפשר לעשות את זה דרך אימות (attestation) של הרכב.

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

תמונה

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

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

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

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

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

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

לבצע משימות

בענן:

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

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

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

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

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

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

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

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

  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;
}

מחזור החיים מנוהל על ידי שירות הרכב. שירות הרכב מקושר לשירות הזה במהלך וכשנשלחת משימה מרחוק. קישור השירות לרכב מבטל את הקישור שלו לשירות הזה כאשר שהמשימה הושלמה. מידע נוסף זמין במאמר הבא: ניהול מחזור החיים של שירות.

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

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

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)

הגדרת קריאה חוזרת (callback) כשנשלחת בקשה למשימה מרחוק.

void clearRemoteTaskCallback() מחיקת קריאה חוזרת (callback) של משימה מרחוק שהוגדרה בעבר.
void notifyApStateChange(in ApState state)

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

ממשק הקריאה החוזרת (callback) מוגדר ב- IRemoteTaskCallback.aid

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

קריאה חוזרת (callback) שנשלחת כשנשלחת בקשה למשימה מרחוק.

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

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

עוצמת קול לרכב

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

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

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

מצב שקט

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

המצב השקט נשלט באמצעות שני קובצי sysfs מסוג ליבה (kernel) של Linux.

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

מערכת AAOS שפועלת ב-AP יכולה לתקשר עם הלקוח במצב שינה שפועל ב- TCU באמצעות HAL של גישה מרחוק.

תמונה

איור 4. TCU (לקוח לאחר יציאה ממצב שינה).

רכיבים בענן

שרת השכמה

שרת היציאה ממצב שינה מתקשר עם הלקוח ליציאה ממצב שינה ב-TCU כדי:

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

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

שרת משימות מרוחק

המשימות המרוחקות האלה מנוהלות על ידי שרת המשימות המרוחק.

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

  • שימוש בשרת המרוחק ליציאה ממצב שינה כדי להוציא את מעבד האפליקציה ממצב שינה כלי הרכב.

  • אפליקציית הלקוח למשימות מרחוק פועלת ברכב.

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

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

דרישות לגבי פרטיות ואבטחה

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

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

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

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

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

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

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

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

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

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

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

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