65.9K
CodeProject 正在变化。 阅读更多。
Home

用于控制手机的小工具

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.48/5 (9投票s)

2007年1月28日

5分钟阅读

viewsIcon

104396

downloadIcon

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 Gadget in action

好的,MobileControl正在运行,您迫不及待地想试试。首先,您需要知道手机正在与之通信的端口。我将向您展示如何通过蓝牙连接来找出它。打开“控制面板”,然后选择“Bluetooth 设备”。选择您的手机,然后单击“属性”按钮。在“属性”窗格中,转到“服务”选项卡。您会在那里找到所需的信息。

Find COM port

现在打开小部件的设置页面,然后选择正确的端口!

Select a port for the Gadget

好了,您的小部件已准备好与您的手机建立连接,请单击“连接”按钮!当此按钮的文本更改为“断开连接”时,小部件就可以发送命令到手机了。有两个文本框——小的是电话号码,大的是短信内容。号码和消息有一些限制。

  • 电话号码必须是国际格式(国家代码 + 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:首次发布

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.