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

与手机进行红外通信

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (81投票s)

2003年1月22日

CPOL

7分钟阅读

viewsIcon

1270191

downloadIcon

3731

学习如何让你的 Pocket PC 与你的手机进行通信。

Sample Image

引言

我的英语不太好,希望大家能理解这篇文章。如果还有疑问,我很乐意解答。如果有人发现错误,请将正确的文本发给我 - 感谢您帮助我提高英语水平 ;-)

为了数据交换,大多数新型手机和 Pocket PC 都配备了红外(IRDA)端口。那么,为什么不利用这种红外连接来沟通这两个设备呢?

这款简单的 Pocket PC 2002 应用程序展示了如何与您的手机进行通信,它将读取您手机的制造商、型号识别信息以及电话簿内容到您的 Pocket PC。

我用我的 HP jornada 565 上的 Pocket PC 应用程序只测试了诺基亚 5210、我的新西门子 S55 和一款非常老的西门子 S25 手机。所以,我希望这款应用程序也能适用于其他手机。

如何与手机通话?

要与您的手机通信,您必须使用一些特殊的命令,称为 AT 命令。您需要通过 Pocket PC 的 IRDA 端口将这些命令发送到手机,手机会给您回应。如果手机支持收到的 AT 命令,它会发送一个有效的响应给您,否则它会发送一个错误响应。

AT 命令具有通用结构,例如,请看下图

AT command

<CR> ... 回车符

此命令用于请求手机的制造商识别信息。例如,诺基亚 5210 将会给您以下响应

AT response

<CR> ... 回车符
<LF> ... 换行符

如果手机不支持收到的 AT 命令,它将向您发送一个错误响应

AT error

<CR> ... 回车符
<LF> ... 换行符

您可以在以下网站找到关于 AT 命令的详细文档

代码

该应用程序是一个简单的基于对话框的 MFC 应用程序,包含一些简单的 API 调用。

对于红外通信,我编写了一个名为 CIrdaPort 的简单类。该类支持一些打开和关闭 IRDA 端口的函数以及一些读写操作的函数。

UML class diagram

要打开 IRDA 端口,请使用以下函数

BOOL CIrdaPort::Open(UINT uiPort);

此函数将打开 IRDA 端口,uiPort 参数定义了 IRDA 端口的索引(1 代表 COM1,2 代表 COM2,3 代表 COM3)。返回值 TRUE 表示成功,FALSE 表示失败。

您可以使用以下函数在注册表中查找 IRDA 端口的索引

UINT CIrdaPort::FindPortIndex();

如果该函数在注册表中找到 IRDA 端口的索引,则返回该索引,否则返回值是 0

如果您想向 IRDA 端口写入一些字符,可以使用以下函数

BOOL CIrdaPort::Send(const CString& strSend) const;

此函数将字符串 strSend 发送到手机。返回值 FALSE 表示失败,TRUE 表示成功。

要等待响应,可以使用以下函数

BOOL CIrdaPort::WaitForResponse(CString& strResponse, DWORD dwTimeout) const;

此函数等待手机的响应 strResponse,或者如果超时 dwTimeout 发生则返回 FALSE

如果您完成了所有读写操作,则必须使用以下函数关闭端口

void CIrdaPort::Close();

此函数将关闭 IRDA 端口。

当您单击对话框上的“读取...”按钮时,应用程序会尝试连接到手机并读取有关手机的一些信息,例如制造商和型号识别信息(例如:Nokia Mobile PhonesNokia 5210SIEMENSS55)。之后,它会尝试读取您手机的所有电话簿条目,并将其显示在对话框的列表框中。

别忘了激活您的手机红外端口!

在测试您的 Pocket PC 和手机之间的通信之前,您必须激活您手机的红外(IRDA)端口。大多数手机都有自己的菜单项来激活红外端口。例如,对于诺基亚手机,您需要选择菜单 -> 红外。激活红外端口后,您将在诺基亚手机显示屏的左上角看到以下符号 IR symbol,这表明红外端口已启用。

一些手机,如诺基亚手机,如果在红外连接上没有数据交换,会在几分钟后禁用红外端口。因此,在开始通信之前,请查看您的手机,并在必要时重新激活红外端口。同时也要确保您的 Pocket PC 和手机的红外传感器之间有直接连接,并且两个设备之间没有任何可以阻止通信的障碍物。

Pocket PC 和手机之间的蓝牙连接

发布此文章后,我收到了许多关于如何通过蓝牙连接 Pocket PC 和手机的问题。由于我目前没有蓝牙手机或蓝牙 Pocket PC,我无法亲自测试,但 João Paulo Figueira 进行了测试并找到了答案。

将通信端口的名称从 COMx: 更改为 BTC1: 并注释掉以下行

VERIFY(SetupComm(m_hPort, 2048, 2048));

还可以将端口速度提高到 115200

João Paulo Figueira 还找到了存储端口名称的注册表项,但他不知道这是否是标准。因此,如果您有关于此的信息,请将其发送给我或 João Paulo Figueira,那将非常有帮助。

他找到的存储端口名称的注册表项是 HKEY_LOCAL_MACHINE\ExtModems\BtDialupModem

相关链接

如果您在使用示例应用程序时遇到问题,或者需要有关 Pocket PC 上 RAW 红外通信的更多信息,请查看 Ruud en Frida Vermeij 的主页,网址为 http://vermeij.filternet.nl/programmer/rawir.html。在这个网站上,您可以找到关于 Pocket PC 上 RAW 红外通信的许多有用技巧。

如果您对 Pocket PC 和桌面 PC 设备上的红外 Winsock 通信 (IrSock) 感兴趣,请查看我在 Pocket PC Developer Network 上的 IRDA 文章。这篇文章将演示如何轻松地将红外支持集成到您的 Windows 应用程序中。它提供了一个小的服务器/客户端示例,您可以借助它将消息从您的 Pocket PC 应用程序发送到桌面 Windows 应用程序。您可以将此示例作为您自己的应用程序的基础,这些应用程序将提供能力,从您的应用程序中直接与其他设备交换数据。

IrdaMobile 在普通 Windows 操作系统(Windows 2000 或 XP)下

自今年一月我发布这篇文章以来,论坛和邮件中最常被问到的问题之一是如何在普通 Windows 操作系统(如 Windows 2000 或 XP)下实现此示例应用程序。

Sample Image

所以,现在我花时间在普通 Windows 操作系统(如 Windows 2000 或 XP)下实现了本文的示例应用程序。

现在,您可以在本文顶部下载适用于普通 Windows 操作系统的 IrdaMobile 应用程序的可执行文件以及完整的源代码。

要在您的普通 Windows 操作系统(Windows 2000 或 XP)下运行示例应用程序,您只需要一个虚拟 COM 端口驱动程序,例如 IrCOMM2k(Windows 2000/XP 的虚拟红外 COM 端口)。IrCOMM2k 是一个适用于 Windows 2000 和 XP 的驱动程序,它模拟一个串行端口,可用于通过 IrDA 与移动设备交换数据。有关此主题的更多信息,请查看此驱动程序的“技术细节”,网址为 http://www.ircomm2k.de/

错误和评论

如果您有任何评论或发现任何错误,我很乐意收到并改进代码。

发布历史

  • 18.12.2003

    为普通 Windows 操作系统(Windows 2000 或 XP)添加了 IrdaMobile 示例。

  • 31.10.2003

    CIrdaPort::FindPortIndex() 函数进行了一些更改。

  • 14.09.2003

    向文章中添加了“Pocket PC 和手机之间的蓝牙连接”部分(感谢 João Paulo Figueira)。

  • 09.09.2003

    修正了 CIrdaPort::FindPortIndex() 函数的错误实现(感谢 Ruud en Frida Vermeij)。

  • 24.01.2003

    从源代码档案中删除了 APS 文件(感谢 Johann Gerell)。

  • 22.01.2003

    在 CodeProject 中首次发布。

© . All rights reserved.