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