业务需求,前几天写了一个跟联通计费侧的接口,具体要求参见局方规范:
1 H2协议
遵循软件工程及制定协议标准的基本思想,本着接口易用、易理解、易交流的原则,为实现客服系统的规范性、开放性、扩展性、业务独立性提供保证。
总部H2接口方式
采用事务交易设计,以保证传输数据的安全正确。
采用中间件技术,使接口定义简单明晰。
根据交易的类型,决定交易回应的时限。
包头定义:
包头格式:内容为一定长ASCII字符串(86位),具体内容如下:
字段名称 | 长度 | 说明 |
A0版本号信息 | (2位) | 标识当前使用的协议版本号 |
A1数据包大小 | (5位) | 以字节为单位,不足右补空格 |
A2流水号 | (20位) | 业务流水号,标志每笔具体交易。数据校验包可以无流水号 |
A3标志 | (1位) | 1表示成功 0表示失败,仅适用于响应包 |
A4服务类型 | (12位) | 编码规则参见《》 |
A5业务号码 | (20位) | 移动电话号码 |
A6业务号码类型 | (1位) | 1电话号码;2帐号;3其他 |
A7营业点 | (6位) | 业务受理地点 |
A8营业员 | (8位) | 业务受理人 |
A9包编号 | (5位) | 标志该笔流水的第几包数据 |
A10最后一包标志 | (1位) | 在进行多包发送的情况下,该标志用以标明是否为最后一数据包。1最后一包数据,无后续包;0非最后一包数据,有后续包,连接错误,I/O错误等 |
A11错误码 | (5位) | 在标志为失败时需要检查该错误码。错误码包括系统操作错误和业务处理错误 |
包体定义:
一个数据包总长度不可大于4K。对存在多条返回记录的业务,一数据包可含多条记录。长度如超过4K,就以多包数据发送。每字段之间用“TAB键0x09”分隔,每记录之间用“回车键0x0d,0x0a”分隔,包结束用“0x1a”。对于不同的服务类型,其请求包和应答包的包体具有不同的内容。无论数据有无包体返回,一定需要添加包结束符。对于任何非正常返回的数据包应该没有包体,只有包头与包结束符。包体字段为定长字符串,非变长字符串,字段内容不应该出现不可打印字符串。
补空格原则:
凡字段的数据表示的是金额的,既其字段类型是Number(10)的,这样的字段是左补空格,其它字段都是右补空格。注:如果省分是按分隔符处理数据,此规则无效。如果省分按定长处理数据,则遵循些规则补空格。
接口采用严格的数据长度确认传输数据正确性!其间采用的Socket编程没有什么说的,主要是在开发中遇到以下问题:
1.数据包头+包体构成,请求数据不能没有包头,可以无包体
2.包头必须采用86位长度,不能长,不能短
3.服务端解析报文必须先读取报文结束标志,否则,不解析,Socket一直处于read模式,导致客户端超时
4.文档说的包以0x1a结束,正确的无包体报文的长度为87位,即结束位长度为1,如果根据文档描述的,报文长度为90,进入报文解析直接报错,不解析!
如果全部转化为16进制,长度完全超出要求。
最后,根据十六进制计算该结束标志为SUB(ASCII),通过将该SUB加上前面报文正常解析.