首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

怎么读取CDMA双模双待手机的IMSI号

2012-04-03 
如何读取CDMA双模双待手机的IMSI号?如题。[解决办法]不同的厂商,读取的方法是不相同的,建议你和厂商联系。[

如何读取CDMA双模双待手机的IMSI号?
如题。

[解决办法]
不同的厂商,读取的方法是不相同的,建议你和厂商联系。
[解决办法]
问问你们那做驱动的人,要不就问问搞modum的。他们有命令可以读出来,没有的话封装一个给你。
[解决办法]
imsi我这有c的源码:您可以参考一下,如果有哪位大侠知道 手机型号(比如:多普达p800) 的获得方法,请不吝赐教下,小弟急用:)谢谢。 
#define TAPI_API_LOW_VERSION 0x00010003 //TAPI_API版本信息 
#define TAPI_API_HIGH_VERSION 0x00020000 
#define EXT_API_LOW_VERSION 0x00010000 
#define EXT_API_HIGH_VERSION 0x00010000 
// CE手机平台的相关信息 
typedef struct _Phoneinfo 

LPTSTR tsSubscriberNumber;//imsi 
LPTSTR tsManufacturer;//制造商 
LPTSTR tsModel;//cpu型号 
LPTSTR tsRevision;//无线协议版本 
LPTSTR tsSerialNumber;//imei 
// LPVARSTRING tsphoneID; 
}Phoneinfo; 
/////手机信息私有部分//////////////////////////////////////////////////////////////////////////////// 
//取得LineDeviceID 
DWORD GetTSPLineDeviceID(const HLINEAPP hLineApp, 
const DWORD dwNumberDevices, 
const DWORD dwAPIVersionLow, 
const DWORD dwAPIVersionHigh, 
const TCHAR* const psTSPLineName) 

DWORD dwReturn = 0xffffffff; 
DWORD dwCurrentDevID = 0; 

for(dwCurrentDevID; dwCurrentDevID < dwNumberDevices ; dwCurrentDevID++) 

DWORD dwAPIVersion; 
LINEEXTENSIONID LineExtensionID; 
if(0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, //判断API版本 
dwAPIVersionLow, dwAPIVersionHigh, 
&dwAPIVersion, &LineExtensionID)) 

LINEDEVCAPS LineDevCaps; 
LineDevCaps.dwTotalSize = sizeof(LineDevCaps); 
if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID, 
dwAPIVersion, 0, &LineDevCaps)) 

BYTE* pLineDevCapsBytes = (BYTE *)malloc(LineDevCaps.dwNeededSize); //取得存储设备信息的结构体所需的空间大小 
if(0 != pLineDevCapsBytes) 

LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes; 
pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize; 
if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID, //取得设备的一些信息 
dwAPIVersion, 0, pLineDevCaps)) 

if(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), 
psTSPLineName)) //取得设备id并比较是不是移动设备的id 

dwReturn = dwCurrentDevID; 



free(pLineDevCapsBytes); 
pLineDevCapsBytes = NULL; 




return dwReturn; 

//取得关于手机的各种信息 
BOOL GetPhoneInfo(Phoneinfo *phoneinfo) 

DWORD dwNumDevs; 
DWORD dwAPIVersion = TAPI_API_HIGH_VERSION; 
LINEINITIALIZEEXPARAMS liep; 
HLINEAPP hLineApp = 0; 
HLINE hLine = 0; 
DWORD dwExtVersion;
LPBYTE pLineGeneralInfoBytes = NULL; 
DWORD dwTAPILineDeviceID; 
const DWORD dwMediaMode = LINEMEDIAMODE_DATAMODEM | LINEMEDIAMODE_INTERACTIVEVOICE; 
LINEGENERALINFO lviGeneralInfo; 
LPLINEGENERALINFO plviGeneralInfo; 

// set the line init params 
liep.dwTotalSize = sizeof(liep); 
liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT; 

if (lineInitializeEx(&hLineApp, 0, 0, TEXT("ExTapi_Lib"), //初始化 
&dwNumDevs, &dwAPIVersion, &liep)) 

goto cleanup; 


// get the device ID 
dwTAPILineDeviceID = GetTSPLineDeviceID(hLineApp, dwNumDevs, //取得当前连接的移动设备id 
TAPI_API_LOW_VERSION, 
TAPI_API_HIGH_VERSION, 


L"Cellular Line"); 

// error getting the line device ID? 
if (0xffffffff == dwTAPILineDeviceID) 

goto cleanup; 


// now try and open the line 
if(lineOpen(hLineApp, dwTAPILineDeviceID, 
&hLine, dwAPIVersion, 0, 0, 
LINECALLPRIVILEGE_OWNER, dwMediaMode, 0)) //打开该设备 

goto cleanup; 


// set up ExTAPI 
if (lineNegotiateExtVersion(hLineApp, dwTAPILineDeviceID, 
dwAPIVersion, EXT_API_LOW_VERSION, 
EXT_API_HIGH_VERSION, &dwExtVersion)) 

goto cleanup; 


// try to get the general info 
lviGeneralInfo.dwTotalSize = sizeof(lviGeneralInfo); 

// step 1: find out how much space we need 
if (lineGetGeneralInfo(hLine, &lviGeneralInfo)) 

goto cleanup; 


// step 2: malloc space for all the info we need 
pLineGeneralInfoBytes = (BYTE *)malloc(lviGeneralInfo.dwNeededSize); 
plviGeneralInfo = (LPLINEGENERALINFO)pLineGeneralInfoBytes; 

// step 3: call lGGI again with the appropriately sized buffer 
if(NULL != pLineGeneralInfoBytes) 

plviGeneralInfo->dwTotalSize = lviGeneralInfo.dwNeededSize; 
if (lineGetGeneralInfo(hLine, plviGeneralInfo)) //取得该设备的基本信息 

goto cleanup; 

} else 

goto cleanup; 


if(0 < plviGeneralInfo->dwSubscriberNumberSize) //得到imsi 

phoneinfo->tsSubscriberNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwSubscriberNumberOffset); 

if(0 < plviGeneralInfo->dwManufacturerSize)//得到制造商 

phoneinfo->tsManufacturer = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwManufacturerOffset); 

if(0 < plviGeneralInfo->dwModelSize)//得到cpu型号 

phoneinfo->tsModel = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwModelOffset); 

if(0 < plviGeneralInfo->dwRevisionSize)//得到无线版本和协议版本 

phoneinfo->tsRevision = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwRevisionOffset); 

if(0 < plviGeneralInfo->dwSerialNumberSize)//得到imei 

phoneinfo->tsSerialNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwSerialNumberOffset); 

return TRUE; 
cleanup: 
if (pLineGeneralInfoBytes) 

free(pLineGeneralInfoBytes); 
pLineGeneralInfoBytes = NULL; 


if (hLine) lineClose(hLine); //关闭该设备 
if (hLineApp) lineShutdown(hLineApp); //销毁line 

return FALSE; 

/* ========================================================================= */
/* 名称: MK_Device_GetImsi */
/* 函数原型:extern char* MK_Device_GetImsi(DeviceSystem* pDeviceSystem) */
/* 参数:pDeviceSystem:指向自定义结构体的指针 */
/* 返回值:失败:NULL */
/* 成功:手机卡imsi的号码字符串 */
/* 说明: 获得手机卡的号码,调用该函数要注意free掉该字符串 */
/* ========================================================================= */
///获得手机卡的号码,调用该函数要注意free掉该字符串
extern char* MK_Device_GetImsi(DeviceSystem* pDeviceSystem)
{
char *_lpData = NULL;
int Size;
Phoneinfo phoneinfomation;
BOOL isok = FALSE;
isok = GetPhoneInfo(&phoneinfomation);//获得手机各种信息
if(!isok || wcscmp(phoneinfomation.tsSubscriberNumber, L"") == 0)
{
return NULL;
}
//UNICODE转ASCII
Size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)(phoneinfomation.tsSubscriberNumber) , -1, MK_NULL, 0, MK_NULL, MK_NULL);


_lpData = (char *)malloc(Size);
if (!_lpData) return NULL;
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)(phoneinfomation.tsSubscriberNumber), -1, (char *)_lpData, Size, MK_NULL, MK_NULL);

return (char *)_lpData;

}
[解决办法]
CDMA的WM手机,倒是可以用楼上的代码获取到所用卡的IMSI,不过我测试时发现一个大问题,我手头测试用的CDMA的WM手机调用lineGetGeneralInfo()后,手机收到的任何来电都会被系统自动挂断。估计是lineGetGeneralInfo()占用的line没有被后面lineClose()正确释放,从而导致系统判定手机一直处于接通状态,所以后面收到的来电都会被强行挂断。
[解决办法]
啊?会有这个问题啊?这问题如果有的话还真是藏得挺深的,楼主竟然能够发现。太强悍了!。。以后注意下看看是不是我这边也有这样的问题。不过程序退出后就该恢复正常了吧~?您说的是在程序使用中的来电吧~?

热点排行