SIMcard

 时间:2020-09-21  贡献者:shoujiok.com

导读:sim卡套 手机卡套 卡托 卡槽 nano手机还原卡套小卡转,imsiIMSI:International Mobile Subscriber Identification Number, 国际移 动 用户识别码, 是区别移动用户的标志,储存在 SIM 卡中,可用于区别移动用户的 有效信息。 其总长度不超过 15 位,同样使

sim卡套 手机卡套 卡托 卡槽 nano手机还原卡套小卡转
sim卡套 手机卡套 卡托 卡槽 nano手机还原卡套小卡转

imsiIMSI:International Mobile Subscriber Identification Number, 国际移 动 用户识别码, 是区别移动用户的标志,储存在 SIM 卡中,可用于区别移动用户的 有效信息。

其总长度不超过 15 位,同样使用 0~9 的数字。

其中 MCC 是移动用户所属国家代号,占 3 位数字,中国的 MCC 规定为 460; MNC 是移动网号码, 由两位或者三位数字组成, 中国移动的移动网络编码 (MNC) 为 00;用于识别移动用户所归属的移动通信网; MSIN 是移动用户识别码,用以识别某一移动通信网中的移动用户。

1 引入 为了在无线路径和整个 GSM(Global System for Mobile Communications,全 球移动通信系统) 移动通信网上正确地识别某个移动客户,就必须给移动客户分 配一个特定的识别码。

[1] 2 结构组合 IMSI 是 15 位的十进制数。

其结构如下: MCC+MNC+MSIN图 1 IMSI 结构MCC(Mobile Country Code,移动国家码):MCC 的资源由国际电信联盟 (ITU) 在全世界范围内统一分配和管理, 唯一识别移动用户所属的国家, 共 3 位,中国为 460。

MNC(Mobile Network Code,移动网络号码):用于识别移动用户所归属 的移动通信网,2~3 位。

在同一个国家内,如果有多个 PLMN(Public Land Mobile Network,公 共陆地移动网,一般某个国家的一个运营商对应一个 PLMN),可以通过 MNC 来进行区别, 即每一个 PLMN 都要分配唯一的 MNC。

中国移动系统使用 00、 02、 07, 中国联通 GSM 系统使用 01、 06, 中国电信 CDMA 系统使用 03、 05、电信 4G 使用 11,中国铁通系统使用 20。

MSIN (Mobile Subscriber Identification Number, 移动用户识别号码) : 用以识别某一移动通信网中的移动用户。

共有 10 位,其结构如下: EF+M0M1M2M3+ABCD

其中,EF 由运营商分配;M0M1M2M3 和 MDN(Mobile Directory Number, 移动用户号码簿号码)中的 H0H1H2H3 可存在对应关系;ABCD:四位,自 由分配。

3 其它号码区别 IMSI 不同于手机设备的标识 IMEI (International Mobile Equipment Identity, 国际移动设备标识) : IMEI 是与手机绑定的。

IMSI 是与 SIM (Subscriber Identity Module,用户识别模块)或者 USIM(Universal Subscriber Identity Module, 全球用户身份模块)[2-3] 。

IMSI 和 MSISDN 都是用户标识,在不同的接口、不同的流程中需要使用不同的标 识。

在通信系统中 MSISDN(Mobile Station International Subscriber Directory Number,移动台国际用户目录号)又称为手机号码。

4 国际移动用户识别码与开源项目 OpenBTS 是基于软件的 GSM 接入口,它提供标准的 GSM 兼容的移动手机,不需 使用现成的电话提供商的接口,来拨打现有电话系统的接口。

OpenBTS 是以第一 个基于开源软件的 工业标准的 GSM 协议栈而闻名。

OpenBTS 使用的是国际移动 用户识别码 (IMSI) international mobile subscriber identity 。

OpenBTS 和 OpenBSC 提供了在一个较低的层次上了解更多关于 GSM 网络的技术的开源平台。

5 特征IMSI 是在 GSM 系统中对 MS(Mobile Station,移动台)的唯一识别,在 全网和全球范围内唯一。

IMSI 相同的 SIM 或 USIM 卡,可能是非法制造出来的。

IMSI 存储在 SIM 或 USIM 卡、 网络侧网元 HLR (Home Location Register, 归属位置寄存器)和 VLR(Visitor Location Register,拜访位置寄存 器)中,在无线接口及 MAP(Mobile Application Part,移动应用部分) 接口上传送。

IMSI 与手机号码的绑定关系, 在网络侧网元 HLR (Home Location Register) 内定义,且只能由运营商的授权人员,在其数据库中查询。

6 意义 从技术上讲,IMSI 可以区别出每个用户来自的国家,并且在移动网络中的所有 位置(包括漫游区)都是有效的。

因此,IMSI 可以彻底解决国际漫游问题。

二.SIM 卡上的电话本Android 源码开机是不导卡,如果我们需要查看卡上的联系人需要手动导入,从联系人 Contact 应用 ContactsListActivity.java 这个类的 menu 菜单找到导入导出,选择导入 sim 卡联系人, 进入 SimContactsSelectActivity.java 这个类, 在这个类里会执行 query ()方法,对应的 provider 和 uri 分别是 IccProvider.java 与 uri.parse(content://icc/adn),进入 IccProvider.java 后的代码是本文要关注的部分, 从 query()方法看起1. public Cursor query(Uri url, String[] projection, String selection, 2. 3. 4. 5. 6. 7. String[] selectionArgs, String sort) { ArrayList results; switch (URL_MATCHER.match(url)) { case ADN: results = loadFromEf(IccConstants.EF_ADN); break;我们关心这个 loadFromEf()方法,IccConstants.EF_AND 这个值是 6F3A,这 是告诉告诉我们要先去查找卡上这个位置的内容。

1. private ArrayList loadFromEf(int efType) { 2. 3. 4. 5. 了 6. 7. 8. 9. } } …省略次要代码…. } ArrayList results = new ArrayList(); List adnRecords = null; try { IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(//Binder 来 ServiceManager.getService("simphonebook")); if (iccIpb != null) { adnRecords = iccIpb.getAdnRecordsInEf(efType);//proxy 模式接下来代码走到 IccPhoneBookInterfaceManager.java 这个类的 getAdnRecordsInEf(intefid)方法,其中涉及了代理模式, IccPhoneBookInterfaceManagerProxy.java 在中间做了个转换。

在 getAdnRecordsInEf(intefid)方法里调用了下 updateEfForIccType(efid),判断是 sim 卡还是 usim 卡,确定下面的 efid 是用 IccConstants.EF_AND 还是 IccConstants.EF_PBR,真正的查询是 requestLoadAllAdnLike()是这个方法,这里 要注意 EVENT_LOAD_DONE 这个标志,要用它来接收查询结果的。

1. requestLoadAllAdnLike (int efid, int extensionEf, Message response) { 2. 3. 4. 5. 6. 7. 8. }。

ArrayList waiters; ArrayList result; if (efid == EF_PBR) { } else {//sim 卡 result = getRecordsIfLoaded(efid); //usim 卡,这里我们看这个方法 result = mUsimPhoneBookManager.loadEfFilesFromUsim();看下 loadEfFilesFromUsim()方法,循环读取直到所有 file 读完后再返回,里面又 分了两种,一种是电话号码的联系人,一种是邮箱地址的联系人,邮箱的相比电话号码还要 麻烦点。

1. public ArrayList loadEfFilesFromUsim() { 2. 3. 4. 5. 6. 7. 8. 9. } synchronized (mLock) { //…省略次要代码…. numRecs = mPbrFile.mFileIds.size(); for (int i = 0; i < numRecs; i++) { readAdnFileAndWait(i); readEmailFileAndWait(i); } // All EF files are loaded, post the response.readAdnFileAndWait(i)和 readEmailFileAndWait(i)最后都会调用 mPhone.getIccFileHandler().loadEFLinearFixedAll () 方法, 只不过具体的参数不同。

看下 loadEFLinearFixedAll()的代码。

1. public void loadEFLinearFixedAll(int fileid, Message onLoaded) { 2. 3. 4. 5. 6. } Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE, new LoadLinearFixedContext(fileid,onLoaded)); phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid), 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);iccIO () 方法显示代码跑到 RIL.java 了, 之前读卡上的信息代码也是走这里1. 2. 3. TAG 标志 public void iccIO (int command, int fileid, String path, int p1, int p2, in t p3, String data, String pin2, Message result) { RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_IO, result);//关注这个

4. 5. 6. 7. 8. 9. 10. 11. 12. 13. }rr.mp.writeInt(command); rr.mp.writeInt(fileid); rr.mp.writeString(path); rr.mp.writeInt(p1); rr.mp.writeInt(p2); rr.mp.writeInt(p3); rr.mp.writeString(data); rr.mp.writeString(pin2); send(rr);14. 根据上面那个 TAG,可以在 Reference-ril.c 找到这个分支。

15. case RIL_REQUEST_SIM_IO: 16. 17. requestSIM_IO(data,datalen,t); break;阅读 requestSIM_IO()方法可以看到 android 源码是如何读取 sim 卡上的联系人 的,源码使用了 AT +CRSM 命令,关于 AT 命令可以看 3gpp 27.007 这个文档。

读取完 成时会收到 EVENT_PBR_LOAD_DONE 这个消息,在里面 createPbrFile()方法中完 成字符串的解析得到联系人信息。

1. public void handleMessage(Message msg) { 2. 3. 4. 5. 6. 7. 8. …省略代码…. switch (msg.what) { case EVENT_PBR_LOAD_DONE: if (ar.exception == null) { createPbrFile((ArrayList) ar.result); }…省略代码…. break;到这里,卡联系人导入大部分流程就走完了,后面还有些写入联系人数据库的操作 比较简单就不写了, 总体上流程还算清晰, 只是循环比较多, 远程调试的时候并不是很方便, 通常一个 sim 卡可以存 250 个联系人, 一个 usim 卡能存的联系人要多些, 但数量不固定, 其中读写联系人的邮箱地址要麻烦一些, 由于存储空间的限制需要多次找对应的索引能找到 我们想要的东西。

至于读写卡联系人的具体例子,后续单独补充吧。

最后贴图一张,有图有 真相。

 
 

微信扫一扫 送福利