现在的位置: 首页 > 综合 > 正文

跟huawei做接口时,报文格式问题

2018年10月20日 ⁄ 综合 ⁄ 共 2753字 ⁄ 字号 评论关闭
协议包由四部分组成:总长度(4字节)、加密包长(4字节)、包头(46字节)、变长包体
注:加密包长保留4字节;其中长度按网络字节序处理
1〕包头定义
struct PktHeader
{
Char reqformnum[14]; //交易流水号
Char opcode[6]; //交易代码,以null结束
Char sessionid[12]; //SESSIONID
Char retcode[6]; //业务返回码
Char curpkgno[4]; //当前交易包序号,范围1到totalpkgno
Char totalpkgno[4]; //本次交易包总个数,正整数
}; 
报文:
0375032110000000000546100427 1 1 <CHEERBOSS><HEAD><OPCODE>100427</OPCODE><REQFORMNUM>00000000000001</REQFORMNUM><ACCESSTYPE>bsacTT</ACCESSTYPE><UNITID>bsacTT</UNITID><TERMINALID>BYD</TERMINALID><REQTIME>20130702141645</REQTIME><OPERID/><SESSIONID/><RESQNO/></HEAD><DATA><TELNUM>15923091255</TELNUM><ID_CARD>500105201108191237</ID_CARD></DATA></CHEERBOSS>
格式是:
0375 是十六进制:0x00 0x00 0x01 0x77 (发送报文长度 4个字节)
0420 是十六进制 0x00 0x00 0x01 0x41 (xml报文长度 4个字节)
再加上(367个字节):
10000000000546100427 1 1 <CHEERBOSS><HEAD><OPCODE>100427</OPCODE><REQFORMNUM>00000000000001</REQFORMNUM><ACCESSTYPE>bsacTT</ACCESSTYPE><UNITID>bsacTT</UNITID><TERMINALID>BYD</TERMINALID><REQTIME>20130702141645</REQTIME><OPERID/><SESSIONID/><RESQNO/></HEAD><DATA><TELNUM>15923091255</TELNUM><ID_CARD>500105201108191237</ID_CARD></DATA></CHEERBOSS>
总共367+4+4=375.

前面的八个字节分两部分,总长度(4字节)、加密包长(4字节)。发送时必须用int类型,故而不能直接跟后面的字符串报文一起发送,否则java就会将其拼装成字符串,如0375,服务器收到后看到的不是0375,而是0375对应的ascII码,解决方法:

public List commTransServer(String xml) throws Exception {

transferSocket = new Socket(transferServerIp, Integer.valueOf(transferServerport));
transferSocket.setSoTimeout(70000);
List resultList = new ArrayList();
//向服务器发送消息

OutputStream outputStream=transferSocket.getOutputStream();
//System.out.println("连接已建立...");
SplitString(xml);
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(byteArrayOutputStream);
dataOutputStream.writeInt(BaoWenHead);
dataOutputStream.writeBytes(BaoWenBody);
byte[] bb= byteArrayOutputStream.toByteArray();
outputStream.write(bb,0,BaoWenHead);
outputStream.flush();
//从服务器获取消息

InputStream inputStream= transferSocket.getInputStream();
int count = 0;  
   while (count == 0)  
       count = inputStream.available();   
   byte[] b = new byte[count];  
   inputStream.read(b);
   
   //js 2014-5-26 in huawei 
   //报文是以GBK编码解析
   String string=new String(b,8,count-8,"GBK");
   byte[] abab=subBytes(b,0,4);
   byte[] ababc=subBytes(b,4,4);
   BaoWenHead=byteToint(abab);
   BaoWenXml=byteToint(ababc);
   //System.out.println("BaoWenHead"+BaoWenHead+"-BaoWenXml"+BaoWenXml);
   //System.out.println(string);
   //将报文长度和xml长度补位到四位
   NumberFormat   formatter   =   NumberFormat.getNumberInstance();   
        formatter.setMinimumIntegerDigits(4);   
        formatter.setGroupingUsed(false);   
        String   BaoWenHeadString   =   formatter.format(BaoWenHead);  
        String   BaoWenXmlString   =   formatter.format(BaoWenXml);  
        String recivedString=BaoWenHeadString+BaoWenXmlString+string;
        System.out.println(recivedString);
        resultList.add(recivedString);
return resultList;
}

抱歉!评论已关闭.