UICC

前置文章

  1. Android系统之System Server大纲
  2. Android无线电信息管理开篇准备工作
  3. 初识com.android.phone
  4. PhoneInterfaceManager
  5. TelephonyTesgistry

前言

在《Android无线电信息管理开篇准备工作》一文中,我们打算学习掌握 TelephonyRegistry、PhoneInterfaceManager、SubscriptionController 的功能和作用。其中 TelephonyRegistry 和 PhoneInterfaceManager 已经分别在文章 《TelephonyTesgistry》 和文章《PhoneInterfaceManager》中做了技术讲解。做完剩下的 SubscriptionController,就完成文章《Android无线电信息管理开篇准备工作》中计划的任务。但是 SubscriptionController 只是作为 SIM 卡信息管理角色,读者可能会对 SIM 原始信息来源很迷惑。因此,在开篇 SubscriptionController 之前,我们先了解 SIM 卡原始信息的准备过程。

什么是UICC

UICC,全称 Universal Integrated Circuit Card,译作通用集成电路卡。

UICC主要用于:

  1. 存储用户信息
  2. 鉴权密钥
  3. 短消
  4. 付费方式
  5. 联系人等信息。

在UICC中可以包括多种逻辑模块,如:

  1. 用户标识模块(Subscriber Identity Module,SIM)
  2. 通用用户标识模块(Universal Subscriber Identity Module,USIM)
  3. IP多媒体业务标识模块(IP Multi Media Service Identity Module,ISIM)
  4. 智能IC卡模块(Removable User Identity Module,RUIM(UIM))
  5. 特殊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

卡分类

  1. SIM
  2. USIM
  3. ISIM
  4. RUIM
  5. 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.

微信扫一扫,更注获取更多精彩内容


微信扫一扫