微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 如何读取ICC Card中的文件

如何读取ICC Card中的文件

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
介绍如何读取ICC Card中的文件
[SOLUTION]
1.Get EF information
在读取一个对应的EF之前,首先要了解这个EF的一些信息
A.EF是属于哪种card?
ICC Card有好几种,常见的如SIM,USIM,RUIM,ISIM,CSIM等等。目前android支持的就是以上五种。不
同的ICC Card的读取代码是写在不同的地方。
B. EF的ID是什么?
EF ID是一个EF唯一的表示,有两个字节的十六进制便是。例如EF_ICCID是0x2FE2, EF_AND是0x6F3A…
C. EF的类型是哪一种?
EF的类型有三中,表示这个EF内容的组织形式。第一种是Transparent, 数据是以二进制序列存放的;第二中是
Linear fixed,数据是以顺序的记录的方式存放;第三中是CyCLIc,数据也是以记录的方式存放,只不过第1条
记录和第n条记录是相连的,为一个环形的记录结构。不同的记录类型读取时用的接口是不一样的。
D. EF的路径是什么?
在读取一个EF时要指定这个EF的路径,也就是从MF到EF之间的路径。
E. 读取这个EF需要什么样的权限?
要了解EF的读取需要什么样的权限,权限不足读取会失败。
在了解以上信息才能觉得该怎么往下一步。
以读取SIM Card中的EF_PHASE为例,指定SIM是属于那中phase。查Spec可获取其相关的信息(如果不知道EF的信息,spec是最好资料库)


中这里可以知道EF_PHASE的ID,类型,文件长度 读取权限等。
Identifier: 6FAE是ID
Structure: transparent是类型
File size: 1 byte
读/写权限:ALW/ADM
READ ALW表示 always,任意人都可以读
UPDATE ADM表示administration,运营商权限才能写。
接下来还要知道EF的路径,信息也是从spec中找到
MF/DFGSM/EF_PHASE


那到目前为止我们知道了EF的属于哪一种ICC Card、ID、文件类型、读权限和路径,然后走第二步。如果EF的信
息不太了解的,从spec中都可以找得到。
2.Define EF ID
接下来是在code中定义ID,这一步比较简单。但先插入一些内容,之前有讲过,不同的ICC Card读文件的地方都
不一样,其分类如下
IccRecords


不同的ICC Card的records都不一样,专门用来读取相应的ICC Card的records。XXXXRecords均继承
与IccRecords
IccFileHandler


IccFileHandler有提供读取EF的接口,和指定EF的路径。XXXFileHandler也均继承与
IccFileHandler,由于不同的ICC Card中的EF的路径都不尽一样,XXXFileHandler有给特定的Card
的EF指定路径。
由于我们是读取SIM中的EF,所以会用到SIMRecords和SIMFileHandler。另外有一个文件叫做
IccContants,专门用于定义EF的ID,不管哪一种ICC Card,所以我们的EF_PHASE的ID也要定义在这里
,如图:


3.Set EF Patch
第三步就是指定EF的路径了,由于ICC Card type是SIM,所以路径的指定要在SIMFileHandler中。注意
,一定要确认好文件路径,否则会读取不到文件,报IccFileNoFound的异常。从Spec中得知EF_PHASE的路径
是MF\DF\EF_PHASE,所以修改如下:


PS: 由于不同的ICC Card同名文件的路径都不一样,所以这设定路径时一定要确认后所读的文件是那种ICC
Card的,例如SIM和USIM有的同名文件路径就不一样。
4.Read EF Content
这一步就开始写代码读文件了,同样还是根据ICC Card Type觉得要写在哪一种XXXRecords中,由于我们读取
的是SIM的EF,所以要写在SIMRecords中
(1) 先定义一个EVENT ID,用户读取文件时的message


(2) 在fetchSimRecords()方法中加入以下代码


FetchSimRecords是sim要读取的文件代码会写在里面,在sim初始化或者refresh的时候会呼叫这个方法。
变量recordsToLoad++用于标记所读取文件的个数,当某个文件读取成功之后会减1。
这里使用的是IccFileHandler中的loadEFTransparent()方法,因为前面有讲到EF_PHASE是
transparent类型的文件。
类似的有loadEFLinearFixed(), IccFileHandler没有提供读取Cyclic类型文件的接口。
(3) 在handleMessage中增加一个case,用与捞Modem传回的fetch EF的数据


其中ar带回的结果就是读完文件的结果,这里的结果还要看具体这个文件中存放的是什么数据。从spec中得知,
EF_PHASE中存放的是一个字节的数据,表示SIM的phase


另外这里记得要isRecordLoadResponse设定为true。这样才是读取一个record的完成流程,之后的
recordsToLoad才会减1,表示文件读取有响应了。
以下是读取EF_PHASE的log,读取文件有下两次AT+CRSM,第一次是读去文件的长度,第二次才是读取文件的内
容。
第一次: AT+CRSM=192,28590,0,0,15
192:spec中定义是COMMAND_GET_RESPONSE,值就是0xC0
28590: EF的ID, EF_PHASE的ID就是0x6FAE
0,数据偏移量的高字节
0,数据偏移量的低字节
15,GET_RESPONSE_EF_SIZE_BYTES
(如果有路径的话,后面还有字段路段,由于log没有指定EF的路径,所以没有打印。如果路径没有指定,那么
modem端会自己找路径)
第二次: AT+CRSM=176,28950,0,0,1
28590: EF的ID, EF_PHASE的ID就是0x6FAE
0,数据偏移量的高字节
0,数据偏移量的低字节
1,数据的长度,也就是前面CRSM得到的值
176:spec中定义是COMMAND_READ_BINARY,值是0xB0
//注意KK的LTE版本,和L上是使用CRLA命令替换CRSM命令.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top