package com.zhgd.xmgl.util;

import java.io.UnsupportedEncodingException;

/**
 * 车辆系统控制工具类
 * 
 * @author Administrator
 *
 */

public class yunboCarUtils {
	// 公共变量
	static String randoms = "0";

	/**
	 * 语音播报函数 入参： "语音内容"
	 * 
	 * @param plateNumber
	 *            (播放车牌语音) "粤B12345" content（播放语音）"欢迎光临;临时车不允许进场;此车已出场;一路平安"
	 * @return
	 */
	public static String pushvoicetodevices(String plateNumber, String content) {
		// 拼接--AA55(包头) 01(流水号) 64(地址) 00(业务类型) 22(命令) 0001(长度)
		// 01(内容) 0556(校验) AF(结束符) --欢迎光临
		String randomsd = ontheVariable(randoms);
		// 内容匹配
		String contentConversion = null;
		int extent = 00;
		String transitions = null;
		try {
			transitions = toGBK(plateNumber);// 车牌内容转换后
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if ("欢迎光临".equals(content)) {
			// 01编号
			contentConversion = "01";
		} else if ("一路平安".equals(content)) {
			// 02编号
			contentConversion = "02";
		} else if ("临时车不允许进场".equals(content)) {
			// 2165编号
			contentConversion = "2165";
		} else if ("此车已出场".equals(content)) {
			// 06编号
			contentConversion = "06";
		}
		String Conversion = transitions + contentConversion;// 车牌+内容（欢迎光临）
		extent = Conversion.length() / 2;
		// 长度补位
		String hex1 = Integer.toHexString(extent);
		int s1 = hex1.length();
		String bh2 = null;// 最终长度（一位00）
		if (s1 <= 1) {
			StringBuffer sb = new StringBuffer();
			StringBuffer zh = sb.append("0").append(hex1.toUpperCase());
			bh2 = zh.toString();
		} else {
			bh2 = Integer.toHexString(extent);
		}

		String send = "AA55";
		String pjaxj = randomsd + "64" + "00" + "2200" + bh2 + Conversion;
		// 校验码
		byte[] bytes = hexStringToByteArray(pjaxj + "0000");
		// 补充位数
		String hex = getCRC(bytes);
		int s = hex.length();
		String bh1 = null;
		if (s <= 3) {
			if (s == 1) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("000").append(hex.toUpperCase());
				bh1 = zh.toString();
			}
			if (s == 2) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("00").append(hex.toUpperCase());
				bh1 = zh.toString();
			}
			if (s == 3) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("0").append(hex.toUpperCase());
				bh1 = zh.toString();
			}
		} else {
			bh1 = hex.toUpperCase();
		}
		String sends = send + pjaxj + bh1 + "AF";
		return sends;
	}

	/***
	 * 下发显示命令 参数：
	 * 
	 * @param type
	 *            01表示第一行 02 表示第二行 03表示第三行 04表示第四行
	 * @param content
	 *            表示显示内容
	 * @return
	 */
	public static String pushLedtexttodevice(String type, String content) {
		String randomsd = ontheVariable(randoms);
		int extent = 0;
		// 长度
		try {
			extent = toGBK(content).length() / 2 + 4;
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String hex1 = Integer.toHexString(extent);
		int s1 = hex1.length();
		String bh2 = null;
		if (s1 <= 1) {
			StringBuffer sb = new StringBuffer();
			StringBuffer zh = sb.append("0").append(hex1.toUpperCase());
			bh2 = zh.toString();
		} else {
			bh2 = Integer.toHexString(extent);
		}
		// 校验码
		String pjaxj = null;
		try {
			pjaxj = randomsd + "64" + "00" + "2700" + bh2 + type + "0F" + "01"
					+ "00" + toGBK(content);
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		byte[] bytes = hexStringToByteArray(pjaxj + "0000");
		// 补充位数
		String hex = getCRC(bytes);
		int s = hex.length();
		String bh1 = null;
		if (s <= 3) {
			if (s == 1) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("000").append(hex.toUpperCase());
				bh1 = zh.toString();
			}
			if (s == 2) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("00").append(hex.toUpperCase());
				bh1 = zh.toString();
			}
			if (s == 3) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("0").append(hex.toUpperCase());
				bh1 = zh.toString();
			}
		} else {
			bh1 = hex.toUpperCase();
		}
		String send = "AA55" + pjaxj + bh1 + "AF";
		return send;
	}

	// 车牌内容转GBK码
	private static String toGBK(String source)
			throws UnsupportedEncodingException {
		StringBuilder sb = new StringBuilder();
		byte[] bytes = source.getBytes("GBK");
		for (byte b : bytes) {
			sb.append(Integer.toHexString((b & 0xff)).toUpperCase());
		}
		return sb.toString();
	}

	/**
	 * 10进制转16进制(长度编译)
	 * 
	 * @param systems
	 * @return
	 */
	private static String systems(String systems) {
		int systemsd = Integer.valueOf(systems);
		String hex = Integer.toHexString(systemsd);
		int s = hex.length();
		if (s <= 9) {
			if (s == 1) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("000").append(hex.toUpperCase());
				String bh = zh.toString();
				return bh;
			}
			if (s == 2) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("00").append(hex.toUpperCase());
				String bh = zh.toString();
				return bh;
			}
			if (s == 3) {
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("0").append(hex.toUpperCase());
				String bh = zh.toString();
				return bh;
			}
		} else {
			return hex.toUpperCase();
		}
		return hex;
	}

	/**
	 * 流水号
	 * 
	 * @param randoms
	 * @return
	 */
	private static String ontheVariable(String randoms) {
		int transform = Integer.valueOf(randoms);
		if (transform < 9) {
			int randomsd = transform + 1;
			StringBuffer sb = new StringBuffer();
			StringBuffer zh = sb.append("0").append(randomsd);
			randoms = zh.toString();
			return randoms;
		}
		if (transform >= 9 && transform < 99) {
			int randomsd = transform + 1;
			randoms = String.valueOf(randomsd);
			return randoms;
		}
		if (transform >= 99) {
			transform = 0;
			if (transform < 9) {
				int randomsd = transform + 1;
				StringBuffer sb = new StringBuffer();
				StringBuffer zh = sb.append("0").append(randomsd);
				randoms = zh.toString();
				return randoms;
			}
		}
		return randoms;
	}

	private static byte[] hexStringToByteArray(String s) {
		int len = s.length();
		byte[] b = new byte[len / 2];
		for (int i = 0; i < len; i += 2) {
			// 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个字节
			b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
					.digit(s.charAt(i + 1), 16));
		}
		return b;
	}

	/**
	 * 计算CRC16校验码
	 *
	 * @param bytes
	 * @return
	 */
	private static String getCRC(byte[] bytes) {
		int CRC = 0x0000ffff;
		int POLYNOMIAL = 0x0000a001;

		int i, j;
		for (i = 0; i < bytes.length; i++) {
			CRC ^= ((int) bytes[i] & 0x000000ff);
			for (j = 0; j < 8; j++) {
				if ((CRC & 0x00000001) != 0) {
					CRC >>= 1;
					CRC ^= POLYNOMIAL;
				} else {
					CRC >>= 1;
				}
			}
		}
		return Integer.toHexString(CRC);
	}
}
