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); } }