http://blog.csdn.net/suvi/article/details/6566276
此文的依据是EMPP v2.0的协议,因为原有协议上的描述并不清晰,所以在此补充如下:
数据格式定义详解
1. Octet string
C#中,Octet string 就是一个 byte[]数组,一般可以通过Encoding.ASCII.GetBytes(string) 来获得
2. 字节顺序
在Socket中,使用byte buffer传输数据时,必须对int,uint 等超过2个byte的整形进行传输字节调整,可以通过调用
IPAddress.HostToNetworkOrder进行转换,也可以通过指针进行转换
同理,从socket中获取的buffer,在转换回整形是,仍需要使用IPAddress.NetworkToHostOrder进行调整
3. EMPP_CONNECT中的 AuthenticatorSource
AuthenticatorSource 使用的是 md5一组数据,这组数据的初始化,是根据
AccountId string类型,非Octet string +
9个二进制0 +
Password string类型 +
MMddHHmmss string类型的日期串
组成的 Octet string
也可以分别取各部分的string的 Octet String, 合并后再进行md5
4. EMPP_ACTIVE_TEST
EMPPv2.0文档中建议的心跳包设置为
间隔时间 C = 3分钟
超时时间 T = 5秒
超时次数 N = 3次
可是实际应用中,当客户端1分钟无数据发送的话, EMPP服务端就做了拆线,收到 TCP:Flags: AF 标志
所以实际的应用中, 应该使用每分钟发送一次检测包
5. EMPP_SUBMIT 长短信的设置
EMPPv2.0中关于长短信的格式设置没有做详细说明,要完成长短信,必须设置如下内容:
Ø Tp_udhi 必须为1
Ø Msg_fmt 必须为 08 (UCS2编码)
Ø MsgContent 必须在头部增加6个字节的长短信标志位:
0x05 udhi 协议的体长度,可以为 05(6个字节的tp_udhi 协议)和 06(7个字节的协议),本系统采用的是6字节的udhi协议
0x01 参见 GSM 03.40 规范中 9.2.3.24.1,表示随后的这批长短信的标识位长度,取值为1,
0x03 表示剩下的短信标识的长度
0x00 短信的唯一标志,可以忽略之
0x02 长短信分割的数量, 2表示分成2段;4表示分成4段
0x01 长短信中的第几段
6. EMPP_DELIVERY
当通过短信平台发送短信时,SMSC发送完毕,且客户端接收(仅仅检测到观看时的状态)到后,SMSC向SP发送了此状态报告,以表明用户已经观看了。更详细的信息,可以观看状态报告
手机发送的上行数据,也是通过 EMPP_DELIVERY来发送给平台的。