USIM卡APDU指令:从零解析AT+CSIM
摘要:本文分析了3GPP协议中AT+CSIM指令通过APDU码流操作SIM卡的技术细节。文章首先对比了+CSIM和+CRSM指令的区别,指出CSIM直接使用APDU码流交互。然后详细介绍了SIM卡文件系统结构(MF/DF/EF)和APDU命令格式(CLA/INS/P1/P2等参数),并以读取IMSI文件为例演示了完整的操作流程:1)打开逻辑通道;2)选择根目录;3)进入DF目录;4)选择EF文件;
序言
一般进行开发的时候,需要涉及到对sim卡的操作,3GPP协议定义了标准的AT指令来对sim卡操作。eSIM能实现一卡多号,主要也是因为卡里面设计了供多个运营商保存信息的区域,然后对卡进行数据交互。
AT+CSIM可直接读取访问sim卡,以APDU码流的方式进行数据交互,本文主要围绕AT+CSIM发送的APDU码流进行分析
AT+CSIM标准指令参考3GPP TS 27.007的内容如下3GPP TS 27.007 V13.5.0 (2016-06)_《AT command set for User Equipment (UE)
设置命令将 <command> 传输至移动终端(MT),MT 再将其原封不动地发送给 SIM。同样,SIM 返回的 <response> 也会由 MT 原封不动地回传给终端适配器(TA)
比如你的开发板插了sim卡,开发板上的基带模块、sim卡芯片/驱动这些是MT,MT直接发给SIM卡,SIM卡的返回响应发给开发板的主控芯片/应用程序,这些是TE。TA是TE和MT物理上分离时用于两者的适配,比如开发板上没有同时设计主控和基带,适配两者的接口。
一、+CSIM和+CRSM的区别
CSIM是直接用APDU码流交互,CRSM通过filed读取sim文件,底层也是APDU码流,只是做了一层封装
二、AT+CSIM的使用
CSIM需要涉及到2步:
1.select sim file 选择sim文件
2.action 执行
(一)sim卡的文件系统
类似计算机的文件系统,有根目录和子文件夹,呈树形结构

MF(Master File):根目录,唯一,包含DF和EF
DF(Deficated File):文件夹,每个DF包含一组EF
EF(Elementary File):基本文件,直接存储数据的,每个EF有特定的格式和长度,用于存储特定数据
那么如何操作这些文件?每个文件/文件夹都有一个具体的ID号,是2Bit的十六进制数。如果要定位到一个具体的文件,需要MF ID--> DF ID --> EF ID,就和打开windows的文件一样的。
在3GPP TS 31.102协议文档中有如下内容,USIM文件系统内容如下。
(SIM:遵循《GSM 11.11》)

我们使用AT指令去选择sim卡文件时,就是根据这些标识进行选择,不同的卡类型的文件系统分布也不一致(sim2G卡和usim对应的3/4/5G卡的文件结构一样都是MF->DF->EF,但是具体设计不一样)
(二)APDU组包
APDU分为发往卡的命令APDU,和卡返回的响应APDU,本文仅介绍命令APDU
了解了sim卡的文件系统,发送AT还需要具体的APDU组包
1.命令APDU格式解析
命令APDU格式如图,Lc、data、le为可选内容

CLA:
- 0x00:通用 SIM/USIM 指令(无特殊类别);
- 0x80:GSM 专用指令(2G SIM 卡核心指令,比如读 EF_IMSI);
- 0x08:3G/4G USIM 专用指令(适配 3GPP TS 31.102 规范);
- 0x90:厂商自定义指令(如运营商定制卡)
INS:
| INS 值 | 十进制 | 指令名称 | 作用 |
|---|---|---|---|
| 0xB0 | 176 | READ BINARY | 读取二进制文件(EF 文件) |
| 0xB2 | 178 | READ RECORD | 读取记录文件(EF 文件) |
| 0xC0 | 192 | GET RESPONSE | 获取卡的响应数据 |
| 0xD6 | 214 | UPDATE BINARY | 写入二进制文件 |
| 0xDC | 220 | UPDATE RECORD | 写入记录文件 |
| 0xF2 | 242 | STATUS | 查询文件状态 |
完整内容如下,INS列前的CLA列需要有对应的开头,其它开头为非法开头

P1/P2:
给 INS 指令补充 “细节参数”,比如读取文件的起始偏移、记录号、文件类型、访问模式等(不同 INS 对应的 P1/P2 含义不同)。
- P1=0x00,P2=0x00:从文件的起始位置(偏移 0) 开始读取;
- P1=0x00,P2=0x10:从文件的偏移 16 字节 位置开始读取;
- P1=0x01,P2=0x00:读取文件的第 1 条记录(若为记录型 EF 文件)。
| 操作目标 | P1 取值 | P2 取值 | 核心说明 |
|---|---|---|---|
| 选根目录(MF) | 0x00 | 0x0C | 唯一合法组合,P2=0C 是强制要求 |
| 选 DF/EF 文件 | 0x00 | 0x00 | 选子文件(如 DF_USIM/EF_IMSI)时用 00/00 |
| 按 AID 选应用 | 0x04 | 0xC0 | 选运营商定制应用时用 |
注:当P1=00时,后续的选取文件路径需要完整的路径,仅单个文件名会无效,P1=02时,可直接传入文件的ID
Le:
指定终端(开发板)期望 SIM/USIM 卡返回的最大字节数
- 0x00:表示 “返回所有可用数据”(开发板实操中最常用,比如读 EF_IMSI 时直接要全部数据);
- 0x05:表示 “最多返回 5 字节数据”;
- 范围:0x01~0xFF(指定具体长度)。
2.APDU操作实例
由于每个人使用的测试卡不一样,4G/5G类型、运营商类型都不一样,所以具体的APDU命令也不一致,所以描述一下通用的测试步骤
以读取IMSI文件ID为例子,我使用的联通5G卡
读取文件需要按照卡的文件系统层级,依次进入相应的目录,IMSI文件位于DF_GSM(ID:7F20)或者USIM应用目录下,而不是直接在根目录下
1.打开逻辑通道
AT+CSIM=10,"0070000001"
+CSIM: 6,"019000" #01即为打开的通道号,每次会递增
2.选择根目录MF(3F00)
AT+CSIM=14,"01A4000C023F00" #01为前面打开的通道号,A4为选择文件,P1P2在选择根目录时固定组合00 0C
+CSIM: 4,"9000"
3.进入MF目录下的DF_GSM目录(7F20)
AT+CSIM=14,"01A4000C027F20"
+CSIM: 4,"9000"
4.选择EF_IMSI文件(6F07)
AT+CSIM=14,"01A4000C026F07"
+CSIM: 4,"9000"
5.读取二进制数据,EF_IMSI固定长度是9字节
AT+CSIM=10,"01B0000009"
+CSIM: 22,"0849061049733558129000" #9000为结束符,响应的前 18 个字符(9字节)就是 IMSI 编码数据
注:
1)SELECT 指令后必须执行 GET RESPONSE,否则无法确认文件是否选中,也无法获取文件的访问权限、大小等关键信息
2)没有命令可直接看出当前sim卡的文件目录层级,需要参照3GPP协议查看
-
2G/GSM 卡: 参考规范 3GPP TS 51.011
-
3G/4G/5G USIM 卡: 参考规范 3GPP TS 31.102
更多推荐


所有评论(0)