此文的依据是EMPP v2.0的协议,因为原有协议上的描述并不清晰,所以在此补充如下:
数据格式定义详解(原文链接 http://ddbiz.com/?p=118)
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来发送给平台的。
7. EMPP_CHANGEPASS
EMPP规定链接的帐户密码必须每3个月修改一次(上海这里是如此,其他地区请自行沟通)。于是实现了 EMPP_CHANGEPASS 。结果,每次请求更新密码,链接就会被断开,经查询才知,这个密码不能通过此命令更新(已经禁止通过程序更新密码),只能通过 web的管理界面手动更新。SHIT!!
8. Valid_Time和At_Time
EMPP平台上的时间定义方式,当有通信包的字段需要使用时间格式时,一般的定义如: YYMMDDhhmmsstnnp,其理解方式可为:
YYMMDDhhmmss 年月日时分秒, 对应的c#定义为 yyMMddHHmmss
t 十分之一秒,对应的c#定义为 f
nn 相对于UTC的四分之一小时,比如北京时区为+8, 则 nn = 8*4 = 32
p 取值为+或者-,表示超前或落后与UTC的时间,比如北京为 +8,则p = +
9. 补充一些错误代码
有些错误代码在文档中没有被定义,这里逐一列出
DTBLACK:目的号码在企信通黑名单是,需要联系客户经理删除。
DTERROR:手机号码错误,或不存在。
MK:0001:这个是网关返回的一个错误代码,具体还需要联系客户经理到网关查询
<待续>(原文链接 http://ddbiz.com/?p=118)