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

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

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

ארכיטקטורה

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

image

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

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

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

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

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

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

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

זרימת עבודה

סעיף זה מפרט את השלבים בזרימת עבודה לדוגמה.

זרימת עבודה לדוגמה

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

  1. משתמש מחנה רכב במוסך.

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

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

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

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

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

זרימת עבודה מפורטת

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

רשום לקוח

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

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

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

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

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

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

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

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

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

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

image

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

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

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

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

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

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

לספק משימות

בענן:

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

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

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

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

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

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

  3. Car Service מקבל משימות מ-TCU.

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

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

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

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

  7. לקוח משימות מרחוק מודיע לשירות רכב כאשר המשימה הושלמה.

  8. במידת הצורך, שירות הרכב משחזר את מצב החשמל של הרכב.

image

איור 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
  • מזהה אם הרכב בשימוש.
  • לאחר שהמשתמש פותח את הרכב או כשהמשתמש מתקרב לרכב. אמור להיות true .
  • משך זמן מסוים לאחר שהמשתמש מכבה את הרכב או כאשר המשתמש נועל את הרכב. צריך להיות false .
  • כאשר true , AAOS לא מנסה לכבות את הרכב כאשר המשימה המרוחקת הושלמה.

למידע נוסף, ראה מאפייני מערכת נתמכים .

מצב שקט

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

image

איור 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]