如何读取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()正确释放,从而导致系统判定手机一直处于接通状态,所以后面收到的来电都会被强行挂断。
[解决办法]
啊?会有这个问题啊?这问题如果有的话还真是藏得挺深的,楼主竟然能够发现。太强悍了!。。以后注意下看看是不是我这边也有这样的问题。不过程序退出后就该恢复正常了吧~?您说的是在程序使用中的来电吧~?