又到一周周未时,该写博客了,但想了一下,突然发现这周什么也没干,也不知道写什么,最后突然在桌面上发现了这段代码,获取IMSI用的,也就拿这东东来写写吧,赶快写完得玩会游戏,游戏时间又到了,Dota……

IMSI也就是SIM卡号,是用户的唯一标识,IMSI号码结构为:

MCC------------- MNC------------------ MSIN

MCC=移动国家号码,由3位数字组成,唯一地识别移动客户所属的国家。我国为460。

MNC=移动网号,由2位数字组成,用于识别移动客户所归属的移动网。邮电部门GSM PLMN网为00,“中国联通公司”GSMPLMN网为0l。

MSIN=移动客户识别码,采用等长11位数字构成。唯一地识别国内GSM移动通信网中移动客户。

获取IMSI可以用ExTAPI中的lineGetGeneralInfo,它会将各种硬件信息返回到它的第二个结构成员中,即LINEGENERALINFO结构中。

这个结构定义如下:

typedef struct linegeneralinfo_tag {

DWORD dwTotalSize;

DWORD dwNeededSize;

DWORD dwUsedSize;

DWORD dwManufacturerSize;

DWORD dwManufacturerOffset;

DWORD dwModelSize;

DWORD dwModelOffset;

DWORD dwRevisionSize;

DWORD dwRevisionOffset;

DWORD dwSerialNumberSize;

DWORD dwSerialNumberOffset;

DWORD dwSubscriberNumberSize;

DWORD dwSubscriberNumberOffset;

} LINEGENERALINFO, * LPLINEGENERALINFO;

里面的信息都很清晰了,比如说要获得IMSI,则就这个结构的首地址再加上这个dwSubscriberNumberOffset所指示的偏移。即:

LPTSTR   lstr = (TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset);

要使用lineGetGeneralInfo,也要按照使用tapi的顺序对程序进行初始化,做一些必要的操作才能调用lineGetGeneralInfo。

要使用tapi,大概的顺序为:

lineInitializeEx

lineNegotiateAPIVersion

lineOpen

这几个函数调用完之后就可以为获得IMSI来做准备了。

要获得类似IMSI、IMEI等的信息,要从名称为“Cellular Line”的设备线路来获得,所以开始就要枚举所有的设备线路,然后查找名字为“Cellular Line”的线路,找到之后,用这个设备线路的句柄来作为lineGeneralInfo的第一个参数。

在使用LINEGENERALINFO以前,先把它的dwTotalSize设为它本身的大小,然后调用一次lineGeneralInfo,执行完后,在lineGeneralInfo中的dwNeededSize结构中返回了要存放所有信息所需要的空间,这时候只需根据这个成员来申请一块内存,用一个LINEGENERALINFO的指针指向它,然后再次调用lineGetGeneralInfo,这时候它里面就已经包含了各种有用的信息了,你想要什么就获取什么吧

下面贴下简单的代码:

  1. int WINAPI WinMain(HINSTANCE hInstance,
  2. HINSTANCE hPrevInstance,
  3. LPTSTR    lpCmdLine,
  4. int       nCmdShow)
  5. {
  6. LPTSTR  lpszIMSI;
  7. LINEINITIALIZEEXPARAMS lineExtParams;
  8. lineExtParams.dwTotalSize = sizeof(lineExtParams);
  9. lineExtParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
  10. DWORD dwAPIVersion = TAPI_CURRENT_VERSION;
  11. HLINEAPP    hLineApp;
  12. DWORD   dwNumDevs;
  13. lineInitializeEx(&hLineApp, NULL, NULL, _T("Mengge"), &dwNumDevs, &dwAPIVersion, &lineExtParams);
  14. DWORD   dwTSPILineDeviceID = 0;
  15. for (DWORD dwCurrentDevID = 0; dwCurrentDevID < dwNumDevs; dwCurrentDevID++)
  16. {
  17. LINEEXTENSIONID LineExtensionID;
  18. if (lineNegotiateAPIVersion(hLineApp, dwCurrentDevID,
  19. TAPI_API_LOW_VERSION, TAPI_CURRENT_VERSION,
  20. &dwAPIVersion, &LineExtensionID) == 0)
  21. {
  22. LINEDEVCAPS LineDevCaps;
  23. LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
  24. if( ::lineGetDevCaps(hLineApp, dwCurrentDevID,
  25. dwAPIVersion, 0, &LineDevCaps) == 0 )
  26. {
  27. BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
  28. if(0 != pLineDevCapsBytes)
  29. {
  30. LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
  31. pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
  32. if( ::lineGetDevCaps(hLineApp, dwCurrentDevID,
  33. dwAPIVersion, 0, pLineDevCaps) == 0 )
  34. {
  35. LPTSTR  lstr = (TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset);
  36. if (!_tcscmp(CELLTSP_LINENAME_STRING, lstr))
  37. {
  38. dwTSPILineDeviceID = dwCurrentDevID;
  39. delete[]  pLineDevCapsBytes;
  40. break;
  41. }
  42. }
  43. delete[]  pLineDevCapsBytes;
  44. }
  45. }
  46. }
  47. }
  48. HLINE   hLine = NULL;
  49. if( ::lineOpen(hLineApp, dwTSPILineDeviceID,
  50. &hLine, dwAPIVersion, 0, 0,
  51. LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM, 0) )
  52. {
  53. ::lineShutdown(hLineApp);
  54. return FALSE;
  55. }
  56. LINEGENERALINFO lviGeneralInfo;
  57. lviGeneralInfo.dwTotalSize = sizeof(lviGeneralInfo);
  58. LONG lRes = ::lineGetGeneralInfo(hLine, &lviGeneralInfo);
  59. if (lRes != 0 && lRes != LINEERR_STRUCTURETOOSMALL)
  60. {
  61. DWORD   dd = GetLastError();
  62. ::lineClose(hLine);
  63. ::lineShutdown(hLineApp);
  64. return FALSE;
  65. }
  66. LPLINEGENERALINFO plviGeneralInfo;
  67. LPTSTR  tsSubscriberNumber;
  68. LPBYTE pLineGeneralInfoBytes = NULL;
  69. pLineGeneralInfoBytes = new BYTE[lviGeneralInfo.dwNeededSize];
  70. plviGeneralInfo = (LPLINEGENERALINFO)pLineGeneralInfoBytes;
  71. if(pLineGeneralInfoBytes != NULL)
  72. {
  73. plviGeneralInfo->dwTotalSize = lviGeneralInfo.dwNeededSize;
  74. if ( (lRes = ::lineGetGeneralInfo(hLine, plviGeneralInfo)) != 0 )
  75. {
  76. ::lineClose(hLine);
  77. ::lineShutdown(hLineApp);
  78. return FALSE;
  79. }
  80. else
  81. {
  82. TCHAR szUnavailable[] = L"Unavailable";
  83. if(plviGeneralInfo->dwSubscriberNumberSize)
  84. {
  85. tsSubscriberNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)
  86. +plviGeneralInfo->dwSubscriberNumberOffset);  //此处就获得了IMSI
  87. }
  88. else
  89. {
  90. tsSubscriberNumber = szUnavailable;
  91. }
  92. }
  93. }
  94. delete [] pLineGeneralInfoBytes;
  95. return  10;
  96. }

注:我用这段程序在有些模拟器上执行不成功,调试了一下发现没有找到名字为“Cellular Line”的设备线路 ,不知道这是为什么……

在SDK里面有个ExAPI的例子,里面有获取IMSI、IMEI、制造商、软件版本等信息的。

Dotaing.....

获取SIM卡号(IMSI)相关推荐

  1. android 7.1 RIL 获取SIM卡号

    平台 RK3288 + Android 7.1 + EC20 流程 获取手机号代码: TelephonyManager telMgr = (TelephonyManager) getSystemSer ...

  2. sim卡号获取不完整解决方案

    val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager?: return "nul ...

  3. android 获取sim卡operator

    android 获取sim卡运营商信息 TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHO ...

  4. Android如何获取SIM卡信息

    android 获取sim卡运营商信息 TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHO ...

  5. Android 获取SIM卡信息

    android 获取sim卡运营商信息 TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHO ...

  6. MTK平台获取本机的SIM卡中IMSI号

    要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动.联通或电信)时绑定的:IMSI是sim卡的一个属性号 ...

  7. MTK平台 获取本机的SIM卡中IMSI号

    公司MTK平台做开发,老板要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动.联通或电信)时绑定的:IM ...

  8. 修改andriod模拟器的IMEI,IMSI,手机号,SIM卡号

    这个是我在老外的博客里翻出来,百度基本找不到,尤其是修改sim卡号(安卓模拟的)和手机号码 用二进制编辑软件打开emulator程序,对应的x86,arm,硬件都是不同的后缀, 寻找sim卡号,模拟器 ...

  9. Android 系统(258)---获取SIM卡手机号

    Android 获取SIM卡手机号 相信APP在开发中经常用到SIM卡手机号,经过一些测试分析,提供一下个人的理解分析.手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机 ...

最新文章

  1. 农业银行联行号怎么查询_农行信用卡解析丨菜卡怎么提额8W?学会一招就够了!...
  2. 《社会智能与综合集成系统》第1章1.节参考文献
  3. 一个简单的案例带你入门Dubbo分布式框架
  4. C语言满分代码:L1-056 猜数字 (20分)
  5. MySQL中int、char、varchar的性能浅谈
  6. 前端学习(589):在console中调试日志
  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(1) - 概述 传输指令
  8. 【Noip模拟 20161005】公约数
  9. 了解一些常用的牛逼编译器(不限制编程语言, 不限制平台)
  10. php检查gd库是否开启,检查服务器是否开启GD库
  11. OutMan——Foundation框架中的常用结构体、NSNumber类和NSValue类
  12. 田忌赛马java代码算法,AcWing 1489. 田忌赛马——Java版代码
  13. SDUT—Python程序设计实验六(字典与集合)
  14. 经验分享:利用树莓派开发板制作无线路由器
  15. html语言让动画停止,如何停止svg动画?
  16. 1_22_python基础学习_0518
  17. 应用分发平台之苹果超级签名流程分析及API错误
  18. 使用 CMake 解决编译出来的 so 文件过大的问题
  19. 手游测试人才稀缺,兼容性问题突出
  20. 此公众号并没有这些scope的权限 错误码10005

热门文章

  1. Labview汽车齿轮齿条转向器疲劳试验台项目源码
  2. 学习互联网理论课的相关感想
  3. MySQL 5.6.24修改root密码操作
  4. Nov 5th mesh
  5. 【web课程设计网页规划与设计】基于社团活动主题题材设计 实现华南师范大学网站html模板(带设计说明 带psd)...
  6. Oracle ORA-00904:“xxx”:invalid identifier 标识符无效
  7. ArcGIS JavaScript 使用本地字体库
  8. 一级计算机windows考试试题,全国计算机等级考试一级笔试试题Windows(2)
  9. 2022年全球及中国平权行动合规服务行业头部企业市场占有率及排名调研报告
  10. 异常:calling prepareStatement is no longer allowed! Increase reapTimeout to avoid this problem