手机卡变了 发短消息通知

模仿功能:SIM检测程序

模仿对象:手机看门狗

模仿进度:第一期

开发平台:Windows Mobile平台

你我不是万人迷,手机里没啥暧昧短信;你我不是大明星,手机里也藏不下火热照片……虽然你我都是小市民,但手机里还是难免有不想让人知道的东西。手机丢了咋办?不如请个看门狗吧。本期,我们先来实现SIM卡跟手机的绑定。

SIM检测程序设计思路

我们要实现的功能是每次开机时,验证手机里的SIM卡信息。如果与最初SIM卡的信息不相符,则认为SIM已经被偷换,程序自动给之前设置的号码发一条短信。程序要分别获取SIM卡ID以及手机的唯一ID号,把这两个ID号与之前保存的进行比较,看是否能匹配得上.

如果没发现之前保存的文件,则是程序第一次运行,程序自动把这两个ID号自动保存下来。如果获取的SIM卡ID和手机ID,与存盘文件内的不相符,则SIM已经被偷换,程序自动发送警告信息至指定的手机号码(图1)。

clip_image002

如何读取SIM卡的信息

设计SIM检测程序,关键是要读取SIM卡的信息。要做到这一步,就要用到上期讲的TAPI了。在TAPI中,使用lineGetGeneralInfo函数即可读取IMSI和IMEI。通过不同函数读取SIM卡,可以得到不同的效果(图2),掌握了这些函数在设计电话录、短信群发之类软件时就会得心应手。

clip_image004

小知识:IMSI的全称是International Mobile Subscriber Identification Number,是客户识别码,也就是我们常说的SIM卡号。IMEI(International Mobile Equipment Identity),国际移动身份识别,俗称”串号”存储在手机的EEPROM(俗称码片)里。

SIM检测程序开发步骤

第一步:创建项目

启动Visual Studio 2008,选择“文件→新建项目”。在弹出的“新建项目”的“项目类型”中选择“Visual C#→智能设备”,“模板”选“智能设备项目”,“名称”设为“Watchdog”。在弹出的“添加新智能设备项目”对话框中,“目标平台”选择“Windows Mobile 6 Professional SDK”,“.Net Compact Framework 版本”选择“.Net Compact Framework Version 3.5”,“模板”选“设备应用程序”完成项目创建。

第二步:获取ID

程序第一次运行通过TAPI的方式,获取IMEI与IMSI。这里我们要用到.Net CF里面的TapiLib.dll。先将该dll添加引用。在解决方案资源管理器里面,右击项目“Watchdog→添加引用→浏览”选择TapiLib.dll文件即可。

接下来我们添加一个类。在解决方案资源管理器里面,右击项目“Watchdog→添加类→MyTapi”。在新生成的MyTapi.cs文件中输入代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

// 调用cellcore.dll获取sim卡的综合信息

if (lineGetGeneralInfo(line.hLine, buffer) != 0)// 调用lineGetGeneralInfo出错

{

throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error(),

"TAPI Error:" + Marshal.GetLastWin32Error().ToString("X"));//获取最近异常代码

// 获取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);//创建Line参数

MyTapi ctapi = new MyTapi();

第三步: 保存ID号码

将第二步获取的ID号码保存起来,方便以后使用。打开Form1.cs文件添加代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

const string fileName = @"\Watchdog.txt";//存档文件路径

//初始绑定IMEI与IMSI

void Binding()

{

string IMSI = MyTapi.GetIMSINumber();//获取IMSI

string IMEI = MyTapi.GetIMEINumber();//获取IMEI

using (StreamWriter sw = File.AppendText(fileName))//打开文件

{

sw.WriteLine(IMSI);//写入IMSI

sw.WriteLine(IMEI);//写入IMEI

sw.Flush();

sw.Close();

第四步: 进行SIM卡验证

程序从第二次运行,就会对SIM卡进行验证。在Form1.cs中添加代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

using (StreamReader sr = File.OpenText(fileName))//打开文件

{

string IMSI = sr.ReadLine();//读取存档的IMSI

string IMEI = sr.ReadLine();//读取存档的IMEI

sr.Close();

return (IMSI == MyTapi.GetIMSINumber() &&

IMEI == MyTapi.GetIMEINumber());//与实际的硬件ID比对

第五步 :发送警告短信

程序在发现SIM卡ID和手机ID跟预存的ID信息不符合的时候,就会发出警告短信到指定的手机。在Form1的构造函数中添加代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

if (File.Exists(fileName))//存盘文件存在

{

if (!Check())//未通过验证

{

SendSMS();//发送警告信息

}

}

else//存盘文件不存在

{

Binding();//保存卡机绑定信息

MessageBox.Show("Binding");

第六步:运行程序

在Visual Studio 2008中点击菜单“调试→启动调试”(或者直接按F5),在弹出的部署对话框中选择“Windows Mobile 6 Professional Device”(如果不是真机与电脑连接,那么选择“Windows Mobile 6 Professional Emulator”,则会启动模拟器),点击“部署”,部署完成之后便会在终端上自动启动程序。

如果使用模拟器的话,我们会发现获取到的IMSI与IMEI都为空,这里最好使用真机进行测试。程序第一次运行,会执行机卡绑定操作,运行效果如图3所示。

clip_image006

读者反馈

开发QQ群:请教一下,短信防火墙的设计跟来电防火墙的设计是不是有相通的地方?目前,我在设计短信防火墙,希望能给我提一些建议。

小编:短信防火墙与来电防火墙基本类似,一般都包括拦截与过滤两大步骤。在拦截技术方面,短信拦截一般可使用MAPI。MAPI接口是由微软公司提供的一系列供使用者开发Mail、Scheduling、bulletin board、communication程序的编程接口。在过滤规则上,短信防火墙,一般还应该考虑针对短信内容的过滤。

开发QQ群:我想问问,在接电话的时候自动录音,这个东东是怎么设计的?希望说详细一点,我比较菜。

小编:可以使用WAVE方式实现,一般需要用到这些函数:

  • waveInOpen ——打开一个音频输入设备(录音)
  • waveInClose ——关闭一个音频输入设备(录音)
  • waveOutOpen —— 打开一个音频输出设备(回放)
  • waveOutClose —— 关闭一个音频输出设备(回放)
  • waveInPrepareHeader ——为音频输入设备准备一个内存数据缓冲(录音)
  • waveOutWrite ——将语音数据块发送至音频输出设备进行播放(回放)

开发QQ群:如何实现在一个手机程序里面暂停1秒钟?我自己也在开发手机程序,但才进入这个领域不久,希望能帮帮我。

小编:可以使用System.Threading.Thread.Sleep(int millisecondsTimeout)。该函数可以使当前线程挂起指定的时长,参数millisecondsTimeout为需要挂起的毫秒数。要实现暂停1秒,可以这样:Sleep(1000)。

开发QQ群:看了模拟来电那篇文章,有一个疑问,用GetAContact()随机读取联系人,会不会出现撞车的情况?

小编:一般应该预先设定来电联系人,可以通过程序从手机电话簿里面选定,这样就不会出现撞车的情况。

读者问题:在某些特殊情况下,需要自动拒接所有的来电,并自动回复给对方一条短信以示礼貌,比如“现在正在开会,稍后回复您”等等,我想问问这个功能应该怎么设计?

高手 铁板火:拒接来电的同时,通过Microsoft.WindowsMobile.PocketOutlook.SmsMessage就可以发送一条短信。需要注意的是,程序集Microsoft.WindowsMobile.PocketOutlook并未默认引用,使用前要记得手动添加。

(载《电脑报》2009年27期)

posted @ 2009-12-28 16:17  huxi  阅读(1142)  评论(0编辑  收藏  举报