序言

一般进行开发的时候,需要涉及到对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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐