(M)SIM卡开机流程分析之SPN加载

本文详细分析了USIM卡开机时SPN(ServiceProviderName)的加载过程,从UiccController到UiccCardApplication,再到SIMRecords,探讨了如何通过RIL对象获取SIMRecords数据,并最终设置ServiceProviderName。在接收到EVENT_APP_READY消息后,通过getSpnFsm方法处理,经过多次状态转换,确保SPN的正确加载。如果存在自定义SPN,则会覆盖默认的SPN设置。

本篇仅以USIM卡为例进行代码分析

从之前对于UiccController.java文件进行分析中,我们知道UiccController中创建了UiccCard,而在UiccCard中创建了一个UiccCardAppliaction对象,而在UiccCardApplication的构造方法中,调用了如下方法:

UiccCardApplication(UiccCard uiccCard,
                    IccCardApplicationStatus as,
                    Context c,
                    CommandsInterface ci) {
    ......
    mIccFh = createIccFileHandler(as.app_type);
    mIccRecords = createIccRecords(as.app_type, mContext, mCi);
    ......
}
通过createIccFileHandler和createIccRecords方法,创建了IccFileHandler和IccRecords对象

private IccFileHandler createIccFileHandler(AppType type) {
    switch (type) {
        case APPTYPE_SIM:
            return new SIMFileHandler(this, mAid, mCi);
        case APPTYPE_RUIM:
            return new RuimFileHandler(this, mAid, mCi);
        case APPTYPE_USIM:
            return new UsimFileHandler(this, mAid, mCi);
        case APPTYPE_CSIM:
            return new CsimFileHandler(this, mAid, mCi);
        case APPTYPE_ISIM:
            return new IsimFileHandler(this, mAid, mCi);
        default:
            return null;
    }
}
private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) {
    if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) {
        return new SIMRecords(this, c, ci);
    } else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){
        return new RuimRecords(this, c, ci);
    } else if (type == AppType.APPTYPE_ISIM) {
        return new IsimUiccRecords(this, c, ci);
    } else {
        // Unknown app type (maybe detection is still in progress)
        return null;
    }
}
由于是USIM卡,因此创建的是SIMRecords和UsimFileHandler对象,接下来我们进入SIMRecords.java的构造方法,传入的参数分别为当前的UiccCardApplication对象,上下文对象,和RIL对象(从之前的分析中我们知道)

public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
  
  

                
<think>我们之前讨论的GID和SPN是在操作系统和Kerberos认证环境中的概念。但用户现在的问题是关于SIM中虚拟运营商的GID和SPN,这属于移动通信领域的概念。因此,我们需要重新定义这两个术语在移动通信上下文中的含义: 在SIM和移动网络领域: - **GID**(Group Identifier):在SIM规范中,GID是组标识符,用于标识一组SIM(例如,同一虚拟运营商的一组)。它通常由两个字节组成(十六进制表示),存储在SIM的文件系统中。 - **SPN**(Service Provider Name):服务提供商名称,即显示在手机屏幕上的运营商名称(如“中国移动”、“中国联通”或虚拟运营商的品牌名称)。它存储在SIM的特定文件中(通常是EF_SPN)。 因此,用户的问题是如何查询SIM中虚拟运营商的GID和SPN信息。 ### 查询方法: #### 1. **通过手机设置界面查看SPN** - 大部分手机可以在设置中直接查看运营商名称(SPN): - 进入“设置”>“关于手机”>“SIM状态”或类似菜单。 - 在部分安卓手机上,路径可能是“设置”>“网络和互联网”>“移动网络”>“高级”>“运营商设置”。 - 注意:虚拟运营商的SPN通常显示为其品牌名称(如“京东通信”、“阿里通信”)。 #### 2. **使用AT命令查询(需要专业工具或APP)** - 通过发送AT命令到调制解调器(Modem)可以读取SIM文件。但需要设备支持(如root过的安卓手机或专用读器): - 步骤1:连接手机到电脑(开启USB调试模式),或使用串口工具。 - 步骤2:使用终端软件(如PuTTY)发送AT命令。 - 常用命令: - 查询SPN:发送 `AT+CRSM=176,12258,0,0,15`(12258对应EF_SPN文件)[^1]。 - 查询GID:发送 `AT+CRSM=176,12259,0,0,15`(12259对应EF_GID文件)[^1]。 - 注意:命令格式可能因设备而异,需参考3GPP TS 27.007规范。 #### 3. **使用专用APP读取** - 安卓应用(如“SIM Card Info”“SIM Tool”等)可读取SIM文件: 1. 安装APP并授予读取SIM权限。 2. 在APP内查找“EF_SPN”或“EF_GID”字段。 - 示例:在“SIM Card Info”中,SPN显示在“Service Provider Name”条目下。 #### 4. **通过SIM器读取(最直接)** - 使用PC/SC读器和软件(如PySIM): - 步骤1:将SIM插入读器连接电脑。 - 步骤2:运行软件读取文件: - EF_SPN路径:`7F20` > `6F46`(SPN文件)。 - EF_GID路径:`7F20` > `6F3E`(GID文件)[^1]。 - 工具推荐:`pySim-read`(开源工具)或`CardReader`(商业软件)。 ### 注意事项: - **虚拟运营商信息**:虚拟运营商(MVNO)通常租用基础运营商(如中国移动)的网络,其SPN和GID由基础运营商分配。 - **数据格式**:SPN和GID以二进制格式存储,读取后需解码(如SPN可能是ASCII或UCS2编码)。 ### 示例输出: - **SPN**:`"China Mobile"`(中国移动)或`"Virtual Carrier"`(虚拟运营商品牌)。 - **GID**:十六进制值如`01 02`(标识组别)。 ### 总结 查询SIM中的GID和SPN需要特定工具(APP/读器)或技术命令。普通用户建议使用手机设置或APP查看SPN;开发人员可通过AT命令或读器获取完整数据[^1]。 §§相关问题§§ 1. 如何区分SIM中的基础运营商和虚拟运营商? 2. 修改SIM中的SPN显示是否合法? 3. 虚拟运营商的GID分配规则是什么? [^1]: 参考3GPP TS 31.102(SIM文件系统规范)和移动设备AT命令手册。</think>### SIM中虚拟运营商的GID和SPN查询指南 在移动通信领域,SIM中的 **GID(Group Identifier)** 和 **SPN(Service Provider Name)** 是标识运营商的关键参数: - **GID**:2字节的组标识符,用于区分SIM所属的虚拟运营商组别(如物联网分组) - **SPN**:服务提供商名称,即手机上显示的运营商名称(如"中国移动"或虚拟运营商品牌名) 以下是查询方法(需设备支持): --- ### 一、通过手机系统查询 #### 1. **Android设备** - **SPN查询**: 进入 `设置 > 关于手机 > SIM状态`,直接查看"运营商名称"(即SPN) - **GID查询(需开发者模式)**: 1. 启用开发者选项(连续点击"设置>关于手机>版本号"7次) 2. 使用ADB命令: ```bash adb shell service call iphonesubinfo 13 ``` 输出中的 `intValue` 字段即为GID(十六进制)[^1] #### 2. **iOS设备** - **SPN查询**: `设置 > 蜂窝网络 > SIM` 查看运营商名称 - **GID查询限制**: iOS系统封闭,需通过运营商后台或专业读器获取 --- ### 二、通过专业工具读取SIM文件 #### 1. **使用SIM器+软件** 工具推荐: - 硬件:PC/SC兼容读器(如ACR38U) - 软件:`pySim-read`(开源)或 `CardReader`(商业) **操作步骤**: 1. 将SIM插入读器 2. 读取关键文件: - **SPN**:文件路径 `7F20` > `6F46` (EF_SPN) - **GID**:文件路径 `7F20` > `6F3E` (EF_GID) 3. 解码二进制数据: - SPN:ASCII或UCS2编码的字符串 - GID:2字节十六进制值(如 `01 02`) #### 2. **AT指令查询(需root安卓或模块化设备)** 发送GSM 07.07标准指令: ```at AT+CRSM=176,12258,0,0,15 // 读取EF_SPN文件 AT+CRSM=176,12259,0,0,15 // 读取EF_GID文件 ``` 输出示例(十六进制): ``` +CRSM: 144,0,"FFFE 0043 004E 004D 0043" // CNMC(中国移动)的SPN编码 ``` --- ### 三、虚拟运营商特殊说明 1. **GID作用**: - 标识MVNO(虚拟运营商)的分组,例如: - `01 01`: 物联网设备组 - `01 02`: 企业用户组 - 基础运营商(如中国移动)通过GID控制虚拟运营商的网络权限 2. **SPN显示规则**: - 虚拟运营商SPN通常继承自基础运营商(如"中国移动-京东通信") - 可通过修改EF_SPN文件自定义显示(需SIM支持OTA更新) --- ### 四、注意事项 1. **数据安全**: - 直接读取SIM文件可能触发安全锁(PIN/PUK验证) 2. **兼容性**: - 老式SIM(2G)可能无GID字段 3. **虚拟运营商限制**: - MVNO的GID/SPN通常由基础运营商分配,无法自主修改 --- ### 总结查询路径 | 参数 | 普通用户 | 技术人员 | |------|-------------------|-----------------------| | SPN | 手机设置直接查看 | 读器读取EF_SPN文件 | | GID | 联系运营商获取 | AT命令或读器读取EF_GID |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值