2003年左右,学习了一下CMPP,做了一个简单的CONNECT、发送、保持链接的C#代码,由于公司申请不到移动网关,也就搁浅了。
最近得知公司申请了联通网关,不禁又见猎心喜,通过经理弄到了共享,基本安装CMPP部分代码的模式改造了一个简单的登录,由于网关登录和IP绑定,所以还没有成功,不过收到回应 01:错误代码 非法登录,如登录名、口令出错、登录名与口令不符等。
对照看了一下两者的协议,发现联通的相对比较简单一些,聊且记录一下:
消息头的格式 联通的
字段 长度(字节) 类型 说明
Message Length 4 Integer 消息的总长度(字节)
Command ID 4 Integer 命令ID
Sequence Number 12 Integer 序列号
8.3 消息头格式(Message Header) 移动的
字段名 字节数 类型 描述
Total_Length 4 Unsigned Integer 消息总长度(含消息头及消息体)
Command_Id 4 Unsigned Integer 命令或响应类型
Sequence_Id 4 Unsigned Integer 消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)
我就不明白,为什么联通的流水号序列号居然要12个字节 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,微软的计算器最多让我粘贴 FFFFFFFFFFFFFFFF 换算出来是 18446744073709551615,我不知道这个数字多大了。这样的话我估计这个软件死亡了这流水号还不一定能够用完。
呵呵,是我的错!!序列号分成三部分,每部分为一个32位整数,第一部分表示命令源节点的编号,第二部分表示命令产生的日期和时间(网关系统中的任何命令的保存时间都不应该超过一年),格式为十进制的mmddhhmmss,比如11月20日20时32分25秒产生的命令,其第二部分为十进制1120203225;第三部分由0开始,循环进位,直到进位满了之后再清零,重新开始计数。接收方在返回应答时,应答的序列号必须和相对应的命令的序列号相同。
字段 长度(字节) 类型 说明
Login Type 1 Integer 登录类型。
1:SP向SMG建立的连接,用于发送命令
2:SMG向SP建立的连接,用于发送命令
3:SMG之间建立的连接,用于转发命令
4:SMG向GNS建立的连接,用于路由表的检索和维护
5:GNS向SMG建立的连接,用于路由表的更新
6:主备GNS之间建立的连接,用于主备路由表的一致性
11:SP与SMG以及SMG之间建立的测试连接,用于跟踪测试
其它:保留
Login Name 16 Text 服务器端给客户端分配的登录名
Login Passowrd 16 Text 服务器端和Login Name对应的密码
Reserve 8 Text 保留,扩展用
字段名 字节数 属性 描述
Source_Addr 6 Octet String 源地址,此处为SP_Id,即SP的企业代码。
AuthenticatorSource 16 Octet String 用于鉴别源地址。其值通过单向MD5 hash计算得出,表示如下:
AuthenticatorSource =
MD5(Source_Addr+9 字节的0 +shared secret+timestamp)
Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。
Version 1 Unsigned Integer 双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号),对于3.0的版本,高4bit为3,低4位为0
Timestamp 4 Unsigned Integer 时间戳的明文,由客户端产生,格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐 。
移动的是有用MD5散序的,而联通的好像就是明文。如果联通是通过IP认证,不知道IP伪造是不是可以骗过?好像不可以,有人说:伪造IP只能用在UDP上,而且应为IP包前有目的机与发送机的MAC地址,故不可能真正隐藏发送机.