Pocket PC 2003 文件传输 - OBEX 方式
一个从 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
以连接到该设备并执行文件传输操作。同样,您可以重写函数 OnDeviceRemoved
和 OnDeviceChanged
,它们仅在您有活动连接时才会调用,并且可能最好在相应的 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 月:首次发布。