创建 WAP Push 短信消息






4.54/5 (27投票s)
2004年6月10日
4分钟阅读

516518

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
。类WBXML
、WSP
和WDP
是不同协议层相关的常量和统计信息的持有者。以下代码演示了正文是如何生成的
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 字节,这是有意义的,如果有人能阐明这一点,我将不胜感激。