MTK 平台获取IMSI号码 以及如何截获系统中的各种消息
MTK平台 获取本机的SIM卡中IMSI号
公司MTK平台做开发,老板要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动、联通或电信)时绑定的;IMSI是sim卡的一个属性号,在移动系统中是跟sim卡号绑定的,开户之后跟手机号绑定,开户的过程就是将你的IMSI和手机号发给交换机HLR,这样子来电话的时候交换机就可以找到你了。
退而求其次,利用SIM的“ID号”也可以唯一标识一个用户,只是SIM可以补办,考虑统一电话号码不对应补办后的SIM卡信息,所以不是太好,但是无法得到手机号码,也只能先这么做了。
在实现方面,SIM卡中信息IMSI号的获得,是轻而易举的,远比获得手机号码简单地多,下面就是我的详细实现方法(有两种方法):
第一种方法:
void btl_send_msg_get_imsi(void) //从MMI层想L4C层发送消息
{
MYQUEUE Message;
SetProtocolEventHandler(btl_sim_imsi_rsp, PRT_GET_IMSI_RSP); //给PRT_GET_IMSI_RSP消息绑定一个函数
Message.oslSrcId = MOD_MMI; //发送消息源模块
Message.oslDestId = MOD_L4C; //消息的目的模块
Message.oslMsgId = PRT_GET_IMSI_REQ; //消息的ID
Message.oslDataPtr = NULL; //消息的携带数据
Message.oslPeerBuffPtr = NULL;
OslMsgSendExtQueue(&Message); //发送消息到外部队列
kal_prompt_trace(MOD_MMI,"btl_send_msg_get_imsi");
}
void btl_sim_imsi_rsp(void *info) //PRT_GET_IMSI_RSP消息发生时会自动调用的函数
{
char imsi_imei_num[17]; //定义存放IMSI号的字符数组:IMSI号不多于15位,但是模拟器上会得到16位数字加一位结束符
mmi_smu_get_imsi_rsp_struct *local_data = (mmi_smu_get_imsi_rsp_struct*) info; //得到的信息内容
kal_prompt_trace(MOD_MMI,"btl_sim_imsi_rsp1"); //在Catcher中显示的
strcpy(imsi_imei_num,(char*)local_data->imsi); //将SIM存放在数组中
_cprintf("-----------------------------------/n");
_cprintf("the imsi number is : %s/n",imsi_imei_num); //在控制台打印出获得的IMSI号
kal_prompt_trace(MOD_MMI,"btl_sim_imsi_rsp2");
}
函数声明后,在任意文件的任意位置调用函数btl_send_get_imsi()即可,当系统有消息PRT_GET_IMSI_RSP发生时,就会调用函数btl_sim_imsi_rsp(),该函数的参数是消息PRT_GET_IMSI_RSP发生时所传过来的数据,是系统自动传参给该函数的。这样就可以获得到本机SIM卡的IMSI号了。
第二种方法是:定义事件捕获函数,捕获系统都有什么时间发生,当某一事件(例如来电事件、拒接事件、短信事件等等)发生时就会捕获到,我们可以自己做些自己的处理。
1)定义事件捕获函数: FlySky_EventHook(unsigned short ID,void *pMsg)
void FlySky_EventHook(unsigned short ID,void *pMsg)
{
char imsiNum[17];
char phoneNUm[20];
memset(&imsiNum,0,sizeof(imsiNum)); //初始化数组为'/0',以保证后面赋值的正确性
memset(&phoneNum,0,0, sizeof(phoneNUm)); //同上
switch(ID)
{
case PRT_INCOMINGCALL_EVENT: //来电事件发生
{
IncomingCall flysky_msg;
/* Get the incoming call number */
memset(&flysky_msg, 0,sizeof(flysky_msg)); //初始化结构体flysky_msg,以免获得信息后赋值不正确
DeriveCallInfo(pMsg, &flysky_msg); // 转换L4来电事件为IncomingCall结构事件
strcpy(phoneNum,(const char *)flysky_msg.Number); //得到来电的电话号码
/* Test to get the IMSI*/
btl_send_msg_get_imsi(); //利用来电事件来测试,来电时发送消息给L4C层
}
case PRT_INCOMINGCALL_REJECTED: //拒接来电
{
break;
}
case PRT_GET_IMSI_RSP: //得到IMSI请求回复
{
btl_sim_imsi_rsp(pMsg); //将该消息发生时的数据信息传参给btl_sim_imsi_rsp
break;
}
default:
break;
}
}
void btl_send_msg_get_imsi(void)
{
MYQUEUE Message;
//SetProtocolEventHandler(btl_sim_imsi_rsp, PRT_GET_IMSI_RSP);
Message.oslSrcId = MOD_MMI;
Message.oslDestId = MOD_L4C;
Message.oslMsgId = PRT_GET_IMSI_REQ;
Message.oslDataPtr = NULL;
Message.oslPeerBuffPtr = NULL;
OslMsgSendExtQueue(&Message);
kal_prompt_trace(MOD_MMI,"btl_send_msg_get_imsi");
}
void btl_sim_imsi_rsp(void *info)
{
char imsi_imei_num[17];
mmi_smu_get_imsi_rsp_struct *local_data = (mmi_smu_get_imsi_rsp_struct*) info;
kal_prompt_trace(MOD_MMI,"btl_sim_imsi_rsp1");
strcpy(imsi_imei_num,(char*)local_data->imsi);
//_cprintf("-----------------------------------/n");
//_cprintf("the imsi number is : %s/n",imsi_imei_num);
kal_prompt_trace(MOD_MMI,"btl_sim_imsi_rsp2");
}
首先要将函数FlySky_EventHook()在MMITask.c文件MMI_task函数前进行声明:extern void FlySky_EventHook(unsigned short ID, void* pMsg); 然后在函数MMI_task的“default: ProtocolEventHandler()”和“break”之间加上:FlySky_EventHook(Message.oslMsgId, (void*)Message.oslDataPtr);
这样就可以捕获到系统所有事件了,想要对什么时间进行捕获,直接在FlySky_EventHook中的case出给出事件对应的消息即可,并对该消息下的事件进行相应的处理即可。
说明:在MTK平台获得IMSI号是比较容易获得的,但是在模拟器中获得的是16位数字的字符串,网上资料中可以查到IMSI(国际移动用户标识符)不超过15位,即是15位组成的,原因是,在模拟器上的并不是真正的SIM卡,所以,要做真正的测试,还需要烧录到真机上进行一个测试。
MTK 平台获取IMSI号码 以及如何截获系统中的各种消息相关推荐
- MTK平台获取本机的SIM卡中IMSI号
要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动.联通或电信)时绑定的:IMSI是sim卡的一个属性号 ...
- mysql数据库系统配置文件_跟我学虚拟机系统平台相关技术及应用——在CentOS系统中的MySql数据库系统配置文件中进行配置定义...
跟我学虚拟机系统平台相关技术及应用--在CentOS系统中的MySql数 据库系统配置文件中进行配置定义 1.1.1MySql5.6数据库系统的配置文件 1.不同作用范围内的系统配置文件 (1)/et ...
- MTK平台 获取本机的SIM卡中IMSI号
公司MTK平台做开发,老板要求在MTK的代码上获得本机上SIM卡的手机号码,查了很多资料后,结果是无法获得,原因是手机号码不是直接存储在SIM卡的,而是信号通过移动商(移动.联通或电信)时绑定的:IM ...
- MTK平台获取和修改GPIO状态
一.MTK 1.节点位置 在MTK平台,我们可以通过cat节点(mt_gpio)来查看对应的状态.不同的平台,该管脚对应的位置也是不同的,建议直接进入手机目录查看: adb shell find -n ...
- 【解决方案】国标GB28181级联EasyGBS及RTSP/SDK/Ehome协议平台EasyCVR在营业厅人脸识别监控系统中的应用
一.背景 随着通信行业的高速发展,用户规模越来越大,技术也日趋复杂,办理通信业务的营业厅也越来越多.现各营业厅存在区域范围广泛,且较分散等特点,随着技术的飞速发展,营业厅安防正逐渐走进高清化.智能化. ...
- php获取当前设备,Linux_在Linux系统中使用lsblk和blkid显示设备信息的方法,今天我们将会向你展示如何使 - phpStudy...
在Linux系统中使用lsblk和blkid显示设备信息的方法 今天我们将会向你展示如何使用 lsblk 和 blkid 工具来查找关于块设备的信息,我们使用的是一台安装了 CentOS 7.0 的机 ...
- 获取android com包名,Android系统中获取进程(和顶端包名)
概要: android L前我们可以使用 getRunningTasks(int maxNum) maxNum int: The maxNumnumber of entries to return i ...
- 获取Linux的方法,CDN Linux系统中获取LDNS的方法
在Linux命令行模式下,可通过以下方式获取: 方法一: curl -s http://13491234.testns.cdnunion.net/?callback? testns前面的数字输入一个随 ...
- linux c 获取 多个硬盘序列号_veket系统中使用GParted进行硬盘分区
Veket Linux操作系统具备小巧,占用资源少,便携方便.安装方便,我们可以将其安装到电脑的硬盘,或者虚拟机中体验一把.如果家里有老式的闲置的电脑,将该系统安装到老式电脑,看看电影,上上网,使用下 ...
最新文章
- 为什么程序员都不喜欢使用 switch ,而是大量的 if……else if ?
- struts+spring+hibernate总结
- Android 唯一标识获取
- 实例介绍Cocos2d-x开关菜单
- 推荐大家一个保护视力的Visual Studio皮肤
- 1.13 梯度检验-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- 访问tomcat html,访问云服务器tomcat里html界面
- 产品迭代的道与术,爆款产品的打造密码 | 周四话产品
- CentOS 编译Hadoop 2.6 32位
- Tournament CodeForces - 27B(dfs)
- 初识ABP vNext(9):ABP模块化开发-文件管理
- Photoshop切图学习
- 闲鱼对Flutter-Native混合工程解耦的探索
- linux报错之no space left on device问题分析
- 直播 | 循序渐进 - DM8 数据存储管理
- typescript 判断异步执行已经结束_vue进阶系列——用typescript玩转vue和vuex
- c# excel vsto 表格偏移Offset
- TensorRt - caffe中支持prelu
- mysql修改唯一索引
- html文字浮雕效果不起作用,CSS3实现文字浮雕效果,镂刻效果,火焰文字