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

全部博文(134)

文章存档

2012年(2)

2011年(28)

2010年(68)

2009年(35)

2008年(1)

我的朋友

分类: WINDOWS

2010-09-11 08:57:33

IMSI码、IMSI码、Windows mobile 下读取手机SIM卡信息
2008年11月19日 星期三 10:34

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

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

MCC MNC MSIN/NMSI

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

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

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编码。存储在SIM、LHR、VLR,在无线接口和MAP接口传送。例如 460XXXXXXXXXXXX(最多15个数字)

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

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

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

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

 

 

最近在忙一个移动警务的项目,需要获取SIM卡的信息,来做身份的验证。考虑到获取:国际移动设备识别码(IMEI:International Mobile Equipment Identification Number)和国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number),读取这两个号码用到TAPI的lineGetGeneralInfo()函。在新版的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;
    }
    ///


    /// Tapi控制类
    ///

    public class ControlTapi
    {
        [DllImport("cellcore.dll")]
        private static extern int lineGetGeneralInfo(IntPtr hLigne,byte[]lpLineGeneralInfo );
        ///
        /// 调用cellcore.dll获取sim卡的综合信息
        ///

        ///
        ///
        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;

        }

       

        ///


        /// 获取sim卡的IMSI
        ///

        ///
        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;

        }

        ///


        /// 获取IMEI的号码
        ///

        ///
        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 的代码你可以去看看这里:另:
1、环境:在vs2005+windows mobile 5.0 +多普达818测试通过。
2、
关于获取SIM卡的本机号码,你可以用:
,这里 提供的方法,不过这个方法需要安全认证,比较麻烦,具体认证的方式见: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、参考资料:

本文地址:

阅读(2318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~