Chinaunix首页 | 论坛 | 博客
  • 博客访问: 659848
  • 博文数量: 134
  • 博客积分: 3158
  • 博客等级: 中校
  • 技术积分: 1617
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-30 22:36
文章分类

全部博文(134)

文章存档

2012年(2)

2011年(28)

2010年(68)

2009年(35)

2008年(1)

我的朋友

分类: 嵌入式

2010-09-11 09:24:21

  获取SIM卡号(IMSI) 收藏
又到一周周未时,该写博客了,但想了一下,突然发现这周什么也没干,也不知道写什么,最后突然在桌面上发现了这段代码,获取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,这时候它里面就已经包含了各种有用的信息了,你想要什么就获取什么吧
下面贴下简单的代码:
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
    LPTSTR  lpszIMSI;
    LINEINITIALIZEEXPARAMS lineExtParams;
    lineExtParams.dwTotalSize = sizeof(lineExtParams);
    lineExtParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
    DWORD dwAPIVersion = TAPI_CURRENT_VERSION;
    HLINEAPP    hLineApp;
    DWORD   dwNumDevs;
    lineInitializeEx(&hLineApp, NULL, NULL, _T("Mengge"), &dwNumDevs, &dwAPIVersion, &lineExtParams);
    DWORD   dwTSPILineDeviceID = 0;
    for (DWORD dwCurrentDevID = 0; dwCurrentDevID < dwNumDevs; dwCurrentDevID++)
    {
        LINEEXTENSIONID LineExtensionID;
        if (lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, 
            TAPI_API_LOW_VERSION, TAPI_CURRENT_VERSION, 
            &dwAPIVersion, &LineExtensionID) == 0)
        {
            LINEDEVCAPS LineDevCaps;
            LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
            if( ::lineGetDevCaps(hLineApp, dwCurrentDevID, 
                dwAPIVersion, 0, &LineDevCaps) == 0 ) 
            {
                BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
                if(0 != pLineDevCapsBytes) 
                {
                    LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
                    pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
                    if( ::lineGetDevCaps(hLineApp, dwCurrentDevID, 
                        dwAPIVersion, 0, pLineDevCaps) == 0 ) 
                    {
                        LPTSTR  lstr = (TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset);
                        if (!_tcscmp(CELLTSP_LINENAME_STRING, lstr))
                        {
                            dwTSPILineDeviceID = dwCurrentDevID;
                            delete[]  pLineDevCapsBytes;
                            break;
                        }
                    }
                    delete[]  pLineDevCapsBytes;
                }
            }
        }
    }
    HLINE   hLine = NULL;
    if( ::lineOpen(hLineApp, dwTSPILineDeviceID, 
        &hLine, dwAPIVersion, 0, 0, 
        LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM, 0) ) 
    {
        ::lineShutdown(hLineApp);
        return FALSE;
    }
    LINEGENERALINFO lviGeneralInfo;
    lviGeneralInfo.dwTotalSize = sizeof(lviGeneralInfo);
    LONG lRes = ::lineGetGeneralInfo(hLine, &lviGeneralInfo);
    if (lRes != 0 && lRes != LINEERR_STRUCTURETOOSMALL)
    {
        DWORD   dd = GetLastError();
        ::lineClose(hLine);
        ::lineShutdown(hLineApp);
        return FALSE;
    }
    LPLINEGENERALINFO plviGeneralInfo;
    LPTSTR  tsSubscriberNumber;
    LPBYTE pLineGeneralInfoBytes = NULL;
    pLineGeneralInfoBytes = new BYTE[lviGeneralInfo.dwNeededSize];
    plviGeneralInfo = (LPLINEGENERALINFO)pLineGeneralInfoBytes;
    if(pLineGeneralInfoBytes != NULL)
    {
        plviGeneralInfo->dwTotalSize = lviGeneralInfo.dwNeededSize;
        if ( (lRes = ::lineGetGeneralInfo(hLine, plviGeneralInfo)) != 0 )
        {
            ::lineClose(hLine);
            ::lineShutdown(hLineApp);
            return FALSE;
        }
        else
        {
            TCHAR szUnavailable[] = L"Unavailable";
            if(plviGeneralInfo->dwSubscriberNumberSize)
            {
                tsSubscriberNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)
                    +plviGeneralInfo->dwSubscriberNumberOffset);  //此处就获得了IMSI
            }
            else
            {
                tsSubscriberNumber = szUnavailable;
            }
        }
    }
    delete [] pLineGeneralInfoBytes;
    return  10;
}
 

注:我用这段程序在有些模拟器上执行不成功,调试了一下发现没有找到名字为“Cellular Line”的设备线路 ,不知道这是为什么……
在SDK里面有个ExAPI的例子,里面有获取IMSI、IMEI、制造商、软件版本等信息的。
Dotaing.....

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ciahi/archive/2008/11/07/3249776.aspx
阅读(7518) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~