| | |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | import chuankou.SerialPortService; |
| | | import publicway.ProtocolParser01.ParseResult; |
| | | |
| | | public class SerialProtocolParser { |
| | |
| | | */ |
| | | public void start() { |
| | | if (isRunning) { |
| | | System.out.println("串口协议解析器已经在运行中"); |
| | | //System.out.println("串口协议解析器已经在运行中"); |
| | | return; |
| | | } |
| | | |
| | |
| | | processorThread.setDaemon(true); |
| | | processorThread.start(); |
| | | |
| | | System.out.println("串口协议解析器已启动"); |
| | | //System.out.println("串口协议解析器已启动"); |
| | | } |
| | | |
| | | /** |
| | |
| | | batchQueue.clear(); |
| | | bufferPosition = 0; |
| | | |
| | | System.out.println("串口协议解析器已停止"); |
| | | //System.out.println("串口协议解析器已停止"); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | public void receiveData(byte[] rawData) { |
| | | if (!isRunning) { |
| | | System.out.println("警告: 串口协议解析器未启动,忽略接收的数据"); |
| | | //System.out.println("警告: 串口协议解析器未启动,忽略接收的数据"); |
| | | return; |
| | | } |
| | | |
| | |
| | | long maxMem = runtime.maxMemory(); |
| | | |
| | | if (usedMem > maxMem * 0.8) { |
| | | System.out.println("内存使用率超过80%,当前使用: " + (usedMem / 1024 / 1024) + "MB"); |
| | | //System.out.println("内存使用率超过80%,当前使用: " + (usedMem / 1024 / 1024) + "MB"); |
| | | } |
| | | } |
| | | |
| | |
| | | * 处理数据包的主方法 |
| | | */ |
| | | private void processPackets() { |
| | | System.out.println("串口数据包处理线程开始运行"); |
| | | //System.out.println("串口数据包处理线程开始运行"); |
| | | |
| | | while (isRunning && !Thread.currentThread().isInterrupted()) { |
| | | try { |
| | | byte[] packet = dataQueue.take(); // 阻塞直到有数据 |
| | | parsePacket(packet); |
| | | } catch (InterruptedException e) { |
| | | System.out.println("串口数据包处理线程被中断"); |
| | | //System.out.println("串口数据包处理线程被中断"); |
| | | Thread.currentThread().interrupt(); |
| | | break; |
| | | } catch (Exception e) { |
| | |
| | | } |
| | | } |
| | | |
| | | System.out.println("串口数据包处理线程结束运行"); |
| | | //System.out.println("串口数据包处理线程结束运行"); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | private void parsePacket(byte[] packet) { |
| | | try { |
| | | SerialPortService.getReceivedDataCount(); |
| | | // 解析基本字段 |
| | | byte hostAddress = packet[4]; // 主机地址 |
| | | byte slotAddress = packet[5]; // 卡槽地址 |
| | |
| | | // 使用优化的字节数组解析方法,避免字符串转换 |
| | | ParseResult rst = ProtocolParser01.parseDDCC01Data(packet); |
| | | rst.fuzhi(); |
| | | rst.toString(); |
| | | // rst.toString(); |
| | | } |
| | | break; |
| | | case FUNCTION_51: |
| | |
| | | String hexPacket = bytesToHex(packet); |
| | | int result = ProtocolParser51.parse(hexPacket); |
| | | if (result == 1) { |
| | | System.out.println("功能码 0x51 - 开门控制成功"); |
| | | //System.out.println("功能码 0x51 - 开门控制成功"); |
| | | } else { |
| | | System.out.println("功能码 0x51 - 开门控制失败或报文不合法"); |
| | | //System.out.println("功能码 0x51 - 开门控制失败或报文不合法"); |
| | | } |
| | | break; |
| | | case FUNCTION_52: |
| | | System.out.println("功能码 0x52 - LED亮度控制"); |
| | | //System.out.println("功能码 0x52 - LED亮度控制"); |
| | | break; |
| | | case FUNCTION_80: |
| | | System.out.println("功能码 0x80 - 工卡升级使能"); |
| | | //System.out.println("功能码 0x80 - 工卡升级使能"); |
| | | break; |
| | | case FUNCTION_81: |
| | | System.out.println("功能码 0x81 - 工作卡升级数据包"); |
| | | //System.out.println("功能码 0x81 - 工作卡升级数据包"); |
| | | break; |
| | | case FUNCTION_82: |
| | | System.out.println("功能码 0x82 - 单板升级使能"); |
| | | //System.out.println("功能码 0x82 - 单板升级使能"); |
| | | break; |
| | | case FUNCTION_83: |
| | | System.out.println("功能码 0x83 - 单板升级数据包"); |
| | | //System.out.println("功能码 0x83 - 单板升级数据包"); |
| | | break; |
| | | default: |
| | | System.err.println("未知功能码: 0x" + Integer.toHexString(functionCode & 0xFF)); |