用于控制手机的小工具






3.48/5 (9投票s)
2007年1月28日
5分钟阅读

104396

2153
一篇关于创建Vista侧边栏小部件的文章,该小部件通过串行(COM)端口与手机通信/控制手机。
目录
引言
自从我拥有第一部手机以来,我一直梦想着从PC上发送短信。当我第一次找到一个能做到这一点的程序时,我感到无比高兴——再也不用在手机的小键盘上打字了。一周前,我在网上看到了一篇关于Vista小部件的文章。读完文章后,我脑海中闪过一个念头:“嘿,也许我能做点有用的事情。也许我能做一个能够发送短信的小部件……”我试了一下,结果就是MobileControl
小部件。
注意:我假设您至少对Vista小部件有所了解,我不会写如何创建一个小部件,而是写我是如何制作“这个”小部件的。
注意:主要目标是创建一个短信发送器。通话控制功能是实验性的,因此可能存在一些问题。实际上,我知道一个问题:在某些手机上,使用小部件挂断来电后会拨打语音信箱。我不知道原因,但我希望有解决方案。
使用小部件
有了这个小部件,您可以发送消息、发起/挂断电话;来电也会显示。但请稍等片刻——您还没有安装它。因此,双击MobileControl.zip中的MobileControl.Gadget文件,Vista就会为您安装该小部件。它甚至会将其添加到侧边栏——去把它移除掉。为什么?因为您必须注册ATCommandHelper.dll,这是这个小部件的核心。从小部件的bin目录(%USERPROFILE%\AppData\Local\Microsoft\Windows Sidebar\Gadgets\MobileControl.Gadget\bin)打开命令提示符,然后输入以下命令:regsvr32 ATCommandHelper.dll
。好了,各位,小部件已安装!
如果您还没有这样做,请将小部件添加到侧边栏!这是MobileControl
运行时的图片——您应该看到类似的东西。
好的,MobileControl
正在运行,您迫不及待地想试试。首先,您需要知道手机正在与之通信的端口。我将向您展示如何通过蓝牙连接来找出它。打开“控制面板”,然后选择“Bluetooth 设备”。选择您的手机,然后单击“属性”按钮。在“属性”窗格中,转到“服务”选项卡。您会在那里找到所需的信息。
现在打开小部件的设置页面,然后选择正确的端口!
好了,您的小部件已准备好与您的手机建立连接,请单击“连接”按钮!当此按钮的文本更改为“断开连接”时,小部件就可以发送命令到手机了。有两个文本框——小的是电话号码,大的是短信内容。号码和消息有一些限制。
- 电话号码必须是国际格式(国家代码 + 9位数字)。
- 短信长度不能超过160个字符。
- 短信内容只能包含ASCII字符。
它是如何工作的?
Vista侧边栏小部件基本上是HTML页面,带有一些JavaScript/VBScript。我既不熟悉它们。我更熟悉C#,当然也可以在小部件中使用ActiveX控件。因此,道路就在我面前,我只需跟随它——我用C#将我的“短信发送器”写成一个UserControl
DLL,然后将其嵌入到一个简单的HTML中。
用C#编写ActiveX控件
这项任务非常简单——您只需在Visual Studio中创建一个新的Windows控件库项目。该控件必须有一个唯一的ID,并且必须是COM可见的。这可以通过在Control
类之前的这两行代码来实现。
[Guid("69950A2F-CE2D-4378-867B-524CA2E320CB")]
[ComVisible(true)]
public partial class ATCommandControl : UserControl
{
可以使用Microsoft的GUIDGen程序或此网页生成GUID。就是这样。现在,您可以在小部件的HTML的body
部分使用这些行将控件嵌入小部件中。
<object id="ATCommandHelper"
classid="clsid:69950A2F-CE2D-4378-867B-524CA2E320CB" />
好的,就这样,控件已嵌入小部件中。现在,您可以通过获取控件作为一个对象,然后简单地调用方法,从JavaScript调用控件的任何public
函数。
var o = document.getElementById("ATCommandHelper");
o.SetPortName(portName);
AT命令和PDU格式
AT命令用于通过串行连接控制手机/调制解调器。这些命令存储为string
,在发送到手机之前,它们被转换为字节数组。通信完成后,字节数组被写入端口。手机接收命令并执行相应的操作。这是将string
command
发送到COM端口port
的代码。变量endChar
是“命令结束”字符——它可以是ENTER(13)
或CTRL-Z(26)
。
// Store the AT command in a byte array
byte[] data = new byte[command.Length + 1];
for (int i = 0; i < command.Length; i++)
{
data[i] = (byte)command[i];
}
data[command.Length] = endChar;
if (port.IsOpen) // If port is open...
port.Write(data, 0, command.Length + 1); // ...send command.
else // Else: error message.
{
OnError("Please check, that your phone is correctly connected to the PC,
and you've selected the proper COM port!");
}
短信以PDU格式发送,因此需要进行另一项转换。如果您想了解更多关于PDU格式的信息,我推荐此页面。转换发生在我的源代码中的string SeptetsToOctets()
和string ConvertMessageToPDUFormat()
函数中。我假设,在阅读完上述页面并检查我的源代码后,PDU的事情就会一目了然。
Settings.html的一个小技巧
您可能已经注意到,小部件文件夹中没有Settings.html,而是有一个Settings.html.template。为什么?那是什么.template文件?嗯,我之前提到过,我对JS不太熟悉,因此我不知道如何将一个string
数组从控件传递给Settings.html。我想要传递的数组包含系统中现有COM端口的名称,所以我真的需要它来填充Settings.html上的端口组合框。所以我编写了一个模板Settings.html,其中包含一个空的端口列表。ATCommandHelper
构造函数中的WriteSettingsHTML()
函数逐行读取该模板到缓冲区,将端口名称信息附加到它,然后将缓冲区写入Settings.html文件。也许这不是最优雅的解决方案,但它有效。
参考文献
历史
- 2007.01.29:首次发布
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。