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

Pocket PC 2003 文件传输 - OBEX 方式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (13投票s)

2004 年 2 月 2 日

CPOL

4分钟阅读

viewsIcon

216841

downloadIcon

1106

一个从 OBEX 服务器拉取文件的示例应用程序。

引言

OBEX 是红外或蓝牙通信的标准,最适合小型设备,并且 PocketPC 平台支持它。为什么不将其用于简单的数据同步任务呢?

此示例应用程序连接到桌面(或服务器)上的 Obex-FTP 服务,检索服务器 Obex-FTP 根目录中特定文件夹的文件列表,然后拉取已修改的文件以与自己的数据库合并。

这样,服务器应用程序可以简单地将新信息写入此专用文件夹,客户端(我们的 PocketPC 应用程序)可以不时连接并同步。服务器可以是任何具有 Obex-FTP 服务器的设备(带有蓝牙适配器的台式机、另一台 PocketPC、Palm 甚至智能手机)。

背景

OBEX 服务器会发布一组客户端可以连接的“服务”。这些服务中最基本和默认的是 OBEX 收件箱(或 OBEX Object Push)。然而,此服务通常不允许从服务器拉取(或 GET)除预定义默认对象(如 vCard)之外的其他数据;因此,它不适合此示例的目的。

但是,OBEX FTP 服务具有我们所需的所有功能:获取文件和文件夹列表、获取、存储和删除文件等。所有支持此服务的 OBEX 服务器设备(无论它们使用红外还是蓝牙通信)都可以作为我们客户端的同步服务器。

还有其他 OBEX 服务,如 IrMCSync 或 SYNCML 甚至自定义 OBEX 扩展,可用于同步(您可以在 这里 下载 OBEX 规范),但它们都不如 FTP 方法简单且用途广泛。

使用代码

CObexFTP 类是对系统提供的 IObex 对象的封装;它用于检测范围内的适当设备并生成 CObexFTPConnection 实例,后者又封装了 IObexDevice 接口并添加了一些用于文件传输应用程序的有用方法。

通常,您将派生自己的类 CObexFTP 并重写虚拟函数 OnDeviceArrived 以连接到该设备并执行文件传输操作。同样,您可以重写函数 OnDeviceRemovedOnDeviceChanged,它们仅在您有活动连接时才会调用,并且可能最好在相应的 CObexFTPConnection 对象中重写。

成功初始化实例后(参见 CObexFTP::Initialize()),您可以调用函数 StartDeviceEnumeration()StopDeviceEnumeration() 来开始/停止通过上述虚拟函数接收异步通知。

通常,在重写 OnDeviceArrived 时,您将创建一个 CObexFTPConnection 对象(或派生类)并调用 Connect 方法。由于此方法将指针保存在链表中,因此在调用 Disconnect 之前不应删除该对象!

OnDeviceArrived 的参数是指向标准 IPropertyBag 对象的指针;如果您在接受连接之前需要有关设备的更多信息,辅助类 CObexDeviceProperties 可能会很有用。

//
// Sample override of OnDevicedArrived
//
void CMyObex::OnDeviceArrived(IPropertyBag *Props)
{
  CObexDeviceProperties DevProps(Props);
  if (0==wcsicmp(DevProps.GetName(),L"ServerName"))
  {
    CMyObexConnection *pConn=new CMyObexConnection;
    if (pConn->Connect(this,Props))
    {
      // ... work with it
      pConn->Disconnect();
      delete pConn;
    }
  }
}

示例应用程序

此示例应用程序使用 WTL7.1,它内置了 CE 支持(您可以直接从 Microsoft 免费下载),因为 OBEX 类反正会使用 ATL。

它只需连接到第一个到达的 FTP 服务器,切换到“SampleFolder”文件夹,并在列表中显示自上次同步以来已更改的所有文件名。

如果您想尝试一下(例如,使用运行 WIDCOMM 蓝牙堆栈的桌面服务器),您需要在服务器的 FTP 目录中创建该文件夹并放入一些文件。

您需要嵌入式 Visual C 4.2 和 PocketPC Platform SDK 来编译源代码;对于示例项目文件 (PocketObex.vcp),您还需要安装 WTL7.1 并将其集成到 eVC 中。

注意事项

我在 T-Mobile MDA-II(也称为 O2-XDA-II 或类似名称)上开发和测试了这些类和示例应用程序。这似乎是第一款内置 Microsoft 蓝牙堆栈的设备,大多数其他供应商似乎都使用 WIDCOMM 堆栈。我怀疑 Microsoft 的 OBEX 支持是否能很好地与 WIDCOMM 堆栈集成,但我很乐意听到相反的说法(:。

顺便说一句:如果您有一台 MDA-II(这是一台很棒的设备!),并且想知道为什么即使在最新的固件升级后,您的设备上仍然没有 OBEX-FTP 服务器:这只是因为有人(Microsoft?HCT?T-Mobile?O2?)决定不安装它。如果您只是在 Microsoft WINCE-420 中编译示例并在注册表中添加一些值,它就可以工作。

未解决的问题

这些类目前不关心身份验证;如果您连接服务器时遇到问题,请确保在服务器端关闭 FTP 服务的“安全连接”或类似功能。

如果您需要传输大量数据,最好提供某种进度指示器和一个取消按钮。

历史

  • 2004 年 1 月:首次发布。
© . All rights reserved.