一、RSP架构简介
RSP(Remote SIM Provisioning),指远程SIM配置。利用eUICC/eSIM技术,移动用户可以在没有实体SIM卡的情况下,下载运营商配置文件并激活运营商服务。GSMA规定的RSP架构如下:
SM-DP+(Subscription Manager - Data Preparation +),签约数据准备模块。SM-DP+ 负责根据运营商的请求,创建、生成、管理和保护运营商生成的配置文件。它还负责在绑定配置文件包内交付配置文件,使绑定配置文件包可用于安全交付。
SM-DS(Subscription Manager - Discovery Server),签约数据发现服务模块。SM-DS提供一种机制,使SM-DP+可以与任何设备内的LDS进行通信。SM-DP+将目标设备的事件注册消息发送到SM-DS,目标设备中的LDS轮询根SM-DS,当SM-DS有目标设备的事件id,则会响应SM-DP+的地址。
LPA(Local Profile Assistant),本地签约数据文件辅助管理。分为LPAe(eUICC上的LPA)和LPAd(设备上的LPA)。LPA包括三个部分:本地发现服务(LDS, Local DisCovery Service)、本地签约数据文件下载(LPD, Local Profile Download)以及本地用户接口(LUI, Local User Interface)。它们的作用分别是:
(1) LDS: 从SM-DS获取SM-DP+登记的关于该eSIM的事件记录。
(2) LPD: 作为eSIM与SM-DP+之间的代理,从SM-DP+获取Profile数据包,再转移到eSIM中。
(3) LUI: 向用户提供Profile管理的功能,包括Profile的激活、去激活、删除等。
eUICC的内部高层架构如下:
ECASD(Embedded UICC Controlling Authority Security Domain),eUICC控制权限安全域,负责eUICC上安全域所需证书的安全存储。一个eUICC上有且仅有一个ECASD。
ISD-P(Issuer Security Domain-Profile),是用于托管配置文件的安全容器(安全域)。ISD-P与Profile Package interpreter(配置文件解释器,负责对接受的绑定配置文件包进行解码/解释)和作用于配置文件的下载与安装。ISD-P是SM-DP+在eUICC上的代表。
ISD-R(Issuer Security Domain-root),负责ISD-P的生成,并管理ISD-P的生命周期。
LPA Services,提供对 LPA 功能所需的服务和数据的必要访问:
(1) 根SM-DS地址
(2) 可选择存储的默认SM-DP+地址。
(3) 促进从 LPA 传输的绑定配置文件包的接收。
(4) 提供有关已安装配置文件及其配置文件元数据的信息。
(5) 提供本地配置文件管理。
(6) 为 LPA 提供与 SM-DS 进行身份验证和交互的功能。
(7) 确保对 EID 的访问仅限于 LPA。
二、流程简介
1. LPA发起下载
2. 通过激活码下载配置文件
3. 本地配置文件管理
3.1 激活配置文件
3.2 去激活配置文件
3.3 删除配置文件
三、开发LPA
1. LPA要求
(1) eUICC上的LPA和操作系统必须支持最低 2.0 或 2.2 版的 GSMA RSP。
(2) 与(1)相匹配的RSP版本的SM-DP+ 和 SM-DS 服务器。
(3) 设备的调制解调器,见针对 eSIM 支持的调制解调器要求。
2. LPA实现
LPA 是一款独立的系统应用,应包含在 Android 构建映像中。Android 框架可自动发现可用的最佳 LPA 并与之连接,然后通过 LPA 实例路由所有 eUICC 操作。LPA 由两个独立的组件(可在同一 APK 中实现)组成:LPA 后端以及 LPA 界面(即 LUI)。
实现LPA后端,需要扩展 EuiccService 并在清单文件中声明。此服务必须请求获得 android.permission.BIND_EUICC_SERVICE 系统权限,确保只有系统才能与之绑定。此服务还必须包含具有 android.service.euicc.EuiccService 操作的 intent 过滤器。应将该 intent 过滤器的优先级设置为非零值,以防设备上存在多个实现。清单文件声明如下:
<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>
实现 LUI,需为以下操作提供一个 Activity:
android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION
每个 Activity 也都必须获得 android.permission.BIND_EUICC_SERVICE 系统权限,而且都应当包含具有适当操作的 intent 过滤器,并属于 android.service.euicc.category.EUICC_UI 类别以及非零优先级。选择这些 Activity 的实现方案与选择 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>
实现与eUICC之间的通信,需要调用EuiccCardManager。
EuiccCardManager提供了 ES10 方法。这里的ES10可见图1和图2中的ES10a、ES10b、ES10c。
ES10a(LDS-LPA Services):设备中的LDS使用ES10a接口获取来自eUICC的已配置根SM-DS地址和可选的默认SM-DP地址。
ES10b(LPD-LPA Services):设备中的LPD和LPA Services使用ES10b将绑定配置文件传输到eUICC。
ES10c(LUI-LPA Services):设备中的LUI和LPA Services使用ES10c接口为终端用户提供本地配置文件管理功能。
获取EuiccCardManager实例:
EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);
LPA使用EuiccCardManager获取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 会通过 AIDL 接口绑定到 EuiccCardController(在Phone进程中运行),而且每个 EuiccCardManager 方法均会通过不同的专用 AIDL 接口从电话进程接收回调。使用 EuiccCardManager API 时,调用方 (LPA) 必须提供 Executor 对象,以便通过该对象调用回调。此 Executor 对象可以在单个线程上运行,也可以在线程池上运行。
大多数 EuiccCardManager API 都具有相同的使用模式。以下是另一些使用 EuiccCardManager与eUICC进行通信的方法。
将绑定的配置文件包加载到 eUICC:
...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
AsyncTask.THREAD_POOL_EXECUTOR, callback);
切换为具有指定ICCID的其他配置文件:
...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
AsyncTask.THREAD_POOL_EXECUTOR, callback);
通过eUICC获取默认的SM-DP+地址:
...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
callback);
检索指定通知事件的通知列表:
...
cardMgr.listNotifications(eid,
EuiccNotification.Event.INSTALL
| EuiccNotification.Event.DELETE /* events */,
AsyncTask.THREAD_POOL_EXECUTOR, callback);
3. LPA测试
AOSP中不提供端到端的CTS测试用例,只提供基本的测试用例,以确保公开的eUICC API在Android build有效,见:针对eUICC API的CTS测试用例。
LPA 则应进行更严格的测试,见:RSP测试规范:SGP.23-v1.4.pdf。
四、参考文献
实现eSIM
eSIM白皮书
RSP架构:SGP.21_v2.2.pdf
RSP测试规范:SGP.23-v1.4.pdf