Message80.java 2.67 KB
package com.bsth.socket.protocol;

import com.bsth.constant.Constant;
import com.bsth.util.ConvertUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.joda.time.DateTime;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author Hill
 * 参数查询应答
 */
public class Message80 implements IMessageBody {

	/**
	 * byte[6]
	 * 数据采集时间
	 */
	private long timestamp;

	/**
	 * 参数总数
	 * n
	 */
	private byte paramNum;

    /**
     * 参数具体数据
	 */
	private Map<Integer, Object> params = new LinkedHashMap<>();
	
	@Override
	public void read(byte[] bytes) {
		// TODO Auto-generated method stub
		int idx = 0;
		timestamp = ConvertUtil.bytes2timestamp(bytes, idx); idx += 6;
		paramNum = bytes[idx]; idx++;
		for (int i = 0;i < (paramNum & Constant.BYTE_INT);i++) {
			idx += analyzeParam(bytes, idx);
		}
		System.out.println("aaa");
	}
	
	@Override
	public byte[] write() {
		// TODO Auto-generated method stub
		return new byte[0];
	}

	private int analyzeParam(byte[] bytes, int idx) {
		int result = 1, len = 0;
		int type = bytes[idx] & Constant.BYTE_INT;
		switch (type) {
			case 0x01:
			case 0x02:
			case 0x03:
			case 0x06:
			case 0x0A:
			case 0x0B:
			case 0x0F:
				params.put(type, (short) ConvertUtil.bytes2int(bytes, ++ idx, 2));
				result += 2;
				break;
			case 0x04:
			case 0x09:
			case 0x0C:
			case 0x0D:
			case 0x10:
				params.put(type, bytes[++ idx]);
				result ++;
				break;
			case 0x05:
			case 0x0E:
				len = ((Byte) params.get(type - 1)).byteValue() & Constant.BYTE_INT;
				params.put(type, ConvertUtil.ascii2string(bytes, ++ idx, len));
				result += len;
				break;
			case 0x07:
			case 0x08:
				params.put(type, ConvertUtil.ascii2string(bytes, ++ idx, 5));
				result += 5;
				break;
			default:
				break;
		}

		return result;
	}

	public long getTimestamp() {
		return timestamp;
	}

	@Override
	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	public byte getParamNum() {
		return paramNum;
	}

	public void setParamNum(byte paramNum) {
		this.paramNum = paramNum;
	}

	public Map<Integer, Object> getParams() {
		return params;
	}

	public void setParams(Map<Integer, Object> params) {
		this.params = params;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		try {
			sb.append(" 数据采集时间:").append(new DateTime(timestamp).toString("yyyy-MM-dd HH:mm:ss"))
			.append(" 参数数量:").append(paramNum)
			.append(" 参数命令IDS:").append(new ObjectMapper().writeValueAsString(params));
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}

		return sb.toString();
	}
}