UICC
前置文章
- 《Android系统之System Server大纲》
- 《Android无线电信息管理开篇准备工作》
- 《初识com.android.phone》
- 《PhoneInterfaceManager》
- 《TelephonyTesgistry》
前言
在《Android无线电信息管理开篇准备工作》一文中,我们打算学习掌握 TelephonyRegistry、PhoneInterfaceManager、SubscriptionController 的功能和作用。其中 TelephonyRegistry 和 PhoneInterfaceManager 已经分别在文章 《TelephonyTesgistry》 和文章《PhoneInterfaceManager》中做了技术讲解。做完剩下的 SubscriptionController,就完成文章《Android无线电信息管理开篇准备工作》中计划的任务。但是 SubscriptionController 只是作为 SIM 卡信息管理角色,读者可能会对 SIM 原始信息来源很迷惑。因此,在开篇 SubscriptionController 之前,我们先了解 SIM 卡原始信息的准备过程。
什么是UICC
UICC,全称 Universal Integrated Circuit Card,译作通用集成电路卡。
UICC主要用于:
- 存储用户信息
- 鉴权密钥
- 短消
- 付费方式
- 联系人等信息。
在UICC中可以包括多种逻辑模块,如:
- 用户标识模块(Subscriber Identity Module,SIM)
- 通用用户标识模块(Universal Subscriber Identity Module,USIM)
- IP多媒体业务标识模块(IP Multi Media Service Identity Module,ISIM)
- 智能IC卡模块(Removable User Identity Module,RUIM(UIM))
- 特殊RUIM(CSIM)
以上模块,实际上是网络升级换代所对应的产物。SIM 用于 GSM 网络系统中,俗称 2G 网络。USIM 也叫升级版 SIM,多用于 3G 网络系统中。ISIM 则是 4G 时代的产物。RUIM、CSIM 是 CDMA 网络系统中的技术。
因此,UICC 卡是 2G 网络时代 SIM 卡、3G 网络时代 USIM 卡、4G 网络时代 ISIM 卡的统称。在本文和生活中,不管我们用的是 2G、3G、4G 网络,都习惯叫 SIM 卡,3G、4G 的 UICC 卡并不叫 SIM 卡,这是一种错误的叫法。但是由于我们生活中最先接触的手机卡是 SIM 卡,在生活中对普通用户而言,更难以区分这些技术差别,大家就习惯性用 SIM 卡来代称它们。
UiccController
在 Android 系统中,SIM 原始数据的加载和接收由 UiccController 来完成。为了更好的了解 UiccController 的架构,我们再次温故一下 Telephony(com.android.phone)的架构。
UiccController创建过程
从 UiccController 的功能就可以猜出 UiccController 必须在开机后自动完成启动,也就是随 com.android.phone 的启动而启动。在文章 《初识com.android.phone》中,已经学习了 phone 以及部分模块的启动过程,那么 UiccController 也是一样。
这里还是通过时序图给大家展示吧,文字说一大堆,也是雾里云里。
从上图可知,到最后就是从 SIM 卡的各种文件中把数据加载出来,如 ICCID,手机号码,联系人等等。其中 EF_** 是地址描述,标识该数据在 SIM 文件中的地址。它们的类图关系如下图:
Uicc卡基础知识
对卡有基本认识,才能更好的阅读理解 Uicc 的框架。Uicc 卡的协议在 TS 51.011。
DF:Dedicated files
EF:Elementary files
卡分类
- SIM
- USIM
- ISIM
- RUIM
- CSIM
卡应用
给 Uicc 卡供电,就成了一个微型系统,Uicc 卡有自己的一套规则,所以叫卡应用,所以在代码中会有 UiccCardApplication、AppType、AppState 这样的命名。
卡文件
UiccController 所完成的功能就是加载 Uicc 卡中的数据,或者修改 Uicc 卡中的数据,这些数据以文件的形式。
卡存储结构
卡文件的数据是线性保存,这就确定了读取卡文件数据的方式,主要给定一个开始地址,然后获取数据大小,从开始地址,一直读取数据,直至数据大小处结束。
如下面的代码都 ICCID
static final int EF_ICCID = 0x2FE2;
loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE));
EF_ICCID 是开始地址,先发起数据大小查询,得到结果后,再发起数据的加载。
EF文件数据结构
以 IMSI 为例
SIM卡文件架构
总结
本文学习了 UiccController 的创建过程,UICC 卡的基本知识,卡文件数据的加载,卡文件的架构。关于更加详情的 UICC 卡技术,请查阅 3GPP 协议 TS 51.011.