WSP层在WTP之上,为WAP应用程序提供会话级的连接,处理客户端、服务器端数据的交互等功能。实际上,WAP在制定之初就以当时已非常流行的Internet/HTTP协议作为参考,因此WSP协议提供了HTTP/1.1的所有功能,包括CONNECT/GET/POST等命令,所不同的是WSP针对这些Header/Body进行了二进制编码,以减少数据包大小,换句话说,是实现了二进制版本的HTTP/1.1。此外,WSP还增加了一些无线应用的特殊功能,比如Push等。
TID(部分类型没有) |
PDU Type |
(根据Type可变) |
TID: 8-bit unsigned integer
PDU Type:8-bit unsigned integer
WSP层每个PDU都由一个TID字段和一个必需的Type字段构成,其后的内容根据不同的Type要求组成。
▲ Connect PDU
▲ ConnectReply PDU
▲ Redirect PDU
▲ Disconnect PDU
▲ Reply PDU
▲ Get PDU
▲ Post PDU
PDU Type对应的值列表如下:
类型名称 |
值 |
(保留) |
0x00 |
Connect |
0x01 |
ConnectReply |
0x02 |
Redirect |
0x03 |
Reply |
0x04 |
Disconnect |
0x05 |
Push |
0x06 |
Suspend |
0x08 |
Resume |
0x90 |
Get |
0x40 |
Post |
0x60 |
WSP PDU分析
▲ Connect PDU
Name |
Type |
Source |
Version |
8bit ungisnged int |
WSP Protocol version |
CapabilitiesLen |
变长unsigned int |
Capabilities长度 |
HeadersLen |
变长unsigned int |
Headers长度 |
Capabilities |
Octets data |
S-Connect Request Cap |
Headers |
Octets data |
S-Connect Client Headers |
▲ ConnectReply PDU
Name |
Type |
Source |
ServiceSessionId |
变长unsigned int |
Session_ID 变量 |
CapabilitiesLen |
变长unsigned int |
Capabilities长度 |
HeadersLen |
变长unsigned int |
Headers长度 |
Capabilities |
Octets data |
S-Connect Request Cap |
Headers |
Octets data |
S-Connect Client Headers |
Name |
Type |
Source |
URILen |
变长unsigned int |
Length of URI field |
URI |
Octets data |
URI内容 |
Headers |
Octets data |
|
▲ Reply PDU
Name |
Type |
Source |
Status |
8bit ungisnged int |
|
HeadersLen |
变长unsigned int |
Content和Headers字段的长度 |
ContentType |
Octets data |
|
Headers |
Octets data |
|
Data |
Octets data |
|
▲ Disconnect PDU
Name |
Type |
Source |
ServerSessionId |
变长 ungisnged int |
Session_ID变量 |
为了减少无线传输的数据通信量,WSP层传递的数据采取编码方式,把Header和Body内容都转换为二进制编码,通过二进制方式压缩数据包长度。
特别的,在Header部分,WSP定义了一系列二进制值对应表。请查阅WAP-WSP规范文档的附录A部分。
◆ WSP层的变长类型,在WSP层协议中,有很多字段是变长的。变长的类型是通过最高位来标记,即当最高位为1,则表示下一个字节仍然是连续的一部分,直到最高位为0的字节才结束。因此每个字节表示的值最高为127;
◆ WSP CONNECT PDU中,可以携带Capabilities和Headers可变字段。Capabilities字段用于协商一些通信机制,比如SDU大小,单个消息大小等等;Headers字段则用于表示Http协议中客户端可以接受处理的类型,比如Accept: text/html;
◆ 当WSP REPLY返回状态为3xx时,表示URL已经变更,客户端必须根据这个状态,解析REPLY PDU中的头部分,把重定向的URL提取出来,并自动重定向到新的URL;(由于Headers的解码较麻烦,目前我采取简单的处理方法,即只从Headers中获取http://开头的字符串)
◆ 在WSP REPLY返回的HTML Data中,如果WML内容含有” onenterforward” 和 <go href=> 之类的Tag,也需要进行直接重定向
上述的流程和组包方式,我在free download的Kannel WAP网关中都通过了测试,使用比较顺利,但是目前通过公网能访问的WAP网站不多。
当连接移动梦网wap网关时,主要有以下差别的地方:
◆ WSP CONNECT PDU,按照我原来的包内容被拒绝,从网上找了一些成功连接的包内容,也按同样方式进行组包,根据WSP的协议分析,好像不能合理解析,不知道是否是WAP2.0的问题,还没时间研究。具体发送的包如下:
unsigned char lsWSPPdu[]={
WSP_PDU_CONNECT, // PDU type
0x10, // Version 1.0
0x10, // Capability length
0x02, // Headers length =
// Capabilities
0x04, 0x80, 0x82, 0x81, //len, type, varint...
0x68, 0x04, 0x81, 0x82, //len, type, varint...
0x81, 0x68, 0x02, 0x84, //len, type, varint...
0x01, 0x02, 0x83, 0x01, //len, type, varint...
// Headers
0x80, 0x80 // Accept: *\*
};
◆ WSP REPLY PDU,移动梦网WAP网关针对GET返回的REPLY,其Data字段存储的内容是明文的ASCII码,无需再进行WML解码,这点需要留意,可能是WAP2.0的缘故吧。