package com.hxzkoa.udp; import java.util.Vector; public class Read_Write_Anchor_Message { /** * 读取基站信息 * * @param ref * 起始地址 * @param lenth * 读取长度 */ public static byte[] ReadData(byte ref, byte lenth) { byte[] buf = new byte[10]; byte[] buf1 = new byte[6]; // 包头 buf[0] = (byte) 0x55; // 包头 buf[1] = (byte) 0xAA; // 指令类型(参数读写模式) buf1[0] = (byte) 0x03; // 数据长度 buf1[1] = (byte) 0x06; // 读模式(读模式) buf1[2] = (byte) 0x01; // 起始地址 buf1[3] = ref; ; // 数据长度 buf1[4] = lenth; // 固定值(读模式下为0x00) buf1[5] = (byte) 0x00; for (int i = 0; i < buf1.length; i++) { buf[i + 2] = buf1[i]; } // 校验码 buf[8] = Jiaoyan.check(buf1)[1]; buf[9] = Jiaoyan.check(buf1)[0]; ; return buf; } /** * 修改某一个标签的相关 * * @param int * hz需要修改的参数 * @param tagid * 需要修改的标签ID * @param byt徐修改的地址 */ public static byte[] write_one_taghz(int hz, String tagid, byte byt) { byte[] buf = new byte[14]; byte[] buf1 = new byte[10]; // 包头 buf[0] = (byte) 0x55; // 包头 buf[1] = (byte) 0xAA; // 指令类型 buf1[0] = (byte) 0x08; // 数据长度 buf1[1] = (byte) ((byte) 10); // ID组数最大为20组 buf1[2] = (byte) 0x01; // 参数地址 buf1[3] = byt; buf1[4] = toByteArray(tagid)[1]; buf1[5] = toByteArray(tagid)[0]; buf1[6] = toByteArray(tagid)[1]; buf1[7] = toByteArray(tagid)[0]; buf1[8] = intToRegisters(hz)[3]; buf1[9] = intToRegisters(hz)[2]; for (int z = 0; z < buf1.length; z++) { buf[z + 2] = buf1[z]; } // 校验码 buf[12] = Jiaoyan.check(buf1)[1]; buf[13] = Jiaoyan.check(buf1)[0]; return buf; } /** 向基站下发时间片配置信息 */ public static byte[] write_timestamp(String tagid, int hz, int timestamp) { byte[] buf = new byte[16]; byte[] buf1 = new byte[12]; // 包头 buf[0] = (byte) 0x55; // 包头 buf[1] = (byte) 0xAA; // 指令类型 buf1[0] = (byte) 0x0b; // 数据长度 buf1[1] = (byte) 0x0C; // 标签id buf1[2] = toByteArray(tagid)[1]; buf1[3] = toByteArray(tagid)[0]; // 标签频率 buf1[4] = intToRegisters(hz)[3]; buf1[5] = intToRegisters(hz)[2]; // 时间片 buf1[6] = intToRegisters(timestamp)[3]; buf1[7] = intToRegisters(timestamp)[2]; // 保留 buf1[8] = (byte) 0x00; buf1[9] = (byte) 0x00; buf1[10] = (byte) 0x00; buf1[11] = (byte) 0x00; for (int z = 0; z < buf1.length; z++) { buf[z + 2] = buf1[z]; } // 校验码 buf[14] = Jiaoyan.check(buf1)[1]; buf[15] = Jiaoyan.check(buf1)[0]; return buf; } /** * 修改标签的频率 * * @param hz需要修改的内容 * @param byt参数地址 * @param lenth数据段长度 */ public static byte[] write_taghz(int hz, Vector vec, byte adress) { // 总共有多少组标签 int zu = vec.size() / 2; int lenth = zu * 6; String hexzu = Integer.toHexString(zu); if (zu < 17) { hexzu = "0" + Integer.toHexString(zu); } byte[] buf = new byte[8 + lenth]; byte[] buf1 = new byte[4 + lenth]; // 包头 buf[0] = (byte) 0x55; // 包头 buf[1] = (byte) 0xAA; // 指令类型 buf1[0] = (byte) 0x08; // 数据长度 buf1[1] = (byte) ((byte) 4 + zu * 6); // ID组数最大为20组 buf1[2] = toByteArray(hexzu)[0]; // 参数地址 buf1[3] = adress; for (int i = 0; i < zu; i++) { buf1[4 + 6 * i] = toByteArray(vec.get(i * 2 + 1))[1]; buf1[5 + 6 * i] = toByteArray(vec.get(i * 2 + 1))[0]; buf1[6 + 6 * i] = toByteArray(vec.get(i * 2))[1]; buf1[7 + 6 * i] = toByteArray(vec.get(i * 2))[0]; buf1[8 + 6 * i] = intToRegisters(hz)[3]; buf1[9 + 6 * i] = intToRegisters(hz)[2]; } for (int z = 0; z < buf1.length; z++) { buf[z + 2] = buf1[z]; } // 校验码 buf[6 + lenth] = Jiaoyan.check(buf1)[1]; buf[7 + lenth] = Jiaoyan.check(buf1)[0]; return buf; } public static byte[] intToRegisters(int v) { byte[] registers = new byte[4]; registers[0] = (byte) (0xff & (v >> 24)); registers[1] = (byte) (0xff & (v >> 16)); registers[2] = (byte) (0xff & (v >> 8)); registers[3] = (byte) (0xff & v); return registers; } /** * 16进制的字符串表示转成字节数组 * * @param hexString * 16进制格式的字符串 * @return 转换后的字节数组 **/ public static byte[] toByteArray(String hexString) { hexString = hexString.replaceAll(" ", ""); final byte[] byteArray = new byte[hexString.length() / 2]; int k = 0; for (int i = 0; i < byteArray.length; i++) {// 因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先 byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff); byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff); byteArray[i] = (byte) (high << 4 | low); k += 2; } return byteArray; } /** * 写串口数据包 * * @param ref * 起始地址 * @param lenth * 数据长度 * @param value * 写入值 */ public static byte[] WriteData(byte ref, byte lenth, int value) { byte[] buf = new byte[9 + lenth]; byte[] buf1 = new byte[5 + lenth]; // 包头 buf[0] = (byte) 0x55; // 包头 buf[1] = (byte) 0xAA; // 指令类型 buf1[0] = (byte) 0x03; // 数据长度 buf1[1] = (byte) ((byte) 5 + lenth); // 读模式 buf1[2] = (byte) 0x02; // 起始地址 buf1[3] = (byte) ref; // 数据长度 buf1[4] = (byte) lenth; // 写入值 if (lenth == 2) { buf1[5] = ModbusUtil.intToRegisters(value)[3]; buf1[6] = ModbusUtil.intToRegisters(value)[2]; } for (int i = 0; i < buf1.length; i++) { buf[i + 2] = buf1[i]; } // 校验码 buf[buf.length - 2] = Jiaoyan.check(buf1)[1]; buf[buf.length - 1] = Jiaoyan.check(buf1)[0]; return buf; } }