输出如下:
01 53 45 54 5F 54 69 6D 65 0B 0C 12 10 02 12 00 D8
cmd: 1 word: SET_Time data: 0B 0C 12 10 02 12 00 txt:
Sun Dec 18 16:02:18 CST 2011
package com.yc.pos32; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.Charset; import java.util.Calendar; import java.util.Date; import java.util.Hashtable; import java.util.Properties; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.ProtocolDecoder; import org.apache.mina.filter.codec.ProtocolDecoderAdapter; import org.apache.mina.filter.codec.ProtocolDecoderOutput; import org.apache.mina.filter.codec.ProtocolEncoder; import org.apache.mina.filter.codec.ProtocolEncoderAdapter; import org.apache.mina.filter.codec.ProtocolEncoderOutput; /** * 下行协议 指令代码 控制字 数据 校验 回应: 成功:SET_OK 或 相应数据 失败:0 * * @author QinQouShui * */ public class DownCodecFilter extends ProtocolCodecFilter { public static Hashtable ControlWords = new Hashtable(); static { Properties p2 = new Properties(); try { p2.load(new FileInputStream("./conf/conf.properties")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ControlWords.putAll(p2); } private static IoBuffer makePacket(byte command, String word, IoBuffer content) { IoBuffer buffer = IoBuffer.allocate(1 + word.length() + (content == null ? 0 : content.remaining()) + 1); buffer.put(command).put(word.getBytes(Charset.forName("ascii"))); if (content != null) { buffer.put(content); content.rewind(); } return buffer.put(checksum(buffer, 0, buffer.position() - 1)).flip(); } private static IoBuffer makePacket(DownCommand command) { return makePacket(command.getCmd(), command.getWord(), command.getContent()); } // 求和校验 private static byte checksum(IoBuffer buffer, int startPos, int endPos) { int sum = 0; for (int i = startPos; i <= endPos; i++) sum += buffer.get(i); return (byte) ((0x100 - sum & 0xff) & 0xff); } private static IoBuffer fromHexdump(String hex) { String[] arr = hex.split("\\s"); IoBuffer buff = IoBuffer.allocate(arr.length); for (String a : arr) { buff.put((byte) Integer.parseInt(a, 16)); } return buff.flip(); } private static int getWordLength(byte key) { if (ControlWords.get("cw" + key) != null) return ControlWords.get("cw" + key).toString().length(); else return 0; } // 解包 private static DownCommand parsePacket(IoBuffer buff) throws Exception { int oldPos = 0; DownCommand command = null; byte cmdKey = buff.get(); command = new DownCommand(cmdKey, buff.getString(getWordLength(cmdKey), Charset.forName("ascii").newDecoder())); int len = buff.limit() - 1 - buff.position(); if (len > 0) { int oldLimit = buff.limit(); buff.limit(buff.position() + len); command.setContent(buff.slice()); buff.position(buff.limit()); buff.limit(oldLimit); } if (checksum(buff, oldPos, buff.position() - 1) != buff.get()) { throw new Exception("校验错误"); } else { command.setBad(false); } return command; } public DownCodecFilter() { super(new ProtocolCodecFactory() { public ProtocolEncoder getEncoder(IoSession session) throws Exception { return new ProtocolEncoderAdapter() { public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { IoBuffer buffer = makePacket((DownCommand) message); out.write(buffer); } }; } public ProtocolDecoder getDecoder(IoSession session) throws Exception { return new ProtocolDecoderAdapter() { public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { IoBuffer buff = in; // 解包 while (buff.hasRemaining()) { DownCommand cmd = parsePacket(buff); if (cmd != null) { out.write(cmd); } else { break; } } // if (buff.hasRemaining()) { // byte[] remain = new byte[in.remaining()]; // in.get(remain); // session.setAttachment(remain); // } } }; } }); } public static void main(String[] args) { // 打包测试 Calendar time = Calendar.getInstance(); IoBuffer buffer = IoBuffer .allocate(200) .put((byte) (time.get(Calendar.YEAR) % 100)) .put((byte) (time.get(Calendar.MONTH) + 1)) .put((byte) time.get(Calendar.DAY_OF_MONTH)) .put((byte) (time.get(Calendar.HOUR) + (time .get(Calendar.AM_PM) == Calendar.AM ? 0 : 12))) .put((byte) time.get(Calendar.MINUTE)) .put((byte) time.get(Calendar.SECOND)).put((byte) 0).flip(); IoBuffer outBuffer = makePacket((byte) 1, ControlWords.get("cw1") .toString(), buffer); System.out.println(outBuffer.getHexDump()); // 解包测试 try { DownCommand cmd = parsePacket(outBuffer); System.out.println(cmd.toString()); Calendar c = Calendar.getInstance(); c.set(cmd.getContent().get() + 2000, cmd.getContent().get() - 1, cmd.getContent().get(), cmd.getContent().get(), cmd .getContent().get(), cmd.getContent().get()); System.out.println(c.getTime().toString()); } catch (Exception e) { e.printStackTrace(); } } }