• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            如何獲取PDA/PPC的IMEI/IMSI號碼

            IMEI(International Mobile Equipment Identity,國際移動身份識別)俗稱”串號”存儲在手機的EEPROM(俗稱碼片)里,每一個移動設備都對應一個唯一的IMEI。其組成結構為TAC(6位數字)+FAC(兩位數字)+SNR(6位數字)+SP (1位數字)。IMEI唯一地識別一個移動設備,用于監控被竊或無效的移動設備。
            IMSI的全稱是International Mobile Subscriber Identification Number,也就是客戶識別碼。在GSM系統中,給每個移動用戶分配一個唯一的國際用戶識別碼IMSI,此碼在網中所有位置包括漫游區都是有效的。
            下面的類是自己封裝的,用來獲取IMEI/IMSI號碼。
            #pragma once
            #endif // _MSC_VER > 1000

            //#include "resource.h"


            #define TAPI_API_LOW_VERSION    0x00010003
            #define TAPI_CURRENT_VERSION 0x00020000
            #define EXT_API_LOW_VERSION     0x00010000
            #define EXT_API_HIGH_VERSION    0x00010000

            typedef struct Info
            {
             char IMSI[128];
             char IMEI[128];
            }Siminfo;

            class SimInfo 
            {
            public:
             SimInfo();
             virtual ~SimInfo();

             static SimInfo Info;
            public:

             bool Init();
             Siminfo GetGeneralInfo();
             DWORD m_dwNumDevs;
             DWORD m_dwAPIVersion;
             HLINEAPP m_hLineApp;
             HLINE m_hLine;
             DWORD m_dwExtVersion;
             DWORD m_dwTSPILineDeviceID;
             
             LPTSTR g_dwImei;
             
             
            private:
             void GetTAPIErrorMsg(TCHAR *szMsg,int nSize, DWORD dwError);
             DWORD GetTSPLineDeviceID(const TCHAR* const psTSPLineName);
             
            };

            #endif // !defined(AFX_IMEI1_H__84CB8CFD_9DA9_470E_867E_2D689F916CBE__INCLUDED_)

            // DevInfo.cpp: implementation of the DevInfo class.
            //
            //////////////////////////////////////////////////////////////////////

            #include "stdafx.h"
            //#include "imei.h"
            #include "DevInfo.h"

            #ifdef _DEBUG
            #undef THIS_FILE
            static char THIS_FILE[]=__FILE__;
            #define new DEBUG_NEW
            #endif

            //////////////////////////////////////////////////////////////////////
            // Construction/Destruction
            //////////////////////////////////////////////////////////////////////

            DevInfo::DevInfo()
            {
             m_dwAPIVersion = TAPI_CURRENT_VERSION;
                m_hLineApp = 0;
                m_hLine = 0;
                m_dwExtVersion = 0;
            }

            DevInfo::~DevInfo()
            {
             
            }

            bool DevInfo::Init()
            {
             // set the line init params
                LINEINITIALIZEEXPARAMS LineExtParams;
                LineExtParams.dwTotalSize = sizeof(LineExtParams);
                LineExtParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
               
                if (::lineInitializeEx(&m_hLineApp, 0, 0, _T("Developer.com Test"),
              &m_dwNumDevs, &m_dwAPIVersion, &LineExtParams))
                {
              //EndDialog(IDOK);
              return false;
                }
             
             m_dwTSPILineDeviceID = GetTSPLineDeviceID(CELLTSP_LINENAME_STRING);
             //m_dwTSPILineDeviceID = GetTSPLineDeviceID(L"GPRS Modem - Data Port as COM7:");
             if ( m_dwTSPILineDeviceID == (DWORD)-1 )
             {
              ::lineShutdown(m_hLineApp);
              //EndDialog(IDOK);
              return false;
             }
             
                // open the line
                if( ::lineOpen(m_hLineApp, m_dwTSPILineDeviceID,
              &m_hLine, m_dwAPIVersion, 0, 0,
              LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM, 0) )
                {
              ::lineShutdown(m_hLineApp);
              //EndDialog(IDOK);
              return false;
                }
             
                // set up ExTAPI
                if ( ::lineNegotiateExtVersion(m_hLineApp, m_dwTSPILineDeviceID,
              m_dwAPIVersion, EXT_API_LOW_VERSION,
              EXT_API_HIGH_VERSION, &m_dwExtVersion) )
                {
              ::lineClose(m_hLine);
              ::lineShutdown(m_hLineApp);
              //EndDialog(IDOK);
              return false;
                }
             
             return true;
            }

            DWORD DevInfo::GetTSPLineDeviceID(const TCHAR *const psTSPLineName)
            {
             DWORD dwReturn = -1;
                for(DWORD dwCurrentDevID = 0 ; dwCurrentDevID < m_dwNumDevs ; dwCurrentDevID++)
                {
                    LINEEXTENSIONID LineExtensionID;
                    if( ::lineNegotiateAPIVersion(m_hLineApp, dwCurrentDevID,
               TAPI_API_LOW_VERSION, TAPI_CURRENT_VERSION,
               &m_dwAPIVersion, &LineExtensionID) == 0 )
                    {
                        LINEDEVCAPS LineDevCaps;
                        LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
                        if( ::lineGetDevCaps(m_hLineApp, dwCurrentDevID,
                m_dwAPIVersion, 0, &LineDevCaps) == 0 )
                        {
                            BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
                            if(0 != pLineDevCapsBytes)
                            {
                                LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
                                pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
                                if( ::lineGetDevCaps(m_hLineApp, dwCurrentDevID,
                  m_dwAPIVersion, 0, pLineDevCaps) == 0 )
                                {
                                    if(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset),
                   psTSPLineName))
                                    {
                                        dwReturn = dwCurrentDevID;
                                    }
                                }
                                delete[]  pLineDevCapsBytes;
                            }
               }
              }
                }
                return dwReturn;
            }
            //獲取手機SIM卡信息(IMEI國際移動設備識別碼)國際移動用戶識別碼(IMSI)
            DevInfo DevInfo::GetGeneralInfo()
            {
             DevInfo Result;
             memset(Result.IMEI, 0, 128);
             memset(Result.IMSI, 0, 128);

             LPBYTE pLineGeneralInfoBytes = NULL;
                const DWORD dwMediaMode = LINEMEDIAMODE_DATAMODEM;
                LINEGENERALINFO lviGeneralInfo;
                LPLINEGENERALINFO plviGeneralInfo;
                LPTSTR tsManufacturer, tsModel, tsRevision, tsSerialNumber, tsSubscriberNumber;
             CString sInfo;
             
                lviGeneralInfo.dwTotalSize = sizeof(lviGeneralInfo);
             
                LONG lRes = ::lineGetGeneralInfo(m_hLine, &lviGeneralInfo);
                if (lRes != 0 && lRes != LINEERR_STRUCTURETOOSMALL)
                {
              TCHAR szMsg[255];
              GetTAPIErrorMsg(szMsg,sizeof(szMsg), lRes);
              AfxMessageBox(szMsg);
            //  return c;
                }

                pLineGeneralInfoBytes = new BYTE[lviGeneralInfo.dwNeededSize];
                plviGeneralInfo = (LPLINEGENERALINFO)pLineGeneralInfoBytes;
             
                if(pLineGeneralInfoBytes != NULL)
                {
                    plviGeneralInfo->dwTotalSize = lviGeneralInfo.dwNeededSize;
                    if ( (lRes = ::lineGetGeneralInfo(m_hLine, plviGeneralInfo)) != 0 )
                    {
               TCHAR szMsg[255];
               GetTAPIErrorMsg(szMsg,sizeof(szMsg), lRes);
               AfxMessageBox(szMsg);
                    }
              else
              {
               TCHAR szUnavailable[] = L"Unavailable";
               if(plviGeneralInfo->dwManufacturerSize)
               {
                tsManufacturer = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwManufacturerOffset);
               }
               else
               {
                tsManufacturer = szUnavailable;
               }
               
               if(plviGeneralInfo->dwModelSize)
               {
                tsModel = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwModelOffset);
               }
               else
               {
                tsModel = szUnavailable;
               }
               
               if(plviGeneralInfo->dwRevisionSize)
               {
                tsRevision = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwRevisionOffset);
               }
               else
               {
                tsRevision = szUnavailable;
               }
               
               if(plviGeneralInfo->dwSerialNumberSize)
               {
                tsSerialNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwSerialNumberOffset);
               }
               else
               {
                tsSerialNumber = szUnavailable;
               }
               
               if(plviGeneralInfo->dwSubscriberNumberSize)
               {
                tsSubscriberNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)+plviGeneralInfo->dwSubscriberNumberOffset);
               }
               else
               {
                tsSubscriberNumber = szUnavailable;
               }
               
               sInfo.Format(L"Manufacturer: %s\nModel: %s\nRevision: %s\nSerial No: %s\nSubscriber No: %s\n",
                tsManufacturer,
                tsModel,
                tsRevision,
                tsSerialNumber,
                tsSubscriberNumber);
               int a = sizeof(tsSerialNumber);
               int b = sizeof(tsSubscriberNumber);
              
               int Length =0;
               while(1)
               {
                Result.IMSI[Length++] = (char)*tsSubscriberNumber++;

                if((char)*tsSubscriberNumber<=0 )
                 break;
               } 
               int Len = 0;
               while(1)
               {
                Result.IMEI[Len++] = (char)*tsSerialNumber++;

                if( (char)*tsSerialNumber<=0)
                 break;
               } 
              }
                }
             
             delete [] pLineGeneralInfoBytes;

             if( strlen(Result.IMEI) > 15)
             {
              memcpy(Result.IMEI,(Result.IMEI) + (strlen(Result.IMEI) - 15),15);
              Result.IMEI[15] = '\0';
             }
             if( strlen(Result.IMSI) >  15)
              memcpy(Result.IMSI,(Result.IMSI) + (strlen(Result.IMSI) - 15),15);
             
             return Result;
            }

            void DevInfo::GetTAPIErrorMsg(TCHAR *szMsg, int nSize, DWORD dwError)
            {
             LPTSTR lpBuffer = 0;
             DWORD dwRet = 0;
             
             dwRet = ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
              NULL,TAPIERROR_FORMATMESSAGE(dwError),MAKELANGID(LANG_NEUTRAL, LANG_NEUTRAL),
              (LPTSTR) &lpBuffer,0,NULL);
             memset(szMsg,0,nSize);
             if (lpBuffer && dwRet)
             {
              _tcscpy(szMsg,lpBuffer);
              LocalFree(lpBuffer);
             }
             else
             {
              _stprintf(szMsg,L"Unknown Error: 0x%X",dwError);
             }
            }

            用法示例:
            DevInfo imei;
             imei.Init();
              Info e = imei.GetGeneralInfo();

            posted on 2009-02-07 15:42 Benjamin 閱讀(4405) 評論(5)  編輯 收藏 引用 所屬分類: PDA/PPC開發

            評論

            # re: 如何獲取PDA/PPC的IMEI/IMSI號碼[未登錄]  回復  更多評論   

            我編譯沒通過。你能幫幫我吧。
            2009-05-02 06:44 | dean

            # 請問如何從PC端編程讀取cemail.vol里面的短信?  回復  更多評論   

            請問如何從PC端編程讀取cemail.vol里面的短信?

            不需要在手機在安裝軟件
            2009-06-07 14:57 | 江蘇

            # re: 如何獲取PDA/PPC的IMEI/IMSI號碼  回復  更多評論   

            關于cemail.vol里的短信讀取,無聊客講的比較清楚,可以參考一下.
            2009-06-11 22:50 | Benjamin

            # re: 如何獲取PDA/PPC的IMEI/IMSI號碼  回復  更多評論   

            博主厲害啊,我也正在做這個工作,讀取sim卡的imsi號碼和imei號碼,可是看博主的代碼中,很多看不明白,比如:SimInfo,DevInfo之類的定義。我QQ25350294,msn:juvinchen@gmail.com可否加博主請教一下呢?謝謝了!
            2009-09-16 21:36 | 陳俊偉

            # re: 如何獲取PDA/PPC的IMEI/IMSI號碼[未登錄]  回復  更多評論   

            我的QQ61457940 想請教下你。在C#中怎么使用你這段代碼呢
            2012-04-26 11:52 | ALEX
            久久久久亚洲AV片无码下载蜜桃 | 久久香蕉国产线看观看乱码| 亚洲午夜久久久影院| 欧美一区二区三区久久综| 97久久天天综合色天天综合色hd| 精品乱码久久久久久夜夜嗨| 久久99精品久久只有精品 | 精品视频久久久久| 久久国产精品一区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久久久噜噜精品免费直播| 国产成人精品久久亚洲高清不卡| 国产精品99久久久久久猫咪| 久久久久久国产精品美女 | 国产精品99久久久久久宅男小说| 久久91精品国产91| 久久亚洲AV成人无码国产| 精品国产VA久久久久久久冰 | 久久精品国产一区| 99久久人人爽亚洲精品美女| 久久亚洲精品无码播放| 777午夜精品久久av蜜臀| 72种姿势欧美久久久久大黄蕉| 99久久精品免费看国产| 久久综合狠狠综合久久97色| 精品综合久久久久久98| 情人伊人久久综合亚洲| 香蕉久久影院| 精品久久久久久无码专区不卡 | 久久久久久久波多野结衣高潮 | 久久99热这里只频精品6| 久久国产乱子伦免费精品| 久久国产精品国语对白| 亚洲国产一成人久久精品| 久久久青草青青亚洲国产免观| 开心久久婷婷综合中文字幕| 久久ZYZ资源站无码中文动漫| 久久久久综合中文字幕| 91精品国产乱码久久久久久| 久久亚洲中文字幕精品一区| 91精品国产色综久久|