Windows mobile 下读取手机SIM卡信息

来源:互联网 发布:jquery.tips.js 用法 编辑:程序博客网 时间:2024/05/05 02:40

IMSI码、IMSI码、Windows mobile下读取手机SIM卡信息

IMSI的全称是International Mobile Subscriber Identification Number,也就是客户识别码。当手机开机后在接入网络的过程中有一个注册登记的过程,这时候会被分配一个客户号码(客户电话号码)和客户识别码(IMSI)客户请求接入网络时,系统通过控制信道将经加密算法后的参数组传送给客户,手机中的SIM卡收到参数后,与SIM卡存储的客户鉴权参数经同样算法后对比,结果相同就允许接入,否则为非法客户,网络拒绝为此客户服务。

国际移动用户识别码用于识别GSM/PLMN网中用户,简称用户识别码,根据GSM建议,IMSI最大长度为15位十进制数字。

MCC MNC MSIN/NMSI

3位数字 1或者2位数字 10-11位数字

MCC-移动国家码,3位数字。如中国的MCC460

MNC-移动网号,最多2位数字。用于识别归属的移动通信网(PLMN)。

MSIN-移动用户识别码。用于识别移动通信网中的移动用户。

NMSI-国内移动用户识别码。由移动网号和移动用户识别码组成

IMSI即国际移动用户识别码,在GSM系统中,给每个移动用户分配一个唯一的国际用户识别码IMSI,此码在网中所有位置包括漫游区都是有效的。
IMEI
是国际移动设备识别码,IMEI唯一地识别一个移动设备,用于监控被窃或无效的移动设备。
TMSI
临时移动用户识别码,为保证移动用户识别的安全性,GSM系统在空中接口传递TMSI代替IMSI

MSISDN:是主叫用户呼叫GSM PLMN的一个移动用户所需拨的号码,作用与PLMN固定网的号码。储存在HLR VLR采取E.164编码。在MAP接口传送。例如:139XXXXXXXX.

IMSI
:是GSM分配给移动用户(MS)唯一的识别号码。采用E.212编码。存储在SIMLHRVLR,在无线接口和MAP接口传送。例如 460XXXXXXXXXXXX(最多15个数字)

形象地说,就是一个事物的两个名称,比如古代人都有名,有字。
关羽姓关,名羽,字云长。
无论叫关羽,还是关云长,都是指一个人,不会误认为是刘备。

MSISDN
IMSI也类似。用在不同的地方,不同场合。
你告诉别人的号码是 MSISDN号码,可是当你被呼叫时,网络依据的是 IMSI(实际会换成 TMSI)。

在手机键盘上输入*#06#就可以获得本机的IMSI

IMSIinternational mobile subscriber indentity)是存在SIM卡及HLR中的,一般在网络中,用IMSI标示用户,而不是MSISDN139XXXX
TMSI
temperate mobile subscriber indentity)是基站(BTS)在呼叫用户时,所用的号码,一般比IMSI短。但有的设备商的此项功能没开,直接用IMSI

 

 

最近在忙一个移动警务的项目,需要获取SIM卡的信息,来做身份的验证。考虑到获取:国际移动设备识别码(IMEIInternational Mobile Equipment Identification Number)和国际移动用户识别码(IMSIInternational Mobile Subscriber Identification Number),读取这两个号码用到TAPIlineGetGeneralInfo()函。在新版的OpenNetCF里没有发现对这个函数的封装(也许我没找到),于是到网上找了找,找到一个以前版本OpenNetCF里的:TapiLib.dll,包含对Windows ce phone api 的封装(TAPI,综合网上的一些资料,实现代码如下:public struct GeneralInfo
    {
        public string Manufacturer;
        public string Model;
        public string Revision;
        public string SerialNumber;
        public string SubscriberNumber;
    }    /// <summary>
    /// Tapi
控制类
    /// </summary>
    public class ControlTapi
    {        [DllImport("cellcore.dll")]
        private static extern int lineGetGeneralInfo(IntPtr hLigne,byte[]lpLineGeneralInfo );
        /// <summary>
        ///
调用cellcore.dll获取sim卡的综合信息
        /// </summary>
        /// <param name=”l”></param>
        /// <returns></returns>
        private  GeneralInfo GetGeneralInfo(Line l)
        {
            GeneralInfo lgi = new GeneralInfo();
            byte[] buffer = new byte[512];
            BitConverter.GetBytes(512).CopyTo(buffer, 0);
 

 

            if (lineGetGeneralInfo(l.hLine, buffer) != 0)
            {
                throw new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error(), “TAPI Error: ” + System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString(“X”));
            }

            int subscsize = BitConverter.ToInt32(buffer, 44);
            int subscoffset = BitConverter.ToInt32(buffer, 48);
            lgi.SubscriberNumber = System.Text.Encoding.Unicode.GetString(buffer, subscoffset, subscsize).ToString();
            lgi.SubscriberNumber = lgi.SubscriberNumber.Replace(“/0″, “”);
            return lgi;

        }

       

        /// <summary>
        ///
获取sim卡的IMSI
        /// </summary>
        /// <returns></returns>
        public static string  GetIMSINumber()
        {
            string result = “”;
            try
            {
                Tapi t = new Tapi();
                t.Initialize();
                Line l = t.CreateLine(0, LINEMEDIAMODE.INTERACTIVEVOICE, OpenNETCF.Tapi.LINECALLPRIVILEGE.MONITOR);
                ControlTapi ctapi = new ControlTapi();
                GeneralInfo gi = ctapi.GetGeneralInfo(l);
              
                result =  gi.SubscriberNumber;
                l.Dispose();
                t.Shutdown();

            }
            catch// (Exception ex)
            {
                result = “”;
            }

            return result;

        }

        /// <summary>
        ///
获取IMEI的号码
        /// </summary>
        /// <returns></returns>
        public static string GetIMEINumber()
        {
            string result = “”;
            try
            {
                Tapi t = new Tapi();
                t.Initialize();
                Line l = t.CreateLine(0, LINEMEDIAMODE.INTERACTIVEVOICE, OpenNETCF.Tapi.LINECALLPRIVILEGE.MONITOR);
                ControlTapi ctapi = new ControlTapi();
                GeneralInfo gi = ctapi.GetGeneralInfo(l);
                result = gi.SerialNumber;
                l.Dispose();
                t.Shutdown();

            }
            catch// (Exception ex)
            {
                result = “”;
            }

            return result;
        }


    }

vb 的代码你可以去看看这里:http://www.peterfoot.net/RetrieveIMEIThroughTAPI.aspx另:
1
、环境:在vs2005+windows mobile 5.0+多普达818测试通过。
2

关于获取SIM卡的本机号码,你可以用:http://www.microsoft.com/china/msdn/archives/library/dnnetcomp/html/netcfPhoneAPI.asp,这里提供的方法,不过这个方法需要安全认证,比较麻烦,具体认证的方式见:http://www.microsoft.com/china/MSDN/library/Mobility/pocketpc/2k3smartphonesecurity.mspx?pf=true
3
TapiLib.dll的下载地址:http://www.cnblogs.com/Files/xjb/TapiLib.rar
4、参考资料:
http://hucgy.bokee.com/3328836.html