手机卡变了 发短消息通知
模仿功能:SIM检测程序
模仿对象:手机看门狗
模仿进度:第一期
开发平台:Windows Mobile平台
你我不是万人迷,手机里没啥暧昧短信;你我不是大明星,手机里也藏不下火热照片……虽然你我都是小市民,但手机里还是难免有不想让人知道的东西。手机丢了咋办?不如请个看门狗吧。本期,我们先来实现SIM卡跟手机的绑定。
SIM检测程序设计思路
我们要实现的功能是每次开机时,验证手机里的SIM卡信息。如果与最初SIM卡的信息不相符,则认为SIM已经被偷换,程序自动给之前设置的号码发一条短信。程序要分别获取SIM卡ID以及手机的唯一ID号,把这两个ID号与之前保存的进行比较,看是否能匹配得上.
如果没发现之前保存的文件,则是程序第一次运行,程序自动把这两个ID号自动保存下来。如果获取的SIM卡ID和手机ID,与存盘文件内的不相符,则SIM已经被偷换,程序自动发送警告信息至指定的手机号码(图1)。
如何读取SIM卡的信息
设计SIM检测程序,关键是要读取SIM卡的信息。要做到这一步,就要用到上期讲的TAPI了。在TAPI中,使用lineGetGeneralInfo函数即可读取IMSI和IMEI。通过不同函数读取SIM卡,可以得到不同的效果(图2),掌握了这些函数在设计电话录、短信群发之类软件时就会得心应手。
小知识: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所示。
读者反馈
开发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期)