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

创建 WAP Push 短信消息

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (27投票s)

2004年6月10日

4分钟阅读

viewsIcon

516518

downloadIcon

3628

如何生成 WAP Push 短信以向移动电话发送内容。

引言

WAP Push 短信广泛用于向移动电话推送和弦铃声和壁纸图像。然而,正如你将看到的,它们也提供了一种引人注目的方式,可以将人们引导到 WAP 网站,而无需在运营商的 WAP 门户上可见。

本文介绍了一组 C# 类,它们可以生成一条短信,指示移动设备浏览到指定的 URL。

指令设备

WAP Push 短信可以包含多种不同的正文,所有这些正文都旨在实现略微不同的结果。我们感兴趣的是服务指示。这是一个 XML 文档(DTD 在此),其中包含要让手机浏览的 URL。例如

<si>
  <indication href="http://wap.yahoo.com/" action="signal-high">
    A WAP Push to the Yahoo site
  </indication
</si>

在移动世界中,带宽和可靠的连接都非常宝贵,因此将此消息发送到设备的方法需要可靠且紧凑。XML 有许多优点,但紧凑性并非其中之一。这时就轮到短信WBXML了。

短信是一种可靠的(取决于服务提供商)存储转发机制,用于向移动设备发送消息。它的用途不仅限于人与人之间的交流。它驱动着语音邮件提醒、手机配置、MMS 通知以及我们期望从移动网络获得的各种其他功能。问题在于,它仅限于 140 字节的数据。

WBXML 是 XML 的二进制格式,可以实现紧凑传输,同时仍保留 XML 文档的结构和内容。设备内置了对某些 XML DTD 的知识,这些 DTD 能够被解析和理解。

实现这种紧凑性的一种方法是为每个 DTD 保留一个标签代码空间。发送的不是完整的标签名称,而只是一个字节值来指示标签的存在和位置。服务指示 DTD 的标签代码空间如下所示

Tag 字节值
si 0x05
indication 0x06

另一种方法是用字节值替换常用属性和已知值。在indication标签的action属性的情况下,该属性指示设备在收到此消息时应尝试的中断级别,这些值为:

Attribute 字节值
action="signal-none" 0x05
action="signal-low" 0x06
action="signal-medium" 0x07
action="signal-high" 0x08
action="signal-delete" 0x09

使用这些方法可以将 XML 文档压缩到足以通过短信传输到目标设备。有关服务指示的完整描述,请参阅WAP Forum上的Open Mobile Alliance网站部分。

推送指令

现在,已经编码了服务指示形式的指令,就需要将数据打包成一条短信。这需要将另外两个协议层包装在指令周围,以便收件设备能够正确读取。

第一层是 WSP(无线会话协议)。这类似于有线世界中的 HTTP,其中一系列头部描述了包含的内容。与 WBXML 编码的服务指示一样,这些实际上是通过众所周知的字节值传输的,以节省带宽。WAP Push 消息中使用的头部为:

  • CONTENT-TYPE
  • CONTENT-LENGTH
  • APPLICATION-TYPE

最后是 WDP(无线数据报协议)。对于熟悉向诺基亚手机发送 VCard、铃声、运营商图标等智能消息的各位来说,这就是 UDH(用户数据报头)。它包含一个信息元素,描述了手机上的目标端口。这由手机用来决定在收到此消息时应启动哪个应用程序。在本例中,是 WAP 浏览器。

一旦所有层都到位,您现在就有一系列字节需要提交给手机。

使用代码

核心类包括负责创建推送内容的ServiceIndication;以及负责通过包装其他协议层来生成完整消息的PushMessage。类WBXMLWSPWDP是不同协议层相关的常量和统计信息的持有者。以下代码演示了正文是如何生成的

string href = "http://wap.yahoo.com";
string text = "A WAP Push to the Yahoo site";

PushMessage message = new PushMessage(href, text);
HexDecoder decoder = new HexDecoder();

string body = new string(decoder.GetChars(message.GetSMSBytes()));

我包含了一个我们内部使用的HexDecoder类,用于将字节数组转换为十六进制字符串。

一旦消息正文创建完成,就可以使用连接到 PC 串行端口的手机,或者像这个一样的短信 Web 服务来发送消息,这是一个简单的过程。

关注点

发送此类消息给手机的最大好处是,如果手机不理解它们,它们就会忽略它们。这使得调试成为一场噩梦。

我从 OMA 网站上的服务指示规范开始,但发现现有的手机并不那么新。为了让它工作,我不得不删除创建和过期属性,并将版本号降至 1.1。

ServiceIndication类以相当程序化的方式进行 WBXML 编码。尽管我很想编写一个通用的 WBXML 编码器,但 XP 经验告诉我们,简单就是好;)

WSP 头部中的内容长度字节设置了高位,这表明内容限制在 128 字节。考虑到可用的 140 字节,这是有意义的,如果有人能阐明这一点,我将不胜感激。

© . All rights reserved.