手机sim卡信息
Windows mobile 下读取手机SIM卡信息收藏
最近在忙一个移动警务的项目,需要获取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[]lpLineGene
ralInfo );
///
/// 调用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, Open
NETCF.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, Open
NETCF.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 的代码你可以去看看这里:
px
另:
1、环境:在vs2005+windows mobile 5.0 ,多普达818测试通过。 2、
关于获取SIM卡的本机号码,你可以用:
es/library/dnnetcomp/html/netcfPhoneAPI.asp,这里 提供的方法,不过这个方法需要安全认证,比较麻烦,具体认证的方式见:
/Mobility/pocketpc/2k3smartphonesecurity.mspx?pf=true。
3、TapiLib.dll的
地址:、参考资料:
读取SIM卡的一些信息用于PDA软件注册及安全使用
最近从客户那边反应来一个需求,就是我们提交的软件中的PDA程序中的通讯录模块的信息安全方
面做得不够,就是在如果PDA丢失时,这里的联系人信息就可能外泄。
所以就提出了以下的解决
:
正常情况下,丢失后要更换SIM卡,无论是那一方。所以可通过重新注册新的SIM信息来验证是否
可用。具体的方案细节就不详细说明了。其中技术方面关键的一环是如何识别唯一SIM卡。
刚开始是读取SIM卡的本机号码,从
omp/html/netcfPhoneAPI.asp这篇<<从Microsoft .NET Framework 精简版访问电话API>>文章提
供的示例中封装的Sim类中就有提供一个Sim.GetPhoneNumber()方法方便获取本机号码。
但是考虑到这个号码是可修改的且可以有很多个(通过PDA中提供的SIM管理器就可以修改)。所以
得找其它的SIM卡信息,在这里用的是SIM卡中IMEI,IMSI(国际移动设备识别码(IMEI:Internat
ional Mobile Equipment Identification Number)是区别移动设备的标志,储存在移动设备中,可用
于监控被窃或无效的移动设备。IMEI组成如下图所示,移动终端设备通过键入“*#06#”即可查得。其
总长为15位,每位数字仅使用0,9的数字。其中TAC代表型号装配码,由欧洲型号标准中心分配;
FAC代表装配厂家号码;SNR为产品序号,用于区别同一个TAC和FAC中的每台移动设备;SP
是备用编码。
国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动
用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。IMSI组成如下图所示,其总长度
不超过15位,同样使用0,9的数字。 其中MCC是移动用户所属国家代号,占3位数字,中国的
MCC规定为460;MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信
网;MSIN是移动用户识别码,用以识别某一移动通信网中的移动用户。)
读取这两个号码用到TAPI的lineGetGeneralInfo()函数。而OpenNetCF提供了对TAPI的封装,正
好可以拿来用。
其中的具体的应用可查看