package jiexi; import home.ModbusUtil; import home.PacketParser; public class DellTag55AA03 { private static final ThreadLocal RESULT_CACHE = ThreadLocal.withInitial(ParseResult::new); public static class ParseResult { public String dizhi0x2;//版本号 public String dizhi0x4;//模块编号 public Integer dizhi0x6;//通信频率 public Integer dizhi0x8;//最多通信基站 public Integer dizhi0xA;//最少通信基站、小组编号 public short dizhi0xC;//校准距离 public Integer dizhi0xE;//模块类型 public Integer dizhi0x10;//基站主动测距 public Integer dizhi0x12;//报警设备 public Integer dizhi0x14;//临近基站切换距离、IMU静止时间 public String dizhi0x16;//基站测距上限、气压基站编号 public Integer dizhi0x18;//报警距离、外设控制 public Integer dizhi0x1A;//配对ID public Integer dizhi0x1C;//心跳包、UWB开关状态 public Integer dizhi0x1E;//MODBUS模式 public Integer dizhi0x20;//临近基站数量 、震动时长 public String dizhi0x22;//临近基站1 ID public String dizhi0x24;//临近基站2 ID public String dizhi0x26;//临近基站3 ID public String dizhi0x28;//临近基站4 ID public String dizhi0x2A;//临近基站5 ID public String dizhi0x2C;//临近基站6 ID public String dizhi0x2E;//临近基站7 ID public String dizhi0x30;//临近基站8 ID public String dizhi0x32;//临近基站9 ID public String dizhi0x34;//临近基站10 ID public Integer dizhi0x36;//功率 public Integer dizhi0x38;//加速计阈值 public Integer dizhi0x3A;//无静止休眠时间 public Integer dizhi0x3C;//震动使能 public Integer dizhi0x3E;//加速计使能 public Integer dizhi0x40;//标签下发配置状态/滤波参数 public Integer dizhi0x42;//标签下发配置ID、加速计时长 public String dizhi0x44;//同步基站ID、设备激活状态位 public Integer dizhi0x46;//同步基站类型 public Integer dizhi0x48;//速度滤波限值 public String dizhi0x4A;//白名单起始ID public String dizhi0x4C;//白名单终止ID public Integer dizhi0x4E;//固件类型 public short dizhi0x50;//参考高度校准值 public Integer dizhi0x52;//基站测距信息输出格式 public Integer dizhi0x54;//基站测距上限 public Integer dizhi0x56;// public Integer dizhi0x58;// public Integer dizhi0x5A;// public Integer dizhi0x5C;// public Integer dizhi0x5E;// public Integer dizhi0x60;//模块重启 public Integer dizhi0x62;//恢复出厂设置 public Integer dizhi0x64;//开始升级 public Integer dizhi0xF0;//继电器1控制 public Integer dizhi0xF2;//继电器2控制 public Integer dizhi0xF4;//F4.继电器2报警距离1 public Integer dizhi0xF6;//F6.继电器2报警距离2 public Integer dizhi0xF8;//F8.继电器2报警距离3"} public void reset() { dizhi0x2=""; dizhi0x4=""; dizhi0x6= 0; dizhi0x8= 0; dizhi0xA= 0; dizhi0xC= 0; dizhi0xE= 0; dizhi0x10= 0; dizhi0x12= 0; dizhi0x14= 0; dizhi0x16= ""; dizhi0x18= 0; dizhi0x1A= 0; dizhi0x1C= 0; dizhi0x1E= 0; dizhi0x20= 0; dizhi0x22=""; dizhi0x24=""; dizhi0x26=""; dizhi0x28=""; dizhi0x2A=""; dizhi0x2C=""; dizhi0x2E=""; dizhi0x30=""; dizhi0x32=""; dizhi0x34=""; dizhi0x36= 0; dizhi0x38= 0; dizhi0x3A= 0; dizhi0x3C= 0; dizhi0x3E= 0; dizhi0x40= 0; dizhi0x42= 0; dizhi0x44=""; dizhi0x46= 0; dizhi0x48= 0; dizhi0x4A="FFFF"; dizhi0x4C="FFFF"; dizhi0x4E= 0; dizhi0x50= 0; dizhi0x52= 0; dizhi0x54= 0; dizhi0x56= 0; dizhi0x58= 0; dizhi0x5A= 0; dizhi0x5C= 0; dizhi0x5E= 0; dizhi0x60= 0; dizhi0x62= 0; dizhi0x64= 0; dizhi0xF0= 0; dizhi0xF2= 0; dizhi0xF4= 0; dizhi0xF6= 0; dizhi0xF8= 0; } } public static AA5503Hex hexAA03; public static ParseResult parse(String message, String ip, int port) { if (message == null || message.isEmpty()) { return null; } hexAA03 = new AA5503Hex(); String[] hex = hex(message);//原始数据 ParseResult result = RESULT_CACHE.get(); result.reset(); String dizhi0x2Low = String.valueOf(hex[7]); String dizhi0x2High = String.valueOf(hex[8]); result.dizhi0x2 = "V" + Integer.parseInt(dizhi0x2High, 16) + "." + Integer.parseInt(dizhi0x2Low, 16); // 解析设备ID(偏移量0x4,2字节)- 低字节在前,高字节在后 String dizhi0x4Low = String.valueOf(hex[9]); String dizhi0x4High = String.valueOf(hex[10]); result.dizhi0x4 = dizhi0x4High + dizhi0x4Low; // 解析通信频率(偏移量0x6,2字节) String freqLow = String.valueOf(hex[11]); String freqHigh = String.valueOf(hex[12]); result.dizhi0x6 = Integer.parseInt(freqHigh + freqLow, 16); // 解析最大基站数(偏移量0x8,2字节) String maxStationsLow = String.valueOf(hex[13]); String maxStationsHigh = String.valueOf(hex[14]); result.dizhi0x8 = Integer.parseInt(maxStationsHigh + maxStationsLow, 16); // 解析最小基站数(偏移量0xA,2字节) String minStationsLow = String.valueOf(hex[15]); String minStationsHigh = String.valueOf(hex[16]); result.dizhi0xA = Integer.parseInt(minStationsHigh + minStationsLow, 16); // 解析距离校准值(偏移量0xC,2字节)- 有符号值 String calLow = String.valueOf(hex[17]); String calHigh = String.valueOf(hex[18]); int distanceCalValue = Integer.parseInt(calHigh + calLow, 16); result.dizhi0xC = (short) distanceCalValue; // 解析设备类型(偏移量0xE,2字节) String typeLow = String.valueOf(hex[19]); String typeHigh = String.valueOf(hex[20]); result.dizhi0xE = Integer.parseInt(typeHigh + typeLow, 16); // 解析基站主动测距(偏移量0x10,2字节) String rangingLow = String.valueOf(hex[21]); String rangingHigh = String.valueOf(hex[22]); result.dizhi0x10 = Integer.parseInt(rangingHigh + rangingLow, 16); // 解析报警设备(偏移量0x12,2字节) String alarmLow = String.valueOf(hex[23]); String alarmHigh = String.valueOf(hex[24]); result.dizhi0x12 = Integer.parseInt(alarmHigh + alarmLow, 16); // 解析IMU空闲时间(偏移量0x14,2字节) String imuLow = String.valueOf(hex[25]); String imuHigh = String.valueOf(hex[26]); result.dizhi0x14 = Integer.parseInt(imuHigh + imuLow, 16); // 解析压力基站ID(偏移量0x16,2字节) String pressureIdLow = String.valueOf(hex[27]); String pressureIdHigh = String.valueOf(hex[28]); result.dizhi0x16 = pressureIdHigh + pressureIdLow; // 解析外设控制(偏移量0x18,2字节) String peripheralLow = String.valueOf(hex[29]); String peripheralHigh = String.valueOf(hex[30]); result.dizhi0x18 = Integer.parseInt(peripheralHigh + peripheralLow, 16); // 解析配对ID(偏移量0x1a,2字节) String pairingLow = String.valueOf(hex[31]); String pairingHigh = String.valueOf(hex[32]); result.dizhi0x1A = Integer.parseInt(pairingHigh + pairingLow, 16); // 解析UWB开关状态(偏移量0x1c,2字节) String uwbLow = String.valueOf(hex[33]); String uwbHigh = String.valueOf(hex[34]); result.dizhi0x1C = Integer.parseInt(uwbHigh + uwbLow, 16); // 解析MODBUS模式(偏移量0x1e,2字节) String modbusLow = String.valueOf(hex[35]); String modbusHigh = String.valueOf(hex[36]); result.dizhi0x1E = Integer.parseInt(modbusHigh + modbusLow, 16); // 解析振动时长(偏移量0x20,2字节) String vibrationLow = String.valueOf(hex[37]); String vibrationHigh = String.valueOf(hex[38]); result.dizhi0x20 = Integer.parseInt(vibrationHigh + vibrationLow, 16); // 解析附近基站1-10(偏移量0x22到0x34,每个2字节) String near1Low = String.valueOf(hex[39]); String near1High = String.valueOf(hex[40]); result.dizhi0x22 = near1High + near1Low; String near2Low = String.valueOf(hex[41]); String near2High = String.valueOf(hex[42]); result.dizhi0x24 = near2High + near2Low; String near3Low = String.valueOf(hex[43]); String near3High = String.valueOf(hex[44]); result.dizhi0x26 = near3High + near3Low; String near4Low = String.valueOf(hex[45]); String near4High = String.valueOf(hex[46]); result.dizhi0x28 = near4High + near4Low; String near5Low = String.valueOf(hex[47]); String near5High = String.valueOf(hex[48]); result.dizhi0x2A = near5High + near5Low; String near6Low = String.valueOf(hex[49]); String near6High = String.valueOf(hex[50]); result.dizhi0x2C = near6High + near6Low; String near7Low = String.valueOf(hex[51]); String near7High = String.valueOf(hex[52]); result.dizhi0x2E = near7High + near7Low; String near8Low = String.valueOf(hex[53]); String near8High = String.valueOf(hex[54]); result.dizhi0x30 = near8High + near8Low; String near9Low = String.valueOf(hex[55]); String near9High = String.valueOf(hex[56]); result.dizhi0x32 = near9High + near9Low; String near10Low = String.valueOf(hex[57]); String near10High = String.valueOf(hex[58]); result.dizhi0x34 = near10High + near10Low; // 解析功率(偏移量0x36,2字节) String dizhi0x36Low = String.valueOf(hex[59]); String dizhi0x36High = String.valueOf(hex[60]); result.dizhi0x36 = Integer.parseInt(dizhi0x36High + dizhi0x36Low, 16); // 解析加速度计阈值(偏移量0x38,2字节) String accThreshLow = String.valueOf(hex[61]); String accThreshHigh = String.valueOf(hex[62]); result.dizhi0x38 = Integer.parseInt(accThreshHigh + accThreshLow, 16); // 解析空闲休眠时间(偏移量0x3a,2字节) String sleepLow = String.valueOf(hex[63]); String sleepHigh = String.valueOf(hex[64]); result.dizhi0x3A = Integer.parseInt(sleepHigh + sleepLow, 16); // 解析振动使能(偏移量0x3c,2字节) String vibEnableLow = String.valueOf(hex[65]); String vibEnableHigh = String.valueOf(hex[66]); result.dizhi0x3C = Integer.parseInt(vibEnableHigh + vibEnableLow, 16); // 解析加速度计使能(偏移量0x3e,2字节) String accEnableLow = String.valueOf(hex[67]); String accEnableHigh = String.valueOf(hex[68]); result.dizhi0x3E = Integer.parseInt(accEnableHigh + accEnableLow, 16); // 解析标签配置状态(偏移量0x40,2字节) String tagConfigLow = String.valueOf(hex[69]); String tagConfigHigh = String.valueOf(hex[70]); result.dizhi0x40 = Integer.parseInt(tagConfigHigh + tagConfigLow, 16); // 解析加速度计时长(偏移量0x42,2字节) String accDurationLow = String.valueOf(hex[71]); String accDurationHigh = String.valueOf(hex[72]); result.dizhi0x42 = Integer.parseInt(accDurationHigh + accDurationLow, 16); // 解析设备激活状态(偏移量0x44,2字节) String activationLow = String.valueOf(hex[73]); String activationHigh = String.valueOf(hex[74]); result.dizhi0x44 = String.valueOf(Integer.parseInt(activationHigh + activationLow, 16)); // 解析同步基站类型(偏移量0x46,2字节) String syncTypeLow = String.valueOf(hex[75]); String syncTypeHigh = String.valueOf(hex[76]); result.dizhi0x46 = Integer.parseInt(syncTypeHigh + syncTypeLow, 16); // 解析速度滤波限制(偏移量0x48,2字节) String speedFilterLow = String.valueOf(hex[77]); String speedFilterHigh = String.valueOf(hex[78]); result.dizhi0x48 = Integer.parseInt(speedFilterHigh + speedFilterLow, 16); // 白名单起始ID(偏移量0x4A,2字节) String dizhi0x4ALow = String.valueOf(hex[79]); String dizhi0x4AHigh = String.valueOf(hex[80]); result.dizhi0x4A = dizhi0x4AHigh + dizhi0x4ALow; // 白名单终止ID(偏移量0x4C,2字节) String dizhi0x4CLow = String.valueOf(hex[81]); String dizhi0x4CHigh = String.valueOf(hex[82]); result.dizhi0x4C = dizhi0x4CHigh + dizhi0x4CLow; // 固件类型(偏移量0x4E,2字节) String dizhi0x4ELow = String.valueOf(hex[83]); String dizhi0x4EHigh = String.valueOf(hex[84]); result.dizhi0x4E = Integer.parseInt(dizhi0x4EHigh + dizhi0x4ELow, 16); // 参考高度校准值(偏移量0x50,2字节)- 有符号值 String dizhi0x50Low = String.valueOf(hex[85]); String dizhi0x50High = String.valueOf(hex[86]); int pressureCalValue = Integer.parseInt(dizhi0x50High + dizhi0x50Low, 16); result.dizhi0x50 = (short) pressureCalValue; // 基站测距信息输出格式(偏移量0x52,2字节) String dizhi0x52Low = String.valueOf(hex[87]); String dizhi0x52High = String.valueOf(hex[88]); result.dizhi0x52 = Integer.parseInt(dizhi0x52High + dizhi0x52Low, 16); // 基站测距上限(偏移量0x54,2字节) String dizhi0x54Low = String.valueOf(hex[89]); String dizhi0x54High = String.valueOf(hex[90]); result.dizhi0x54 = Integer.parseInt(dizhi0x54High + dizhi0x54Low, 16); String dizhi0x56Low = String.valueOf(hex[91]); String dizhi0x56High = String.valueOf(hex[92]); result.dizhi0x56 = Integer.parseInt(dizhi0x56High + dizhi0x56Low, 16); String dizhi0x58Low = String.valueOf(hex[93]); String dizhi0x58High = String.valueOf(hex[94]); result.dizhi0x58 = Integer.parseInt(dizhi0x58High + dizhi0x58Low, 16); String dizhi0x5ALow = String.valueOf(hex[95]); String dizhi0x5AHigh = String.valueOf(hex[96]); result.dizhi0x5A = Integer.parseInt(dizhi0x5AHigh + dizhi0x5ALow, 16); String dizhi0x5CLow = String.valueOf(hex[97]); String dizhi0x5CHigh = String.valueOf(hex[98]); result.dizhi0x5C = Integer.parseInt(dizhi0x5CHigh + dizhi0x5CLow, 16); String dizhi0x5ELow = String.valueOf(hex[99]); String dizhi0x5EHigh = String.valueOf(hex[100]); result.dizhi0x5E = Integer.parseInt(dizhi0x5EHigh + dizhi0x5ELow, 16); // 解析模块重启(偏移量0x60,2字节) String restartLow = String.valueOf(hex[101]); String restartHigh = String.valueOf(hex[102]); result.dizhi0x60 = Integer.parseInt(restartHigh + restartLow, 16); // 解析恢复出厂设置(偏移量0x62,2字节) String factoryLow = String.valueOf(hex[103]); String factoryHigh = String.valueOf(hex[104]); result.dizhi0x62 = Integer.parseInt(factoryHigh + factoryLow, 16); // 解析开始升级(偏移量0x64,2字节) String upgradeLow = String.valueOf(hex[105]); String upgradeHigh = String.valueOf(hex[106]); result.dizhi0x64 = Integer.parseInt(upgradeHigh + upgradeLow, 16); // 设置hexAA03对象的值 hexAA03.setDizhi0x2(hex[7] + hex[8]); // 设置版本号 hexAA03.setDizhi0x4(hex[9] + hex[10]); // 设置设备ID hexAA03.setDizhi0x6(hex[11] + hex[12]); // 设置通信频率 hexAA03.setDizhi0x8(hex[13] + hex[14]); // 设置最大基站数 hexAA03.setDizhi0xA(hex[15] + hex[16]); // 设置最小基站数 hexAA03.setDizhi0xC(hex[17] + hex[18]); // 设置距离校准值 hexAA03.setDizhi0xE(hex[19] + hex[20]); // 设置设备类型 hexAA03.setDizhi0x10(hex[21] + hex[22]); // 设置基站主动测距 hexAA03.setDizhi0x12(hex[23] + hex[24]); // 设置报警设备 hexAA03.setDizhi0x14(hex[25] + hex[26]); // 设置IMU空闲时间 hexAA03.setDizhi0x16(hex[27] + hex[28]); // 设置压力基站ID hexAA03.setDizhi0x18(hex[29] + hex[30]); // 设置外设控制 hexAA03.setDizhi0x1A(hex[31] + hex[32]); // 设置配对ID hexAA03.setDizhi0x1C(hex[33] + hex[34]); // 设置UWB开关状态 hexAA03.setDizhi0x1E(hex[35] + hex[36]); // 设置Modbus模式 hexAA03.setDizhi0x20(hex[37] + hex[38]); // 设置振动时长 hexAA03.setDizhi0x22(hex[39] + hex[40]); // 设置附近基站1ID hexAA03.setDizhi0x24(hex[41] + hex[42]); // 设置附近基站2ID hexAA03.setDizhi0x26(hex[43] + hex[44]); // 设置附近基站3ID hexAA03.setDizhi0x28(hex[45] + hex[46]); // 设置附近基站4ID hexAA03.setDizhi0x2A(hex[47] + hex[48]); // 设置附近基站5ID hexAA03.setDizhi0x2C(hex[49] + hex[50]); // 设置附近基站6ID hexAA03.setDizhi0x2E(hex[51] + hex[52]); // 设置附近基站7ID hexAA03.setDizhi0x30(hex[53] + hex[54]); // 设置附近基站8ID hexAA03.setDizhi0x32(hex[55] + hex[56]); // 设置附近基站9ID hexAA03.setDizhi0x34(hex[57] + hex[58]); // 设置附近基站10ID hexAA03.setDizhi0x36(hex[59] + hex[60]); // 设置功率 hexAA03.setDizhi0x38(hex[61] + hex[62]); // 设置加速度计阈值 hexAA03.setDizhi0x3A(hex[63] + hex[64]); // 设置空闲休眠时间 hexAA03.setDizhi0x3C(hex[65] + hex[66]); // 设置振动使能 hexAA03.setDizhi0x3E(hex[67] + hex[68]); // 设置加速度计使能 hexAA03.setDizhi0x40(hex[69] + hex[70]); // 设置标签配置状态 hexAA03.setDizhi0x42(hex[71] + hex[72]); // 设置加速度计时长 hexAA03.setDizhi0x44(hex[73] + hex[74]); // 设置设备激活状态 hexAA03.setDizhi0x46(hex[75] + hex[76]); // 设置同步基站类型 hexAA03.setDizhi0x48(hex[77] + hex[78]); // 设置速度滤波限制 hexAA03.setDizhi0x4A(hex[79] + hex[80]); // 设置白名单起始ID hexAA03.setDizhi0x4C(hex[81] + hex[82]); // 设置白名单终止ID hexAA03.setDizhi0x4E(hex[83] + hex[84]); // 设置固件类型 hexAA03.setDizhi0x50(hex[85] + hex[86]); // 设置参考高度校准值 hexAA03.setDizhi0x52(hex[87] + hex[88]); // 设置基站测距信息输出格式 hexAA03.setDizhi0x54(hex[89] + hex[90]); // 设置基站测距上限 hexAA03.setDizhi0x56(hex[91] + hex[92]); hexAA03.setDizhi0x58(hex[93] + hex[94]); hexAA03.setDizhi0x5A(hex[95] + hex[96]); hexAA03.setDizhi0x5C(hex[97] + hex[98]); hexAA03.setDizhi0x5E(hex[99] + hex[100]); hexAA03.setDizhi0x60(hex[101] + hex[102]); hexAA03.setDizhi0x62(hex[103] + hex[104]); hexAA03.setDizhi0x64(hex[105] + hex[106]); return result; } public static ParseResult parse2(String message, String ip, int port) { if (message == null || message.isEmpty()) { return null; } hexAA03=new AA5503Hex(); String[] hex = hex(message);//原始数据 ParseResult result = RESULT_CACHE.get(); result.reset(); String dizhi0x2Low = String.valueOf(hex[7]); String dizhi0x2High = String.valueOf(hex[8]); result.dizhi0x2 = "V" + Integer.parseInt(dizhi0x2High, 16) + "." + Integer.parseInt(dizhi0x2Low, 16); // 解析设备ID(偏移量0x4,2字节)- 低字节在前,高字节在后 String dizhi0x4Low = String.valueOf(hex[9]); String dizhi0x4High = String.valueOf(hex[10]); result.dizhi0x4 = dizhi0x4High + dizhi0x4Low; // 解析通信频率(偏移量0x6,2字节) String freqLow = String.valueOf(hex[11]); String freqHigh = String.valueOf(hex[12]); result.dizhi0x6 = Integer.parseInt(freqHigh + freqLow, 16); // 解析最大基站数(偏移量0x8,2字节) String maxStationsLow = String.valueOf(hex[13]); String maxStationsHigh = String.valueOf(hex[14]); result.dizhi0x8 = Integer.parseInt(maxStationsHigh + maxStationsLow, 16); // 解析最小基站数(偏移量0xA,2字节) String minStationsLow = String.valueOf(hex[15]); String minStationsHigh = String.valueOf(hex[16]); result.dizhi0xA = Integer.parseInt(minStationsHigh + minStationsLow, 16); // 解析距离校准值(偏移量0xC,2字节)- 有符号值 String calLow = String.valueOf(hex[17]); String calHigh = String.valueOf(hex[18]); int distanceCalValue = Integer.parseInt(calHigh + calLow, 16); result.dizhi0xC = (short) distanceCalValue; // 解析设备类型(偏移量0xE,2字节) String typeLow = String.valueOf(hex[19]); String typeHigh = String.valueOf(hex[20]); result.dizhi0xE = Integer.parseInt(typeHigh + typeLow, 16); // 解析基站主动测距(偏移量0x10,2字节) String rangingLow = String.valueOf(hex[21]); String rangingHigh = String.valueOf(hex[22]); result.dizhi0x10 = Integer.parseInt(rangingHigh + rangingLow, 16); // 解析报警设备(偏移量0x12,2字节) String alarmLow = String.valueOf(hex[23]); String alarmHigh = String.valueOf(hex[24]); result.dizhi0x12 = Integer.parseInt(alarmHigh + alarmLow, 16); // 解析IMU空闲时间(偏移量0x14,2字节) String imuLow = String.valueOf(hex[25]); String imuHigh = String.valueOf(hex[26]); result.dizhi0x14 = Integer.parseInt(imuHigh + imuLow, 16); // 解析压力基站ID(偏移量0x16,2字节) String pressureIdLow = String.valueOf(hex[27]); String pressureIdHigh = String.valueOf(hex[28]); result.dizhi0x16 = pressureIdHigh + pressureIdLow; // 解析外设控制(偏移量0x18,2字节) String peripheralLow = String.valueOf(hex[29]); String peripheralHigh = String.valueOf(hex[30]); result.dizhi0x18 = Integer.parseInt(peripheralHigh + peripheralLow, 16); // 解析配对ID(偏移量0x1a,2字节) String pairingLow = String.valueOf(hex[31]); String pairingHigh = String.valueOf(hex[32]); result.dizhi0x1A = Integer.parseInt(pairingHigh + pairingLow, 16); // 解析UWB开关状态(偏移量0x1c,2字节) String uwbLow = String.valueOf(hex[33]); String uwbHigh = String.valueOf(hex[34]); result.dizhi0x1C = Integer.parseInt(uwbHigh + uwbLow, 16); // 解析MODBUS模式(偏移量0x1e,2字节) String modbusLow = String.valueOf(hex[35]); String modbusHigh = String.valueOf(hex[36]); result.dizhi0x1E = Integer.parseInt(modbusHigh + modbusLow, 16); // 解析振动时长(偏移量0x20,2字节) String vibrationLow = String.valueOf(hex[37]); String vibrationHigh = String.valueOf(hex[38]); result.dizhi0x20 = Integer.parseInt(vibrationHigh + vibrationLow, 16); // 解析附近基站1-10(偏移量0x22到0x34,每个2字节) String near1Low = String.valueOf(hex[39]); String near1High = String.valueOf(hex[40]); result.dizhi0x22 =near1High + near1Low; String near2Low = String.valueOf(hex[41]); String near2High = String.valueOf(hex[42]); result.dizhi0x24 =near2High + near2Low; String near3Low = String.valueOf(hex[43]); String near3High = String.valueOf(hex[44]); result.dizhi0x26 =near3High + near3Low; String near4Low = String.valueOf(hex[45]); String near4High = String.valueOf(hex[46]); result.dizhi0x28 =near4High + near4Low; String near5Low = String.valueOf(hex[47]); String near5High = String.valueOf(hex[48]); result.dizhi0x2A =near5High + near5Low; String near6Low = String.valueOf(hex[49]); String near6High = String.valueOf(hex[50]); result.dizhi0x2C =near6High + near6Low; String near7Low = String.valueOf(hex[51]); String near7High = String.valueOf(hex[52]); result.dizhi0x2E =near7High + near7Low; String near8Low = String.valueOf(hex[53]); String near8High = String.valueOf(hex[54]); result.dizhi0x30 =near8High + near8Low; String near9Low = String.valueOf(hex[55]); String near9High = String.valueOf(hex[56]); result.dizhi0x32 =near9High + near9Low; String near10Low = String.valueOf(hex[57]); String near10High = String.valueOf(hex[58]); result.dizhi0x34 =near10High + near10Low; // 解析功率(偏移量0x36,2字节) String dizhi0x36Low = String.valueOf(hex[59]); String dizhi0x36High = String.valueOf(hex[60]); result.dizhi0x36 = Integer.parseInt(dizhi0x36High + dizhi0x36Low, 16); // 解析加速度计阈值(偏移量0x38,2字节) String accThreshLow = String.valueOf(hex[61]); String accThreshHigh = String.valueOf(hex[62]); result.dizhi0x38 = Integer.parseInt(accThreshHigh + accThreshLow, 16); // 解析空闲休眠时间(偏移量0x3a,2字节) String sleepLow = String.valueOf(hex[63]); String sleepHigh = String.valueOf(hex[64]); result.dizhi0x3A = Integer.parseInt(sleepHigh + sleepLow, 16); // 解析振动使能(偏移量0x3c,2字节) String vibEnableLow = String.valueOf(hex[65]); String vibEnableHigh = String.valueOf(hex[66]); result.dizhi0x3C = Integer.parseInt(vibEnableHigh + vibEnableLow, 16); // 解析加速度计使能(偏移量0x3e,2字节) String accEnableLow = String.valueOf(hex[67]); String accEnableHigh = String.valueOf(hex[68]); result.dizhi0x3E = Integer.parseInt(accEnableHigh + accEnableLow, 16); // 解析标签配置状态(偏移量0x40,2字节) String tagConfigLow = String.valueOf(hex[69]); String tagConfigHigh = String.valueOf(hex[70]); result.dizhi0x40 = Integer.parseInt(tagConfigHigh + tagConfigLow, 16); // 解析加速度计时长(偏移量0x42,2字节) String accDurationLow = String.valueOf(hex[71]); String accDurationHigh = String.valueOf(hex[72]); result.dizhi0x42 = Integer.parseInt(accDurationHigh + accDurationLow, 16); // 解析设备激活状态(偏移量0x44,2字节) String activationLow = String.valueOf(hex[73]); String activationHigh = String.valueOf(hex[74]); result.dizhi0x44 =String.valueOf(Integer.parseInt(activationHigh + activationLow, 16)); // 解析同步基站类型(偏移量0x46,2字节) String syncTypeLow = String.valueOf(hex[75]); String syncTypeHigh = String.valueOf(hex[76]); result.dizhi0x46 = Integer.parseInt(syncTypeHigh + syncTypeLow, 16); // 解析速度滤波限制(偏移量0x48,2字节) String speedFilterLow = String.valueOf(hex[77]); String speedFilterHigh = String.valueOf(hex[78]); result.dizhi0x48 = Integer.parseInt(speedFilterHigh + speedFilterLow, 16); // 白名单起始ID(偏移量0x4A,2字节) String dizhi0x4ALow = String.valueOf(hex[79]); String dizhi0x4AHigh = String.valueOf(hex[80]); result.dizhi0x4A = dizhi0x4AHigh + dizhi0x4ALow; // 白名单终止ID(偏移量0x4C,2字节) String dizhi0x4CLow = String.valueOf(hex[81]); String dizhi0x4CHigh = String.valueOf(hex[82]); result.dizhi0x4C = dizhi0x4CHigh + dizhi0x4CLow; // 参考高度校准值(偏移量0x50,2字节)- 有符号值 String dizhi0x50Low = String.valueOf(hex[85]); String dizhi0x50High = String.valueOf(hex[86]); int pressureCalValue = Integer.parseInt(dizhi0x50High + dizhi0x50Low, 16); result.dizhi0x50 = (short) pressureCalValue; // 基站测距信息输出格式(偏移量0x52,2字节) String dizhi0x52Low = String.valueOf(hex[87]); String dizhi0x52High = String.valueOf(hex[88]); result.dizhi0x52 = Integer.parseInt(dizhi0x52High + dizhi0x52Low, 16); // 天线馈线长度(偏移量0x54,2字节) String dizhi0x54Low = String.valueOf(hex[89]); String dizhi0x54High = String.valueOf(hex[90]); result.dizhi0x54 = Integer.parseInt(dizhi0x54High + dizhi0x54Low, 16); String dizhi0x56Low = String.valueOf(hex[91]); String dizhi0x56High = String.valueOf(hex[92]); result.dizhi0x56 = Integer.parseInt(dizhi0x56High + dizhi0x56Low, 16); String dizhi0x58Low = String.valueOf(hex[93]); String dizhi0x58High = String.valueOf(hex[94]); result.dizhi0x58 = Integer.parseInt(dizhi0x58High + dizhi0x58Low, 16); String dizhi0x5ALow = String.valueOf(hex[95]); String dizhi0x5AHigh = String.valueOf(hex[96]); result.dizhi0x5A = Integer.parseInt(dizhi0x5AHigh + dizhi0x5ALow, 16); String dizhi0x5CLow = String.valueOf(hex[97]); String dizhi0x5CHigh = String.valueOf(hex[98]); result.dizhi0x5C = Integer.parseInt(dizhi0x5CHigh + dizhi0x5CLow, 16); String dizhi0x5ELow = String.valueOf(hex[99]); String dizhi0x5EHigh = String.valueOf(hex[100]); result.dizhi0x5E = Integer.parseInt(dizhi0x5EHigh + dizhi0x5ELow, 16); // 解析模块重启(偏移量0x60,2字节) String restartLow = String.valueOf(hex[101]); String restartHigh = String.valueOf(hex[102]); result.dizhi0x60 = Integer.parseInt(restartHigh + restartLow, 16); // 解析恢复出厂设置(偏移量0x62,2字节) String factoryLow = String.valueOf(hex[103]); String factoryHigh = String.valueOf(hex[104]); result.dizhi0x62 = Integer.parseInt(factoryHigh + factoryLow, 16); // 解析开始升级(偏移量0x64,2字节) String upgradeLow = String.valueOf(hex[105]); String upgradeHigh = String.valueOf(hex[106]); result.dizhi0x64 = Integer.parseInt(upgradeHigh + upgradeLow, 16); hexAA03.setDizhi0x2(hex[7] + hex[8]); // 设置版本号 hexAA03.setDizhi0x4(hex[9] + hex[10]); // 设置设备ID hexAA03.setDizhi0x6(hex[11] + hex[12]); // 设置通信频率 hexAA03.setDizhi0x8(hex[13] + hex[14]); // 设置最大基站数 hexAA03.setDizhi0xA(hex[15] + hex[16]); // 设置最小基站数 hexAA03.setDizhi0xC(hex[17] + hex[18]); // 设置距离校准值 hexAA03.setDizhi0xE(hex[19] + hex[20]); // 设置设备类型 hexAA03.setDizhi0x10(hex[21] + hex[22]); // 设置基站主动测距 hexAA03.setDizhi0x12(hex[23] + hex[24]); // 设置报警设备 hexAA03.setDizhi0x14(hex[25] + hex[26]); // 设置IMU空闲时间 hexAA03.setDizhi0x16(hex[27] + hex[28]); // 设置压力基站ID hexAA03.setDizhi0x18(hex[29] + hex[30]); // 设置外设控制 hexAA03.setDizhi0x1A(hex[31] + hex[32]); // 设置配对ID hexAA03.setDizhi0x1C(hex[33] + hex[34]); // 设置UWB开关状态 hexAA03.setDizhi0x1E(hex[35] + hex[36]); // 设置Modbus模式 hexAA03.setDizhi0x20(hex[37] + hex[38]); // 设置振动时长 hexAA03.setDizhi0x22(hex[39] + hex[40]); // 设置附近基站1ID hexAA03.setDizhi0x24(hex[41] + hex[42]); // 设置附近基站2ID hexAA03.setDizhi0x26(hex[43] + hex[44]); // 设置附近基站3ID hexAA03.setDizhi0x28(hex[45] + hex[46]); // 设置附近基站4ID hexAA03.setDizhi0x2A(hex[47] + hex[48]); // 设置附近基站5ID hexAA03.setDizhi0x2C(hex[49] + hex[50]); // 设置附近基站6ID hexAA03.setDizhi0x2E(hex[51] + hex[52]); // 设置附近基站7ID hexAA03.setDizhi0x30(hex[53] + hex[54]); // 设置附近基站8ID hexAA03.setDizhi0x32(hex[55] + hex[56]); // 设置附近基站9ID hexAA03.setDizhi0x34(hex[57] + hex[58]); // 设置附近基站10ID hexAA03.setDizhi0x36(hex[59] + hex[60]); // 设置功率 hexAA03.setDizhi0x38(hex[61] + hex[62]); // 设置加速度计阈值 hexAA03.setDizhi0x3A(hex[63] + hex[64]); // 设置空闲休眠时间 hexAA03.setDizhi0x3C(hex[65] + hex[66]); // 设置振动使能 hexAA03.setDizhi0x3E(hex[67] + hex[68]); // 设置加速度计使能 hexAA03.setDizhi0x40(hex[69] + hex[70]); // 设置标签配置状态 hexAA03.setDizhi0x42(hex[71] + hex[72]); // 设置加速度计时长 hexAA03.setDizhi0x44(hex[73] + hex[74]); // 设置设备激活状态 hexAA03.setDizhi0x46(hex[75] + hex[76]); // 设置同步基站类型 hexAA03.setDizhi0x48(hex[77] + hex[78]); // 设置速度滤波限制 hexAA03.setDizhi0x4A(hex[79] + hex[80]); // 设置白名单起始ID hexAA03.setDizhi0x4C(hex[81] + hex[82]); // 设置白名单终止ID hexAA03.setDizhi0x4E(hex[83] + hex[84]); // 设置固件类型 hexAA03.setDizhi0x50(hex[85] + hex[86]); // 设置参考高度校准值 hexAA03.setDizhi0x52(hex[87] + hex[88]); // 设置基站测距信息输出格式 hexAA03.setDizhi0x54(hex[89] + hex[90]); // 设置基站测距上限 hexAA03.setDizhi0x56(hex[91] + hex[92]); hexAA03.setDizhi0x58(hex[93] + hex[94]); hexAA03.setDizhi0x5A(hex[95] + hex[96]); hexAA03.setDizhi0x5C(hex[97] + hex[98]); hexAA03.setDizhi0x5E(hex[99] + hex[100]); hexAA03.setDizhi0x60(hex[101] + hex[102]); hexAA03.setDizhi0x62(hex[103] + hex[104]); hexAA03.setDizhi0x64(hex[105] + hex[106]); return result; } //55 AA 03 0F 03 F0 0A 04 00 10 64 00 0A 40 88 00 00 A6 FD public static ParseResult parse3(String message, String ip, int port) { if (message == null || message.isEmpty()) { return null; } hexAA03=new AA5503Hex(); String[] hex = hex(message);//原始数据 ParseResult result = RESULT_CACHE.get(); result.reset(); String dizhi0x2Low = String.valueOf(hex[7]); String dizhi0x2High = String.valueOf(hex[8]); result.dizhi0x2 = "V" + Integer.parseInt(dizhi0x2High, 16) + "." + Integer.parseInt(dizhi0x2Low, 16); // 解析设备ID(偏移量0x4,2字节)- 低字节在前,高字节在后 String dizhi0x4Low = String.valueOf(hex[9]); String dizhi0x4High = String.valueOf(hex[10]); result.dizhi0x4 = dizhi0x4High + dizhi0x4Low; // 解析通信频率(偏移量0x6,2字节) String freqLow = String.valueOf(hex[11]); String freqHigh = String.valueOf(hex[12]); result.dizhi0x6 = Integer.parseInt(freqHigh + freqLow, 16); // 解析最大基站数(偏移量0x8,2字节) String maxStationsLow = String.valueOf(hex[13]); String maxStationsHigh = String.valueOf(hex[14]); result.dizhi0x8 = Integer.parseInt(maxStationsHigh + maxStationsLow, 16); // 解析最小基站数(偏移量0xA,2字节) String minStationsLow = String.valueOf(hex[15]); String minStationsHigh = String.valueOf(hex[16]); result.dizhi0xA = Integer.parseInt(minStationsHigh + minStationsLow, 16); hexAA03.setDizhi0xF0(hex[7] + hex[8]); hexAA03.setDizhi0xF2(hex[9] + hex[10]); hexAA03.setDizhi0xF4(hex[11] + hex[12]); hexAA03.setDizhi0xF6(hex[13] + hex[14]); hexAA03.setDizhi0xF8(hex[15] + hex[16]); return result; } public static String convertAA5503HexToString(AA5503Hex hex) { if (hex == null) { return ""; } StringBuilder sb = new StringBuilder(); // 按照 AA5503Hex 类中字段的声明顺序拼接所有属性 sb.append(hex.getDizhi0x4()); sb.append(hex.getDizhi0x6()); sb.append(hex.getDizhi0x8()); sb.append(hex.getDizhi0xA()); sb.append(hex.getDizhi0xC()); sb.append(hex.getDizhi0xE()); sb.append(hex.getDizhi0x10()); sb.append(hex.getDizhi0x12()); sb.append(hex.getDizhi0x14()); sb.append(hex.getDizhi0x16()); sb.append(hex.getDizhi0x18()); sb.append(hex.getDizhi0x1A()); sb.append(hex.getDizhi0x1C()); sb.append(hex.getDizhi0x1E()); sb.append(hex.getDizhi0x20()); sb.append(hex.getDizhi0x22()); sb.append(hex.getDizhi0x24()); sb.append(hex.getDizhi0x26()); sb.append(hex.getDizhi0x28()); sb.append(hex.getDizhi0x2A()); sb.append(hex.getDizhi0x2C()); sb.append(hex.getDizhi0x2E()); sb.append(hex.getDizhi0x30()); sb.append(hex.getDizhi0x32()); sb.append(hex.getDizhi0x34()); sb.append(hex.getDizhi0x36()); sb.append(hex.getDizhi0x38()); sb.append(hex.getDizhi0x3A()); sb.append(hex.getDizhi0x3C()); sb.append(hex.getDizhi0x3E()); sb.append(hex.getDizhi0x40()); sb.append(hex.getDizhi0x42()); sb.append(hex.getDizhi0x44()); sb.append(hex.getDizhi0x46()); sb.append(hex.getDizhi0x48()); sb.append(hex.getDizhi0x4A()); sb.append(hex.getDizhi0x4C()); sb.append(hex.getDizhi0x4E()); sb.append(hex.getDizhi0x50()); sb.append(hex.getDizhi0x52()); sb.append(hex.getDizhi0x54()); sb.append(hex.getDizhi0x56()); sb.append(hex.getDizhi0x58()); System.out.println(sb.toString()); return sb.toString(); } public static String convertAA5503HexToString2(AA5503Hex hex) { if (hex == null) { return ""; } StringBuilder sb = new StringBuilder(); // 按照 AA5503Hex 类中字段的声明顺序拼接所有属性 sb.append(hex.getDizhi0xF0()); sb.append(hex.getDizhi0xF2()); sb.append(hex.getDizhi0xF4()); sb.append(hex.getDizhi0xF6()); sb.append(hex.getDizhi0xF8()); System.out.println(sb.toString()); return sb.toString(); } public static byte[] getpeizhihex(AA5503Hex hex){ String hex0="55AA035B020456"+convertAA5503HexToString(hex); String hex1="55AA035B020456"+convertAA5503HexToString(hex)+"FFFF"; String jiaoyan=PacketParser.calculateChecksum(hex1); String hex2=hex0+jiaoyan; byte[] bytes =hexStringToByteArray(hex2); return bytes; } public static byte[] getpeizhihex2(AA5503Hex hex){ String hex0="55AA030F02F00A"+convertAA5503HexToString2(hex); String hex1="55AA030F02F00A"+convertAA5503HexToString2(hex)+"FFFF"; String jiaoyan=PacketParser.calculateChecksum(hex1); String hex2=hex0+jiaoyan; byte[] bytes =hexStringToByteArray(hex2); return bytes; } public static byte[] alertTagid(String tagid) { String tagid1=getTagid(tagid); String hex1="55AA0307020402"+tagid1+"FFFF"; String jiaoyan=PacketParser.calculateChecksum(hex1); String hex2="55AA0307020402"+tagid1+jiaoyan; byte[] bytes=hexStringToByteArray(hex2); return bytes; } public static byte[] readJDQ() { String hex2 = "55AA030601F00A00FBFE"; byte[] bytes=hexStringToByteArray(hex2); return bytes; } public static byte[] tagidAndHz(String tagid,int Hz) { String tagid1=getTagid(tagid); String Hz1=getintHz(Hz); String hex1="55AA0309020404"+tagid1+Hz1+"FFFF"; String jiaoyan=PacketParser.calculateChecksum(hex1); String hex2="55AA0309020404"+tagid1+Hz1+jiaoyan; byte[] bytes=hexStringToByteArray(hex2); return bytes; } /**升级指令*/ public static byte[] shengjizhiling() { String hex="55AA030702640201008CFF"; byte[] byt = hexToBytes(hex); return byt; } /** * 将十六进制字符串转换成 byte[],允许空格、大小写混合。 * 例如: "55AA030702640201008CFF" → {0x55, (byte)0xAA, 0x03 ...} */ public static byte[] hexToBytes(String hex) { byte[] out=hexStringToByteArray(hex); return out; } /**升级指令*/ public static byte[] UpgradeCommand() { byte[] byt=WriteData((byte)0x64,(byte)0x2,1); return byt; } /**重启指令*/ public static byte[] RestartCommand() { byte[] byt=WriteData((byte)0x60,(byte)0x2,1); return byt; } /**恢复出厂设置*/ public static byte[] RestoreFactorySettings() { byte[] byt=WriteData((byte)0x62,(byte)0x2,1); return byt; } public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X", b)); // 去掉格式字符串中的空格 } return sb.toString(); // 此时已无需trim() } /** * 写串口数据包 * * @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; } /** * 16进制的字符串表示转成字节数组 * * @param hexString 16进制格式的字符串 * @return 转换后的字节数组 **/ public static byte[] toByteArray(String hexString) { byte[] byteArray = null; if (hexString != null || hexString != "") { hexString = hexString.replaceAll(" ", ""); 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; } /**10进制转字节数组*/ 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; } public static String[] hex(String message) { int size=message.length()/2; String[] hex=new String[size]; for(int i=0;i