置备移动设备 摘抄自——平步青云”—一个专为开发移动设备而设的新专栏

欢迎来到“平步青云”—一个专为开发移动设备而设的新专栏。本专栏涵盖任何与移动性相关的主题,重点介绍的是 Windows Mobile® 电话和 Tablet PC。
我叫 Mike Calligaro,在 Microsoft 从事开发工作已有 14 年。除了在 Windows® Desktop Group 两周指定的工作之外,我其余的时间全部投入了 Windows Mobile 部的工作中。我曾参与过多种产品的开发,包括早期版本的交互式电视、Sega Dreamcast 以及 Windows CE 操作系统。过去的八年中,我主要负责开发 Windows Mobile 的各个部件。
今 天,我将介绍如何以编程方式配置 Windows Mobile 设备(或者用那些喜欢摆弄文字的人们的话说是“置备”)。如果您是一位 IT 经理或技术支持人员,在手动为您的用户配置 Windows Mobile 设备,那么请先停手。本文会让您受益匪浅。如果您是一位移动应用程序开发人员并能够使用简便的方法将 Web 页面添加至浏览器的收藏夹,它对您也会有所帮助。
先来做个假设,如果我告诉您使用几行代码和一些 XML,就可以建立 VPN、设置设备的日期和时间、配置电子邮件帐户、向设备添加文件、设置电话铃声、更改注册表项以及诸多其他功能,您会做何感想?您想付多少钱得到这一切?一百万美元?两百万美元?在《MSDN® 杂志》的这期特刊中,您几乎不必花什么费用,这些功能就会垂手而得。没错,免费。现在已万事俱备,大家先下手为强。
希望我的开发能力比销售能力更胜一筹。严格地说,置备 API 是标准 Windows Mobile SDK 的一部分,后者可以从 Windows Mobile 开发人员中心免费下载,网址为 msdn.microsoft.com/windowsmobile

 

为什么要置备?
虽 然 Windows Mobile 这一名称问世甚晚,但 Mirosoft 在 2002 年就针对移动电话发布了第一个平台。电话时代的降临预示着许多移动运营商希望而又倍感新奇的事情将成为现实,如能够远程配置设备。现在,在隶属 2002 这一年代的电话上进行配置已不多见,但是我们需要支持这种基本级别配置,以提高竞争力。具备了合适的基础结构后,就能便捷地完成许多远程配置。
例 如,在我的工作中,要使用多部电话和众多版本的操作系统。在开发过程中,由于有时情况多变,我不得不在一天内多次设置各种电话。即使一切都运行得井然有 序,对我来说一周配置至少一部电话也是家常便饭。因此,我不是手动键入 Exchange Server 地址并设置电话铃声,而是将它们组合成 XML blob,由它完成大部分设置工作。我在存储卡上保存了 XML 文件和一个小处理程序。这样,当别人让我试用新电话时我始终能有所准备。
将 Penny Arcade 设置为浏览器收藏夹绝不是移动运营商的要求,这一点我保证,不过,能够在这种情况下运用“挥洒自如”还是让我倍感欣慰。
要令此配置发挥功效,只要一个 API (DMProcessConfigXML) 和一些 XML 就足够了。例如,假设您想要将 Live Search 设置为浏览器收藏夹。以下所示的 XML 是代码的开头:
// WAP provisioning XML to add a new browser favorite.
LPCWSTR g_wszFavoriteXml =
L"<wap-provisioningdoc> "
L" <characteristic type=""BrowserFavorite""> "
L" <characteristic type=""Live Search""> "
L" <parm name=""URL"" value=""http://m.live.com/""/> "
L" </characteristic> "
L" </characteristic>"
L"</wap-provisioningdoc>";
使用 XML 设置收藏夹所需的全部代码如下所示:
HRESULT AddFavorite() {
HRESULT hr = E_FAIL;
LPWSTR wszOutput = NULL;

// Process the XML.
hr = DMProcessConfigXML(g_wszFavoriteXml,
CFGFLAG_PROCESS, &wszOutput);

// The caller must delete the XML returned from DMProcessConfigXML.
delete [] wszOutput;
return hr;
}
为节省空间,我在这里做了一些简化。在您自己的代码中,您应该执行安全和错误检查。而且,您更有可能从文件读取 XML 而不是将其编译到您的代码中。但是,简言之,这就是您需要执行的操作。
还有一个用于 DMProcessConfigXML 的托管包装。.在 C# 中,您可以使用 ConfigurationManager.ProcessConfiguration。下面是 C# 中的相同代码:
XmlDocument configDoc = new XmlDocument();
configDoc.LoadXml(
"<wap-provisioningdoc>"+
"<characteristic type=""BrowserFavorite"">"+
"<characteristic type=""Live Search"">"+
"<parm name=""URL"" value=""http://m.live.com/""/>"+
"</characteristic>"+
"</characteristic>"+
"</wap-provisioningdoc>"
);
ConfigurationManager.ProcessConfiguration(configDoc, false);

 

配置服务提供程序
DMProcessConfigXML 将它收到的 XML 发送至不同的配置服务提供程序 (CSPs)。这些提供程序读取 XML 并对其进行处理。如果不支持某种您想更改的配置,可能是我们尚未为其编写 CSP。如果您发现对我们有用的新 CSP,我们将非常乐于听取您的看法。
CSP 的权威性列表可从 msdn2.microsoft.com/bb737536.aspx 获得。此外,还可从 msdn2.microsoft.com/bb737572.aspx 获得多个 XML 示例。
遗 憾的是,在 CSP 的可用性方面,Windows Mobile Professional (Pocket PC) 电话与 Windows Mobile Standard (Smartphone) 电话之间仍存在差异。您会发现某些 CSP 在 Standard 中可用,但在 Professional 中却不可用。(不过,这种戏剧性的情况对我们毫无影响。)我们正向着将来能够统一平台的方向努力。此外,OEM 和移动运营商能够有选择性地禁用 CSP 以锁定他们不想更改的功能。为安全起见,应该始终测试任何您计划在您认为支持的电话上部署的配置。
需要一些示例吗?首先为您显示一个用于设置时区并打开警报的 XML blob,设置如下:
<wap-provisioningdoc>
<characteristic type="clock">
<parm name="TimeZone" value="4"/>
<parm name="AlarmOn" value="1"/>
<parm name="AlarmTime" value="06:30:00Z"/>
</characteristic>
</wap-provisioningdoc>
特征类型告诉您它使用 Clock CSP。每个 CSP 都具有一个 MSDN 页面,用于描述您可以更改的参数以及每个参数可能的变动值。例如,Clock CSP 文档的网址是 msdn2.microsoft.com/bb737261.aspx,它描述了 TimeZone、AlarmOn 和 AlarmTime 以及该示例中未出现的两个参数(日期和时间)的可能值。
请务必阅读分配给参数的正确值的文档。我相信一定有人会了解它们的含义,但象我这样的普通人可能不会。例如,GMT -8 的 TimeZone 值是 4,而 GMT -5 的 TimeZone 值是 35。这就得动脑筋琢磨了。
图 1 显示了 Sync CSP 的一些处理示例。(请注意,Sync 提供程序的文档可以从 msdn2.microsoft.com/bb737700.aspx 获得。)正如您所见,您可以选择要同步的数据、同步起始位置、同步频率等等。与您可以使用该提供程序配置的同步相关的参数约有 50 个。
虽然这些示例仅涉及了一些皮毛,但希望它们能让您了解 CSP 的工作原理。

 

将 XML 应用于设备
您已将一些有用的 XML 组合到了一起,并编写了一个可打开 XML 文件并将数据发送至 DMProcessConfigXML 的小应用程序。但首先要将 XML 和应用程序应用到设备,然后才能执行置备。
会为您提供一些选项。最简单的方法是将文件和应用程序放在一张存储卡上,将卡插入设备,然后使用“文件浏览器”运行应用程序。这就是我配置设备使用的方法。
但是如果您是一名负责配置数百台设备的 IT 经理,又该怎么办呢?启动“文件浏览器”和导航至应用程序的其他步骤需要很长时间。在这种情况下,插入存储卡后您可以让配置应用程序自动运行。
在 存储卡的根目录下创建名为 2577 的文件夹(莫问根由)并将您的配置应用程序放入该文件夹。将应用程序命名为 autorun.exe。如果应用程序自动打开标准 XML 文件名(例如,config.xml),那么插入存储卡就可以配置设备了。“自动运行”还会随着设备启动发挥功效,因此即使电话需要您取下电池来插入存储 卡,它还是会正常工作。
当然,还有更多选项可供选择。 如果在初始设置完成后,您计划对您的设备进行进一步的配置,可以将配置应用程序置入设备并为其添加扩展名。然后您可以用电子邮件将具有相关扩展名的配置文 件发给用户。这样用户只需打开附件中的配置文件即可配置他们的设备。此外,用户还可以浏览至网站来下载配置文件。
还可以使用 PushRouter 通过 SMS 将无线应用协议 (WAP) 配置文件发送至设备。尽管 PushRouter 不在本文谈论范围之内,但这是移动运营商将配置文件发送至其网络电话的方式。
如 果您是一家独立软件供应商 (ISV),您可以从设置程序内部使用 CSP 进行任何必要的设备配置,包括添加文件、更改注册表项、添加浏览器收藏夹、更改主页屏幕等等都可实现。配置格式的简化也使为卸载程序(撤销安装程序所完成 的操作)搭配 XML 文件变得十分便捷。
如果您通过 ActiveSync® 或 Windows Mobile Device Center 连接设备,不必置入任何文件就能配置设备。桌面工具 rapiconfig.exe 位于 Windows Mobile SDK 的工具目录下。该工具将读取 XML 文件并使用 RAPI 配置当前连接到 ActiveSync 的设备。连接设备后,转入 SDK 中的工具目录并(假定将 XML 文件命名为 config.xml)键入以下内容:
rapiconfig config.xml
有关 RapiConfig 的详细信息,请参阅 msdn2.microsoft.com/bb737541.aspx
最后,您可以创建一个 CAB 或 CAB 置备格式 (CPF) 文件。CAB 和 CPF 都可以复制到设备中,并且无需运行程序即可直接执行。使用桌面工具 makecab.exe 创建这两种文件,Windows Mobile SDK 中也有这个工具。
CAB 和 CPF 文件之间的主要区别在于 CPF 在执行期间(无提示运行)不会打开任何对话框。这也是 CPF 的主要缺陷。CAB 和 CPF 可能需要显示对话框,询问用户是否确定要置备设备,具体视设备上的安全设置和文件是否已签名而定。因为要求 CPF 无提示运行,所以无法显示该对话框。也无法向用户提问。最后,如果您打算签署配置文件,请使用 CPF。否则,请使用 CAB。
实 现任何一个都非常简单。只需将正常的 XML 文件传递至 makecab 并为输出文件适当命名即可。必须将 XML 文件命名为 _setup.xml,请牢记这一特性。如果您以其他名称命名,makecab 不会有问题,CAB 或 CPF 文件也能正常生成,但当您尝试使用它时将出现含糊错误,导致失败。请注意,文件中并未很清楚地说明这一问题。
生成 CAB 文件的语法为:
makecab _setup.xml config.cab
与 XML 文件不同,对生成的 CAB 文件的名称没有这类限制。例如,除了 config.cab 之外, 您还可以为生成的 CAB 文件选择任何您想要的名称。同样,生成 CPF 文件的语法如下:
makecab _setup.xml config.cpf
仍使用任何您所需的 CPF 文件名代替 config.cpf。就是这样的,两者之间唯一不同的是输出文件的名称是 .cab 还是 .cpf。再次重申,上述两种情况中均必须将 XML 文件命名为 _setup.xml。
有关 CPF 文件的详细信息,请转到 msdn2.microsoft.com/bb737689.aspx,有关签署 CPF 文件的详细信息,请转到 sdn2.microsoft.com/bb416436.aspx

 

谁想要键入 XML?
手动键入 XML 非常适用于技术精湛的 IT 专业人员,但如果想让您的用户从一组选项中选择自己的配置,又该怎么办?设计一个网站,上面有大量复选框和可用的配置,这个想法很酷吧?用户浏览至站点,选择他们需要的内容,然后生成 XML 文件。
为满足这种需要,Microsoft® .NET Framework 提供了 XmlDocument 类,从而能轻松通过编程生成 XML。例如,还记得前面提到的时钟 XML 吗?图 2 中的代码动态创建了这个 XML。
CreateRoot、 CreateCharacteristic 和 CreateParm 都是可以大规模转移的帮助程序函数。然后只需生成自己的 CreateXML,用它调用这些函数即可。本示例对参数信息进行了硬编码,但在 Web 页面中,值取自用户的 UI 选项。生成 XML 后,网站将其下载到设备中,供用户运行。
可以想象,您还能编写在设备上运行的配置应用程序。用户选择了合适配置后,类似图 2 中所示的代码会生成 XML 并将其直接发送给 ConfigurationManager.ProcessConfiguration。这样,您就无需逐步完成将 XML 发送到文件然后再重新读取这一过程。

 

置备完毕,尽可使用
如果您曾不得不使用电话上的数字键盘来输入 Exchange Server 地址,您就需要想办法编写 XML 并改用舒适的桌面键盘。没有人愿意忍受输入之苦。我希望这篇文章能为您带来曙光和希望。愿置备为您带来快乐体验!

posted on 2008-06-12 17:12  老孙  阅读(371)  评论(0编辑  收藏  举报

导航