Создание приложения LPA — часть 3

Вы можете реализовать свой собственный LPA, который должен быть подключен к API Android Euicc. В следующих разделах дается краткий обзор создания приложения LPA и его интеграции с системой Android.

Требования к оборудованию / модему

LPA и операционная система eSIM на микросхеме eUICC должны поддерживать как минимум GSMA RSP (Remote SIM Provisioning) v2.0 или v2.2. Также следует запланировать использование серверов SM-DP + и SM-DS, которые имеют соответствующую версию RSP. Для получения подробной архитектуры RSP см. Спецификацию архитектуры RSP GSMA.21 SGP.21 .

Кроме того, для интеграции с API eUICC в Android 9 модем устройства должен отправлять возможности терминала с кодированной поддержкой eUICC (локальное управление профилем и загрузка профиля). Также необходимо реализовать следующие API:

  • IRadio HAL v1.1: setSimPower
  • IRadio HAL v1.2: getIccCardStatus
  • IRadioConfig HAL v1.0: getSimSlotsStatus

Модем должен распознавать eSIM с включенным профилем загрузки по умолчанию в качестве действующей SIM-карты и поддерживать питание SIM-карты включенным.

Полный список требований к модему см. В разделе Требования к модему для поддержки eSIM .

EuiccService

Создание приложения LPA состоит из двух отдельных компонентов (оба могут быть реализованы в одном и том же APK): внутренний интерфейс LPA и интерфейс LPA или LUI.

Для реализации бэкэнда LPA вы должны расширить EuiccService и объявить эту службу в файле манифеста. Служба должна требовать android.permission.BIND_EUICC_SERVICEразрешения системы, чтобы гарантировать, что только система может связываться с ней. Служба также должна включать фильтр намерений с android.service.euicc.EuiccServiceдействием. Приоритет фильтра намерений должен быть установлен на ненулевое значение в случае, если на устройстве присутствует несколько реализаций. Например:

<service
    android:name=".EuiccServiceImpl"
    android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.EuiccService" />
    </intent-filter>
</service>

Внутренне платформа Android определяет активный LPA и взаимодействует с ним по мере необходимости для поддержки API-интерфейсов Android eUICC. PackageManagerзапрашивается для всех приложений с android.permission.WRITE_EMBEDDED_SUBSCRIPTIONSразрешением, которое указывает сервис для android.service.euicc.EuiccServiceдействия. Сервис с наивысшим приоритетом выбран. Если служба не найдена, поддержка LPA отключена.

Для реализации LUI необходимо предоставить действие для следующих действий:

  • android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
  • android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION

Как и в случае службы, каждое действие должно требоватьandroid.permission.BIND_EUICC_SERVICEразрешения системы. У каждого должен быть фильтр намерений с соответствующим действием, android.service.euicc.category.EUICC_UIкатегорией и ненулевым приоритетом. Подобная логика используется для выбора реализаций этих действий, как и при выборе реализации EuiccService. Например:

<activity android:name=".MyLuiActivity"
          android:exported="true"
          android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS" />
        <action android:name="android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.service.euicc.category.EUICC_UI" />
    </intent-filter>
</activity>

Это подразумевает, что пользовательский интерфейс, реализующий эти экраны, может отличаться от того, который реализует APK EuiccService. Независимо от того, иметь ли один APK или несколько APK (например, тот, который реализует, EuiccService и тот, который обеспечивает действия LUI), это выбор дизайна.

EuiccCardManager

EuiccCardManagerинтерфейс для связи с чипом eSIM Он обеспечивает функции ES10 (как описано в спецификации GSMA RSP) и обрабатывает команды запроса / ответа APDU низкого уровня, а также синтаксический анализ ASN.1. EuiccCardManagerявляется системным API и может вызываться только системными приложениями.

Приложения для операторов связи, LPA и Euicc API

Рисунок 2. И приложение-носитель, и LPA используют Euicc API

API для работы с профилем EuiccCardManagerтребуют, чтобы вызывающая сторона была LPA. Это обеспечивается платформой Android. Это означает, что вызывающая сторона должна расширить EuiccServiceи быть объявлена ​​в вашем файле манифеста, как описано в предыдущих разделах.

Подобно тому EuiccManager, чтобы использовать EuiccCardManagerAPI, ваш LPA должен сначала получить экземпляр с EuiccCardManagerпомощью Context#getSystemService:

EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);

Затем, чтобы получить все профили на eUICC:

ResultCallback<EuiccProfileInfo[]> callback =
       new ResultCallback<EuiccProfileInfo[]>() {
           @Override
           public void onComplete(int resultCode,
                   EuiccProfileInfo[] result) {
               if (resultCode == EuiccCardManagerReflector.RESULT_OK) {
                   // handle result
               } else {
                   // handle error
               }
           }
       };

cardMgr.requestAllProfiles(eid, AsyncTask.THREAD_POOL_EXECUTOR, callback);

Внутренне EuiccCardManagerсвязывается с EuiccCardController(который выполняется в процессе телефона) через интерфейс AIDL, и каждый EuiccCardManagerметод получает свой обратный вызов от процесса телефона через свой отдельный выделенный интерфейс AIDL. При использовании EuiccCardManagerAPI вызывающая сторона (LPA) должна предоставить Executor сквозную функцию, через которую вызывается обратный вызов. Это Executorможет выполняться в одном потоке или в пуле потоков по вашему выбору.

Большинство EuiccCardManagerAPI имеют одинаковый шаблон использования. Например, чтобы загрузить пакет привязанного профиля в eUICC:

...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

Переключиться на другой профиль с заданным ICCID:

...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

Получить адрес SM-DP + по умолчанию от чипа eUICC:

...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
        callback);

Получить список уведомлений о данных событиях уведомления:

...
cardMgr.listNotifications(eid,
        EuiccNotification.Event.INSTALL
              | EuiccNotification.Event.DELETE /* events */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);
Ссылка на основную публикацию
Adblock
detector