Message.java 6.48 KB
package com.bsth.socket.protocol;

import com.bsth.util.ConvertUtil;
import com.bsth.util.CrcUtil;

import java.nio.ByteBuffer;
import java.util.Arrays;

/**
 * @author Hill
 */
public class Message {

	/**
	 * 协议起始符
	 */
	private String start = "##";

	/**
	 * 命令标识
	 */
	private byte command;

	/**
	 * 应答标志
	 * 0x01 成功
	 * 0x02 设置识别
	 * 0x03 vin重复
	 * 0xFE 命令
	 */
	private byte ackFlag;

	/**
	 * 车辆识别码(常规vin,可自定义唯一码)
	 */
	private String vin = "\0";

	/**
	 * 加密方式
	 */
	private byte encryption;

	/**
	 * 数据长度
	 */
	private short dataLength;

	/**
	 * 数据体
	 */
	private IMessageBody messageBody;

	/**
	 * 校验码(BBC)
	 */
	private byte crc;

	public void read(byte[] data) {
		int idx = 2, len = data.length;
		command = data[idx]; idx++;
		ackFlag = data[idx]; idx++;
		vin = ConvertUtil.ascii2string(data, idx, 17); idx += 17;
		encryption = data[idx]; idx += 3;
		byte[] temp = Arrays.copyOfRange(data, idx, len - 1);
		crc = data[len - 1];
		byte sum = CrcUtil.bbc(data, 2, len - 2);
		if (sum == crc) {
			System.out.println(ConvertUtil.toHexString(data));
			messageBody = MessageFactory.create(command, temp);
		} else {
			throw new ProtocolException("校验未通过" + ConvertUtil.toHexString(data));
		}
	}
	
	public byte[] write() {
		byte[] bytes = messageBody.write();
		ByteBuffer buf = ByteBuffer.allocate(bytes.length + 25);
		buf.put(start.getBytes());
		buf.put(command);
		buf.put(ackFlag);
		buf.put(vin.getBytes());
		buf.put(encryption);
		buf.putShort((short)bytes.length);
		buf.put(bytes);
		byte[] data = buf.array();
		crc = CrcUtil.bbc(data, 2, data.length - 2);
		buf.put(crc);

		return buf.array();
	}

	public String getStart() {
		return start;
	}

	public void setStart(String start) {
		this.start = start;
	}

	public byte getCommand() {
		return command;
	}

	public void setCommand(byte command) {
		this.command = command;
	}

	public byte getAckFlag() {
		return ackFlag;
	}

	public void setAckFlag(byte ackFlag) {
		this.ackFlag = ackFlag;
	}

	public String getVin() {
		return vin;
	}

	public void setVin(String vin) {
		this.vin = vin;
	}

	public byte getEncryption() {
		return encryption;
	}

	public void setEncryption(byte encryption) {
		this.encryption = encryption;
	}

	public short getDataLength() {
		return dataLength;
	}

	public void setDataLength(short dataLength) {
		this.dataLength = dataLength;
	}

	public IMessageBody getMessageBody() {
		return messageBody;
	}

	public void setMessageBody(IMessageBody messageBody) {
		this.messageBody = messageBody;
	}

	public byte getCrc() {
		return crc;
	}

	public void setCrc(byte crc) {
		this.crc = crc;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append(" 起始符号:").append(start)
		.append(" 命令标识:").append(command)
		.append(" 应答标志:").append(ackFlag)
		.append(" vin:").append(vin)
		.append(" 加密方式:").append(encryption)
		.append(" 报文主体:(").append(messageBody).append(" )")
		.append(" 报文校验和:").append(crc);
		
		return sb.toString();
	}
	
	public static void main(String args[]) {
//		String s = "232302fe484e53323032343131313454455354303101008b180b0f0b0e3701010301ffff00000000ffffffffffff00000002ff020101ffffffffffffffffffffff050100000000000000000601ffffff01ffffff01ffff01ffff07030000001000000003100a0a0310c292021013170180003000002dffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff00ffffff0228";
//		StringBuilder builder = new StringBuilder();
//		for (int i = 0;i < s.length() - 1;i += 2) {
//			builder.append("(byte)0x").append(s.substring(i,i+2)).append(",");
//		}
//		System.out.println(builder.toString());
		// (byte)0x11,(byte)0x64,(byte)0x47,(byte)0x00,(byte)0x33,(byte)0x31,(byte)0x44,(byte)0x51,(byte)0x33,(byte)0x38,(byte)0x33,(byte)0x31,(byte)0x17,(byte)0x07,(byte)0x26,(byte)0x16,(byte)0x54,(byte)0x24,(byte)0x00,(byte)0x00,(byte)0x45,(byte)0x4e,(byte)0x07,(byte)0x1a,(byte)0x10,(byte)0x37,(byte)0x51
		// (byte)0x11,(byte)0x5e,(byte)0x46,(byte)0x00,(byte)0x33,(byte)0x31,(byte)0x44,(byte)0x51,(byte)0x33,(byte)0x38,(byte)0x33,(byte)0x31,(byte)0x17,(byte)0x07,(byte)0x26,(byte)0x16,(byte)0x53,(byte)0x33,(byte)0x60,(byte)0x00,(byte)0x00,(byte)0x45,(byte)0x4e,(byte)0x07,(byte)0x1a,(byte)0x10,(byte)0x37,(byte)0xb8
		byte[] bytes = new byte[]{(byte)0x23,(byte)0x23,(byte)0x02,(byte)0xfe,(byte)0x48,(byte)0x4e,(byte)0x53,(byte)0x32,(byte)0x30,(byte)0x32,(byte)0x34,(byte)0x31,(byte)0x31,(byte)0x31,(byte)0x34,(byte)0x54,(byte)0x45,(byte)0x53,(byte)0x54,(byte)0x30,(byte)0x31,(byte)0x01,(byte)0x00,(byte)0x8b,(byte)0x18,(byte)0x0b,(byte)0x0f,(byte)0x0b,(byte)0x0e,(byte)0x37,(byte)0x01,(byte)0x01,(byte)0x03,(byte)0x01,(byte)0xff,(byte)0xff,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0xff,(byte)0x02,(byte)0x01,(byte)0x01,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x05,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x01,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x01,(byte)0xff,(byte)0xff,(byte)0x01,(byte)0xff,(byte)0xff,(byte)0x07,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x10,(byte)0x0a,(byte)0x0a,(byte)0x03,(byte)0x10,(byte)0xc2,(byte)0x92,(byte)0x02,(byte)0x10,(byte)0x13,(byte)0x17,(byte)0x01,(byte)0x80,(byte)0x00,(byte)0x30,(byte)0x00,(byte)0x00,(byte)0x2d,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x00,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x02,(byte)0x28};
		Message msg= new Message();
		msg.read(bytes);
		System.out.println(msg);
		//System.out.println(bytes[bytes.length - 1]);
		//System.out.println(CrcUtil.bbc(bytes, 2, bytes.length - 2));

		//byte[] bytes1 = new byte[]{(byte)0x17,(byte)0x03,(byte)0x10,(byte)0x09,(byte)0x0a,(byte)0x12};
		//System.out.println(new DateTime(ConvertUtil.bytes2timestamp(bytes1, 0)).toString("yyyy-MM-dd HH:mm:ss"));
	}
}