关于sim/usim的一些概念

    

1 SIM卡存储数据类型:

   (1)固化数据:SIM卡卡号、国际移动用户识别码(IMSI)、用户加密密钥(Ki)、加密算法(A3、A8)、个人解锁PUK码等。
   (2)静态数据:用户接人等级、短消息中心(SMSC)号码、各类业务接人号等。
   (3)动态数据:临时移动用户识别(TMSI)码、区域识别(LAI)码、密匙(Kc)、RAND、MS所处基站小区、PIN码和PUN码出错计数、          PIN码开关使能等。
   (4)个人数据:本机电话号码、用户电话簿、短信、费率信息、缩位拨号、转移电话号码等

2 UICC、SIM、USIM 

    UICC Universal Integrated Circuit Card 通用集成电路卡 UICC中可以包括多种逻辑模块
    USIM 通用用户标识模块(Universal Subscriber Identity Module,USIM)
    SIM  用户标识模块(Subscriber Identity Module,SIM)
    USIM可以同时包括USIM和SIM两个逻辑模块,也可以只包括USIM逻辑模块,前者是复合USIM卡,也就是说可以兼容2G与3G终端,后者是纯粹的USIM卡,只能在3G终端中使用,而UICC是定义智能卡物理特性的总称,可以包含多种业务应用,比如USIM、SIM、IP多媒体业务标识模块等。
  在这里插入一段代码,开发过程有时候我们会想判断当前是sim卡还是usim卡,源码是这样做的   
   
 private int updateEfForIccType(int efid) {
        // Check if we are trying to read ADN records
        if (efid == IccConstants.EF_ADN) {
            if (phone.getIccCard().isApplicationOnIcc(IccCardApplication.AppType.APPTYPE_USIM)) {
                return IccConstants.EF_PBR;
            }
        }
        return efid;
    }

    public boolean isApplicationOnIcc(IccCardApplication.AppType type) {
        if (mIccCardStatus == null) return false;

        for (int i = 0 ; i < mIccCardStatus.getNumApplications(); i++) {
            IccCardApplication app = mIccCardStatus.getApplication(i);//遍历判断应用的类型是否为APPTYPE_USIM
            if (app != null && app.app_type == type) {
                return true;
            }
        }
        return false;
    }

    虽然这个方法是不对phone以外代码开放,不过还是可以参考下思路的,还有一种直接从卡上读取属性也可以,只是好像没有标准的AT命令需要芯片厂商自行添加

3 MF DF EF ADF

 MF(Master File),也称作主控文件。其他所有的DF和EF都位于MF之下。
   DF(Delicated File)一个有许多文件的功能分组,DF只具有头信息,相当于文件地址指针。
 EF (Elementary File)基本文件,这个就是真正的文件了,数据内容保存在这里。
  与SIM卡文件类型相比,除了有MF,DF,EF文件外,还增加了ADF文件类型即是USIM (Application DF,ADF)
  
  其中EF又分为Linear fixed EF(保存短信,电话号码,邮箱等),Transparent EF(IMSI 一些基本数据),Cyclic EF,所以在代码中看到读取EF文件方法有时候是不一样的。
  

4 几个和卡相关的类


  IccConstants.java  记录位置常量,写几个使用频率高的,比如
     static final int EF_ADN = 0x6F3A;
    static final int EF_FDN = 0x6F3B;
    static final int EF_SDN = 0x6F49;
    static final int EF_EXT1 = 0x6F4A;   
    static final int EF_SMS = 0x6F3C;  

IccCardStatus.java 记录SIM卡的状态,如ABSENT, READY,UNKNOW,ETC。其它应用判断卡状态也就是这几个值
IccRecords.java 把它理解成描述卡上文件内容的一个类应该比较合适,
IccProvider.java  这个不需要多解释,对应用而言知道怎么使用它操作数据就可以,通过它拿到的数据已经解析好的了。

     上面的内容有些在网上可以找到,有些是android源码中的,这里整理下列出个人觉得对学习sim卡相关知识有些帮助的东东,如果有遗漏的欢迎留言告诉我。

你可能感兴趣的:(关于sim/usim的一些概念)