50,547
社区成员
发帖
与我相关
我的任务
分享
//流程名称
public static final String FLOW_NAME = "对时流程";
//流程常量
public static final String FLOW_ZZQQ = "对时命令";
public static final String FLOW_QRBW = "对时确认";
/**
* 发送:子站发送对时确认报文
*/
public boolean sendZhQyFrame(TcpVarFrame dsFrame) {
boolean b = false;
try {
LinkedBlockingQueue<TcpFrame> senQueue = EmsToBJXNYTcpClient.getSenQueue();
TcpVarFrame frame = this.getZhQyFrame(dsFrame);
if(frame != null) {
senQueue.put(frame);
b = true;
//设置当前流程步骤,因为流程已经没有下一步,所以流程置空
EmsToBJXNYTcpClient.setFrameFlow(null);
}
senQueue = null;
}catch (Exception e) {
logger.error(" 发送["+FLOW_QRBW+"]异常.", e);
} finally {
}
return b;
}
发送报文的是采用, 发送队列来执行的, 只要把组装好的报文放进队列就可以了.
虽然不是什么重点项目, 但是代码还是要保密, 所以只发个片段供参考.
//组装:子站发送对时确认报文
public TcpVarFrame getZhQyFrame(TcpVarFrame dsFrame) {
TcpVarFrame frame = new TcpVarFrame();
frame.setFlowName(FLOW_NAME);
frame.setFrameName(FLOW_QRBW);
//
String addr1 = EmsToBJXNYTcpClient.getAddrA1();
String addr2 = EmsToBJXNYTcpClient.getAddrA2();
//按转送顺序组装
StringBuffer bf = new StringBuffer(128);
bf.append("68");
String hexL = StaticConvert.getBJXNYHexLenByIntL(17);//L=17字节
bf.append(hexL);
bf.append(hexL);
bf.append("68");
//控制域
bf.append("48");
bf.append(addr1 +addr2);
bf.append(dsFrame.getAsduTypeHex());
bf.append(dsFrame.getAsduVsqHex());
//
bf.append("07");
bf.append(addr2);
//对时的时间
Date dayDate1 = DateUtils.parse(new Date(), DateUtils.SECOND);
bf.append(StaticConvert.getBJXNYHexStrByDate(dayDate1));
//
//校验和CS(1 字节)
byte[] byteBuf = StaticConvert.parseHexStr2Byte(bf.toString());
bf.append(StaticConvert.getBJXNYHexCsByInt(byteBuf, 6, byteBuf.length));
bf.append("16");
boolean b = frame.setFrameDataHex(bf.toString());
return b? frame : null;
}