已添加7个文件
已修改25个文件
已重命名1个文件
| | |
| | | import dell_targets.Dell_BaseStation; |
| | | import dell_targets.Dell_SystemConfiguration; |
| | | import dell_targets.Dell_tag; |
| | | import publicsWay.UDPPortAReceiver; |
| | | import scheduled_task.TrackTableManager; |
| | | import udptcp.UDPPortAReceiver; |
| | | import udptcp.UDPPortBReceiver; |
| | | |
| | | public class Chushihua { |
| | | public static void getchushihua() { |
| | |
| | | Dell_tag.getlocationTags(); |
| | | Dell_BaseStation.getBaseStations(); |
| | | UDPPortAReceiver.startReceiver(); |
| | | UDPPortBReceiver.startReceiver(); |
| | | Dell_Map.getAllMaps(); |
| | | Dell_Fence.getAllFences(); |
| | | Dell_company.getAllCompanies(); |
| | | Dell_LayerManagement.getAllLayers(); |
| | | Dell_GroupManagement.getAllGroups(); |
| | | if(Dell_SystemConfiguration.gnsstoxyOpen) {Dell_Map.get_foor_xycs();} |
| | | if(Dell_SystemConfiguration.gnsstoxyOpen) {Dell_Map.get_foor_xycs();} |
| | | TrackTableManager.Start();//çæå½è½¨è¿¹è¡¨ |
| | | } catch (SQLException e) { |
| | | // TODO èªå¨çæç catch å |
| | | e.printStackTrace(); |
| | |
| | | case "FIELD_VALIDATION_FAIL": return "åæ®µéªè¯å¤±è´¥"; |
| | | case "DEVICE_ID_EXISTS": return "设å¤ç¼å·å·²åå¨"; |
| | | case "INVALID_NUMBER_FORMAT": return "æ æçæ°åæ ¼å¼"; |
| | | case "DB_DDL_ERROR": return "æ§è¡DDLè¯å¥å¤±è´¥"; |
| | | case "DB_BATCH_INSERT_ERROR": return "æ¹éæå
¥å¤±è´¥"; |
| | | // æ·»å 缺失çé® |
| | | case "DB_QUERY_ERROR": return "æ°æ®åºæ¥è¯¢å¤±è´¥"; |
| | | default: |
| | |
| | | "FIELD_VALIDATION_FAIL", |
| | | "DEVICE_ID_EXISTS", |
| | | "INVALID_NUMBER_FORMAT", |
| | | "DB_DDL_ERROR", |
| | | "DB_BATCH_INSERT_ERROR", |
| | | "DB_QUERY_ERROR" // æ·»å 缺失çé® |
| | | ) |
| | | ); |
| | |
| | | return pstmt.executeQuery(); |
| | | } |
| | | |
| | | // å¨DBConnectorç±»ä¸æ·»å 以䏿¹æ³ |
| | | |
| | | /** |
| | | * æ£æ¥è¡¨æ¯å¦åå¨ |
| | | */ |
| | | public static boolean tableExists(String tableName) { |
| | | try (Connection conn = connectToDatabase()) { |
| | | if (conn == null) return false; |
| | | try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) { |
| | | return rs.next(); |
| | | } |
| | | } catch (SQLException e) { |
| | | logError("DB_QUERY_ERROR", "æ£æ¥è¡¨æ¯å¦åå¨å¤±è´¥: " + e.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡DDLè¯å¥ï¼å建表çï¼ |
| | | */ |
| | | public static boolean executeDDL(String ddlSQL) { |
| | | try (Connection conn = connectToDatabase(); |
| | | Statement stmt = conn.createStatement()) { |
| | | stmt.execute(ddlSQL); |
| | | return true; |
| | | } catch (SQLException e) { |
| | | logError("DB_DDL_ERROR", "æ§è¡DDLè¯å¥å¤±è´¥: " + e.getMessage() + "\nDDL: " + ddlSQL); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡æ¹éæ´æ°æä½ |
| | | */ |
| | | public static int executeBatchUpdate(String sql, List<Object[]> paramsList) { |
| | | try (Connection conn = connectToDatabase(); |
| | | PreparedStatement pstmt = conn.prepareStatement(sql)) { |
| | | |
| | | for (Object[] params : paramsList) { |
| | | for (int i = 0; i < params.length; i++) { |
| | | pstmt.setObject(i + 1, params[i]); |
| | | } |
| | | pstmt.addBatch(); |
| | | } |
| | | |
| | | int[] results = pstmt.executeBatch(); |
| | | return results.length; |
| | | } catch (SQLException e) { |
| | | logError("DB_BATCH_INSERT_ERROR", "æ¹éæå
¥å¤±è´¥: " + e.getMessage() + "\nSQL: " + sql); |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | public int distance; // è·ç¦»(毫米) |
| | | public int power; // çµé(0-100) |
| | | public int buttonPressed; // æé®ç¶æ |
| | | |
| | | public boolean buttonPressed2; |
| | | public void reset() { |
| | | sequenceNum = 0; |
| | | tagId = ""; |
| | |
| | | distance = 0; |
| | | power = 0; |
| | | buttonPressed = 0; |
| | | buttonPressed2=false; |
| | | } |
| | | } |
| | | |
| | |
| | | * @return è§£æç»æ(é误æ¶è¿ånull) |
| | | */ |
| | | public static ParseResult parse(String message, String ip, int port) { |
| | | if (message == null || message.isEmpty()) { |
| | | return null; |
| | | } |
| | | if (message == null || message.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | // æ¸
æ´æ°æ®ï¼ç§»é¤ææéåå
è¿å¶å符 |
| | | char[] cleanedMessage = cleanMessage(message); |
| | | // æ¸
æ´æ°æ®ï¼ç§»é¤ææéåå
è¿å¶å符 |
| | | char[] cleanedMessage = cleanMessage(message); |
| | | |
| | | // æ°æ®æ ¡éª |
| | | if (cleanedMessage == null || cleanedMessage.length < MIN_LENGTH) { |
| | | return null; |
| | | } |
| | | // æ°æ®æ ¡éª |
| | | if (cleanedMessage == null || cleanedMessage.length < MIN_LENGTH) { |
| | | return null; |
| | | } |
| | | |
| | | // åè®®å¤´æ ¡éª (55AA01) |
| | | if (!new String(cleanedMessage, 0, 6).equals(EXPECTED_HEADER)) { |
| | | return null; |
| | | } |
| | | // åè®®å¤´æ ¡éª (55AA01) |
| | | if (!new String(cleanedMessage, 0, 6).equals(EXPECTED_HEADER)) { |
| | | return null; |
| | | } |
| | | |
| | | ParseResult result = RESULT_CACHE.get(); |
| | | result.reset(); |
| | | ParseResult result = RESULT_CACHE.get(); |
| | | result.reset(); |
| | | |
| | | try { |
| | | if (cleanedMessage.length < 30) { // ç¡®ä¿æè¶³å¤é¿åº¦è®¿é®charAt(28) |
| | | return null; |
| | | } |
| | | try { |
| | | if (cleanedMessage.length < 30) { // ç¡®ä¿æè¶³å¤é¿åº¦è®¿é®charAt(28) |
| | | return null; |
| | | } |
| | | |
| | | // è§£æåºåå· (ä½ç½®8-9) |
| | | result.sequenceNum = HexUtils.fastHexToByte(cleanedMessage[8], cleanedMessage[9]); |
| | | // è§£æåºåå· (ä½ç½®8-9) |
| | | result.sequenceNum = HexUtils.fastHexToByte(cleanedMessage[8], cleanedMessage[9]); |
| | | |
| | | // è§£ææ ç¾ID (ä½ç½®10-13, å°ç«¯åº) |
| | | result.tagId = new String(new char[]{ |
| | | cleanedMessage[12], cleanedMessage[13], // é«ä½ |
| | | cleanedMessage[10], cleanedMessage[11] // ä½ä½ |
| | | }); |
| | | // è§£ææ ç¾ID (ä½ç½®10-13, å°ç«¯åº) |
| | | result.tagId = new String(new char[]{ |
| | | cleanedMessage[12], cleanedMessage[13], // é«ä½ |
| | | cleanedMessage[10], cleanedMessage[11] // ä½ä½ |
| | | }); |
| | | |
| | | // è§£æéç¹ID (ä½ç½®14-17, å°ç«¯åº) |
| | | result.anchorId = new String(new char[]{ |
| | | cleanedMessage[16], cleanedMessage[17], // é«ä½ |
| | | cleanedMessage[14], cleanedMessage[15] // ä½ä½ |
| | | }); |
| | | // è§£æéç¹ID (ä½ç½®14-17, å°ç«¯åº) |
| | | result.anchorId = new String(new char[]{ |
| | | cleanedMessage[16], cleanedMessage[17], // é«ä½ |
| | | cleanedMessage[14], cleanedMessage[15] // ä½ä½ |
| | | }); |
| | | |
| | | // è§£æè·ç¦» (ä½ç½®18-25, 4åèå°ç«¯æ´æ°) |
| | | int b0 = HexUtils.fastHexToByte(cleanedMessage[18], cleanedMessage[19]); // æä½ä½ |
| | | int b1 = HexUtils.fastHexToByte(cleanedMessage[20], cleanedMessage[21]); |
| | | int b2 = HexUtils.fastHexToByte(cleanedMessage[22], cleanedMessage[23]); |
| | | int b3 = HexUtils.fastHexToByte(cleanedMessage[24], cleanedMessage[25]); // æé«ä½ |
| | | int raw = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0; |
| | | result.distance = raw; // ä¿æåå§æ´æ°å¼ |
| | | // è§£æè·ç¦» (ä½ç½®18-25, 4åèå°ç«¯æ´æ°) |
| | | int b0 = HexUtils.fastHexToByte(cleanedMessage[18], cleanedMessage[19]); // æä½ä½ |
| | | int b1 = HexUtils.fastHexToByte(cleanedMessage[20], cleanedMessage[21]); |
| | | int b2 = HexUtils.fastHexToByte(cleanedMessage[22], cleanedMessage[23]); |
| | | int b3 = HexUtils.fastHexToByte(cleanedMessage[24], cleanedMessage[25]); // æé«ä½ |
| | | int raw = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0; |
| | | result.distance = raw; // ä¿æåå§æ´æ°å¼ |
| | | |
| | | // è§£æçµé (ä½ç½®26-27) |
| | | result.power = HexUtils.fastHexToByte(cleanedMessage[26], cleanedMessage[27]); |
| | | // è§£æçµé (ä½ç½®26-27) |
| | | result.power = HexUtils.fastHexToByte(cleanedMessage[26], cleanedMessage[27]); |
| | | |
| | | // è§£ææé®ç¶æ (ä½ç½®28-29) |
| | | result.buttonPressed = HexUtils.fastHexToByte(cleanedMessage[28], cleanedMessage[29]); |
| | | // è§£ææé®ç¶æ (ä½ç½®28-29) |
| | | result.buttonPressed = HexUtils.fastHexToByte(cleanedMessage[28], cleanedMessage[29]); |
| | | result.buttonPressed2 =result.buttonPressed==1; |
| | | // æ¥å¿åæ´æ°æä½å¯ä»¥èèä¼åæåå°è°ç¨é¢ç |
| | | if (MessageViewPanel.isWindowVisible) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("55AA01 Seq:") |
| | | .append(result.sequenceNum) |
| | | .append(",Tagid:") |
| | | .append(result.tagId) |
| | | .append(",Anchorid:") |
| | | .append(result.anchorId) |
| | | .append(",Distance:") |
| | | .append(result.distance) |
| | | .append(",Power:") |
| | | .append(result.power) |
| | | .append(",Button:") |
| | | .append(result.buttonPressed); |
| | | MessageViewPanel.showData(sb.toString(), ip, port, 0, "UDPA", "55AA01", "ALL"); |
| | | } |
| | | |
| | | // æ¥å¿åæ´æ°æä½å¯ä»¥èèä¼åæåå°è°ç¨é¢ç |
| | | String hexData = "55AA01 å
åº:" + result.sequenceNum + ",æ ç¾ç¼å·:" + result.tagId + ",åºç«ç¼å·:" + result.anchorId + |
| | | ",è·ç¦»:" + result.distance + ",çµé:" + result.power + |
| | | ",æé®ç¶æ:" + result.buttonPressed; |
| | | MessageViewPanel.showData(hexData, ip, port, 0, "UDPA", "55AA01", "ALL"); |
| | | String time = EfficientTimeFormatter.getCurrentTimeFormatted(); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "ipAddress", ip); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "port", port + ""); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "status", "1"); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "onlineTime", time); |
| | | |
| | | String time = EfficientTimeFormatter.getCurrentTimeFormatted(); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "ipAddress", ip); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "port", port + ""); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "status", "1"); |
| | | Dell_BaseStation.updateBaseStationProperty(result.anchorId, "onlineTime", time); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "sosStatus", result.buttonPressed + ""); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "onlineStatus", "1"); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "lastUwbSignalTime", time); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingSeq", result.sequenceNum + ""); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingBaseId", result.anchorId); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingDistance", result.distance + ""); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingBaseCount", "1"); |
| | | |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "sosStatus", result.buttonPressed + ""); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "onlineStatus", "1"); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "lastUwbSignalTime", time); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingSeq", result.sequenceNum + ""); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingBaseId", result.anchorId); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingDistance", result.distance + ""); |
| | | Dell_tag.updateLocationTagProperty(result.tagId, "latestRangingBaseCount", "1"); |
| | | } catch (IndexOutOfBoundsException | NumberFormatException e) { |
| | | System.err.println("Parsing error in packet from " + ip + ":" + port); |
| | | return null; |
| | | } |
| | | |
| | | } catch (IndexOutOfBoundsException | NumberFormatException e) { |
| | | System.err.println("Parsing error in packet from " + ip + ":" + port); |
| | | return null; |
| | | } |
| | | |
| | | return result; |
| | | return result; |
| | | } |
| | | |
| | | private static char[] cleanMessage(String message) { |
| | | char[] cleaned = new char[message.length()]; |
| | | int j = 0; |
| | | for (char c : message.toCharArray()) { |
| | | if (Character.isDigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) { |
| | | cleaned[j++] = Character.toUpperCase(c); |
| | | } |
| | | } |
| | | if (j == 0) return null; |
| | | return Arrays.copyOf(cleaned, j); |
| | | char[] cleaned = new char[message.length()]; |
| | | int j = 0; |
| | | for (char c : message.toCharArray()) { |
| | | if (Character.isDigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) { |
| | | cleaned[j++] = Character.toUpperCase(c); |
| | | } |
| | | } |
| | | if (j == 0) return null; |
| | | return Arrays.copyOf(cleaned, j); |
| | | } |
| | | |
| | | public static void updateBase(String baseStationId, String propertyName, String value) { |
| | |
| | | package dell55AAData; |
| | | |
| | | import dell_system.MessageViewPanel; |
| | | import dell_targets.Dell_BaseStation; |
| | | import publicsWay.EfficientTimeFormatter; |
| | | |
| | | public class Dell55AA02Parser { |
| | | private static final String EXPECTED_HEADER = "55AA02"; |
| | | private static final int MIN_LENGTH = 36; // 18åè * 2å符/åè |
| | | private static final int BASE_ID_START = 8; // åºç«IDèµ·å§ä½ç½®(第4åè) |
| | | private static final int SYNC_STATUS_START = 12; // åæ¥ç¶æèµ·å§ä½ç½®(第5åè) |
| | | private static final int PRESSURE_START = 14; // æ°åå¼èµ·å§ä½ç½®(第6åè) |
| | | private static final int SYNC_STATUS_START = 12; // åæ¥ç¶æèµ·å§ä½ç½®(第5åè) |
| | | private static final int PRESSURE_START = 14; // æ°åå¼èµ·å§ä½ç½®(第6åè) |
| | | private static final int MIN_MESSAGE_LENGTH = 22; // æå°æææ°æ®é¿åº¦ |
| | | |
| | | // éç¨StringBuilderåå°å
ååé
|
| | | private static final ThreadLocal<StringBuilder> hexDataBuilder = |
| | | ThreadLocal.withInitial(() -> new StringBuilder(64)); |
| | | |
| | | /** |
| | | * è§£æ55AA02æ ¼å¼çåºç«æ°æ® |
| | | * é«æè§£æ55AA02æ ¼å¼çåºç«æ°æ® |
| | | * @param message æ¥æ¶å°çæ°æ®ï¼åå
è¿å¶åç¬¦ä¸²ï¼ |
| | | */ |
| | | public static void parseAndUpdate(String message) { |
| | | public static void parse(String message, String ip, int port) { |
| | | // 1. åºç¡æ ¡éª |
| | | if (message == null || message.length() < MIN_LENGTH) { |
| | | if (message == null || message.length() < MIN_MESSAGE_LENGTH) { |
| | | return; |
| | | } |
| | | |
| | | // 2. 头鍿 ¡éªï¼åºå®å¼å¤´åç¬¦ä¸²ï¼ |
| | | for (int i = 0; i < EXPECTED_HEADER.length(); i++) { |
| | | if (message.charAt(i) != EXPECTED_HEADER.charAt(i)) { |
| | | return; |
| | | } |
| | | } |
| | | // 2. è§£ææ ç¾ID (ä½ç½®8-11, å°ç«¯åº) |
| | | char c8 = message.charAt(8); |
| | | char c9 = message.charAt(9); |
| | | char c10 = message.charAt(10); |
| | | char c11 = message.charAt(11); |
| | | |
| | | // 3. è§£æåºç«IDï¼åå§æ°æ®åç¬¦ä¸²ï¼ |
| | | String baseId = new String(new char[]{ |
| | | message.charAt(BASE_ID_START), |
| | | message.charAt(BASE_ID_START + 1), |
| | | message.charAt(BASE_ID_START + 2), |
| | | message.charAt(BASE_ID_START + 3) |
| | | }); |
| | | // ç´æ¥æå»ºbaseIdå符串 |
| | | String baseId = new String(new char[]{c10, c11, c8, c9}); |
| | | |
| | | // 4. è§£æåæ¥ç¶æï¼1åèï¼ |
| | | char syncChar = message.charAt(SYNC_STATUS_START + 1); // åç¶æå符 |
| | | String syncStatus = (syncChar == '0') ? "0" : "1"; |
| | | // 3. è§£æåæ¥ç¶æï¼1åèï¼ |
| | | char syncStatusChar = message.charAt(SYNC_STATUS_START + 1); |
| | | String syncStatus = (syncStatusChar == '0') ? "0" : "1"; |
| | | |
| | | // 5. è§£ææ°åå¼ï¼4åèå°ç«¯åºï¼ |
| | | // 4. é«æè§£ææ°åå¼ï¼4åèå°ç«¯åºï¼ |
| | | int pressure = 0; |
| | | for (int i = 0; i < 8; i += 2) { |
| | | int idx = PRESSURE_START + i; |
| | |
| | | int byteValue = HexUtils.fastHexToByte(message.charAt(idx), message.charAt(idx + 1)); |
| | | pressure |= (byteValue << (i * 4)); // å°ç«¯åå¹¶ |
| | | } |
| | | String pressureStr = String.valueOf(pressure); |
| | | |
| | | // 6. æ´æ°åºç«æ°æ® |
| | | updateBaseStationData(baseId, syncStatus ,pressureStr); |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°åºç«æ°æ® |
| | | * @param baseId åºç«ID |
| | | * @param syncStatus åæ¥ç¶æ |
| | | * @param pressure æ°åå¼å符串 |
| | | */ |
| | | private static void updateBaseStationData(String baseId, String syncStatus, String pressure) { |
| | | // 5. æ´æ°åºç«æ°æ® |
| | | if (MessageViewPanel.isWindowVisible) { |
| | | StringBuilder sb = hexDataBuilder.get(); |
| | | sb.setLength(0); |
| | | sb.append("55AA02 AnchorHeart,Anchorid:") |
| | | .append(baseId) |
| | | .append(",SyncStatus:") |
| | | .append(syncStatus) |
| | | .append(",Pressure:") |
| | | .append(pressure); |
| | | MessageViewPanel.showData(sb.toString(), ip, port, 0, "UDPA", "55AA02", baseId); |
| | | } |
| | | |
| | | // å»¶è¿å建æ¶é´å符串ç´å°å¿
è¦æ¶å» |
| | | String time = EfficientTimeFormatter.getCurrentTimeFormatted(); |
| | | |
| | | // 使ç¨é¢åé
å符串常éåå°å
ååé
|
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "ipAddress", ip); |
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "port", Integer.toString(port)); |
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "status", "1"); |
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "onlineTime", time); |
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "syncStatus", syncStatus); |
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "barometerReading", pressure); |
| | | Dell_BaseStation.updateBaseStationProperty(baseId, "barometerReading", Integer.toString(pressure)); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | package dell55AAData; |
| | | |
| | | import dell_system.MessageViewPanel; |
| | | |
| | | public class Dell55AA12HighPerf { |
| | | |
| | | // å议常é |
| | |
| | | private static final int MIN_LENGTH = 34; // æå°æ°æ®é¿åº¦ |
| | | private static final ThreadLocal<ParseResult> RESULT_CACHE = // è§£æç»æç¼å |
| | | ThreadLocal.withInitial(ParseResult::new); |
| | | // éç¨StringBuilderåå°å
ååé
|
| | | private static final ThreadLocal<StringBuilder> hexDataBuilder = |
| | | ThreadLocal.withInitial(() -> new StringBuilder(64)); |
| | | |
| | | // è§£æç»æç±» |
| | | public static class ParseResult { |
| | |
| | | // è§£æéç¹ä¿¡æ¯ |
| | | parseAnchorInfo(chars, result); |
| | | |
| | | if (MessageViewPanel.isWindowVisible) { |
| | | // ç»è£
åºç«ä¿¡æ¯ |
| | | StringBuilder ids = new StringBuilder(); |
| | | StringBuilder dists = new StringBuilder(); |
| | | StringBuilder powers = new StringBuilder(); |
| | | for (int i = 0; i < result.anchorCount; i++) { |
| | | if (i > 0) { |
| | | ids.append(','); |
| | | dists.append(','); |
| | | powers.append(','); |
| | | } |
| | | ids.append(result.anchorIds[i]); |
| | | dists.append(result.distances[i]); |
| | | powers.append(result.anchorPowers[i]); |
| | | } |
| | | StringBuilder sb = hexDataBuilder.get(); |
| | | sb.append("55AA12 ,Seq:").append(result.sequenceNum) |
| | | .append(",Tagid:").append(result.tagId) |
| | | .append(",Power: ").append(result.power).append("%") |
| | | .append(",button:").append(result.sosButtonPressed) |
| | | .append(",Static:").append(result.isStatic ) |
| | | .append(",Sleep:").append(result.isSleeping ) |
| | | .append(",State:").append(result.vibrationState ) |
| | | .append(",TagRemoved:").append(result.tagRemoved) |
| | | .append(",TagHeight:").append(result.tagHeight) |
| | | .append(",AncNum:").append(result.anchorCount) |
| | | .append(",AncIds:[").append(ids) |
| | | .append("],Dis:[").append(dists) |
| | | .append("],AncPowers:[").append(powers).append("]").append('\n'); |
| | | MessageViewPanel.showData(sb.toString(), ip, port, 0, "UDPA", "55AA12",result.tagId); |
| | | } |
| | | return result; |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package dell55AAData; |
| | | |
| | | public class DellGngga { |
| | | // è§£æç»æåå¨ |
| | | private String utcTime; // UTCæ¶é´ |
| | | private String latitude; // 纬度 |
| | | private String latHemisphere; // 纬度åçï¼N/Sï¼ |
| | | private String longitude; // ç»åº¦ |
| | | private String lonHemisphere; // ç»åº¦åçï¼E/Wï¼ |
| | | private String quality; // å®ä½è´¨éæç¤ºå¨ |
| | | private String satellites; // 使ç¨ç嫿æ°é |
| | | private String hdop; // 水平精度å å |
| | | private String altitude; // æµ·æé«åº¦ |
| | | private String altitudeUnit; // æµ·æé«åº¦åä½ |
| | | private String geoidHeight; // 大尿°´åé¢é«åº¦ |
| | | private String geoidHeightUnit; // 大尿°´åé¢é«åº¦åä½ |
| | | private String differentialTime; // 差忶é´ï¼ç§ï¼ |
| | | private String checksum = ""; // æ ¡éªå |
| | | private String deviceId; // 设å¤ID |
| | | private String battery; // çµæ± çµé |
| | | private String signalStrength; // ä¿¡å·å¼ºåº¦ |
| | | private String reserve1; // ä¿çåæ®µ1 |
| | | private String reserve2; // ä¿çåæ®µ2 |
| | | private String reserve3; // ä¿çåæ®µ3 |
| | | |
| | | public void parse(String data) { |
| | | // ç´æ¥æéå·åå²å段 |
| | | String[] fields = data.split(","); |
| | | |
| | | // éªè¯å段æ°é |
| | | if (fields.length < 21) return; |
| | | |
| | | // ç´æ¥èµå¼åä¸ªåæ®µ |
| | | utcTime = fields[1]; |
| | | latitude = fields[2]; |
| | | latHemisphere = fields[3]; |
| | | longitude = fields[4]; |
| | | lonHemisphere = fields[5]; |
| | | quality = fields[6]; |
| | | satellites = fields[7]; |
| | | hdop = fields[8]; |
| | | altitude = fields[9]; |
| | | altitudeUnit = fields[10]; |
| | | geoidHeight = fields[11]; |
| | | geoidHeightUnit = fields[12]; |
| | | differentialTime = fields[13]; |
| | | checksum = fields[14]; |
| | | deviceId = fields[15]; |
| | | battery = fields[16]; |
| | | signalStrength = fields[17]; |
| | | reserve1 = fields[18]; |
| | | reserve2 = fields[19]; |
| | | reserve3 = fields[20]; |
| | | } |
| | | |
| | | // ===== ç»æè·åæ¹æ³ ===== |
| | | public String getUtcTime() { return utcTime; } |
| | | public String getLatitude() { return latitude; } |
| | | public String getLatHemisphere() { return latHemisphere; } |
| | | public String getLongitude() { return longitude; } |
| | | public String getLonHemisphere() { return lonHemisphere; } |
| | | public String getQuality() { return quality; } |
| | | public String getSatellites() { return satellites; } |
| | | public String getHdop() { return hdop; } |
| | | public String getAltitude() { return altitude; } |
| | | public String getAltitudeUnit() { return altitudeUnit; } |
| | | public String getGeoidHeight() { return geoidHeight; } |
| | | public String getGeoidHeightUnit() { return geoidHeightUnit; } |
| | | public String getDifferentialTime() { return differentialTime; } |
| | | public String getChecksum() { return checksum; } |
| | | public String getDeviceId() { return deviceId; } |
| | | public String getBattery() { return battery; } |
| | | public String getSignalStrength() { return signalStrength; } |
| | | public String getReserve1() { return reserve1; } |
| | | public String getReserve2() { return reserve2; } |
| | | public String getReserve3() { return reserve3; } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package dell55AAData; |
| | | public class XTB { |
| | | // è§£æç»æåå¨ |
| | | private String header; // å
头 |
| | | private String deviceId; // 设å¤ç¼å· |
| | | private String battery; // çµé |
| | | private String version; // çæ¬å· |
| | | private String ccid; // CCID |
| | | private String button; // æé® |
| | | private String rtcmSource; // RTCMÔ´ |
| | | |
| | | // ç¨äºé«æè§£æç临æ¶åé |
| | | private int startIndex; |
| | | private int endIndex; |
| | | private String data; |
| | | |
| | | public void parse(String data) { |
| | | this.data = data; |
| | | int fieldCount = 0; |
| | | startIndex = 0; |
| | | endIndex = 0; |
| | | |
| | | // å¿«ééåå符串解æå段 |
| | | for (int i = 0; i < data.length(); i++) { |
| | | if (data.charAt(i) == ',' || i == data.length() - 1) { |
| | | endIndex = (i == data.length() - 1) ? i + 1 : i; |
| | | assignField(fieldCount, startIndex, endIndex); |
| | | fieldCount++; |
| | | startIndex = i + 1; |
| | | |
| | | // 妿已ç»è§£æäºææ7ä¸ªåæ®µï¼æåéåº |
| | | if (fieldCount >= 7) break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void assignField(int fieldIndex, int start, int end) { |
| | | switch (fieldIndex) { |
| | | case 0: header = data.substring(start, end); break; |
| | | case 1: deviceId = data.substring(start, end); break; |
| | | case 2: battery = data.substring(start, end); break; |
| | | case 3: version = data.substring(start, end); break; |
| | | case 4: ccid = data.substring(start, end); break; |
| | | case 5: button = data.substring(start, end); break; |
| | | case 6: |
| | | // å¯¹äºæåä¸ä¸ªå段ï¼éè¦ç¡®ä¿è·åå°å符串æ«å°¾ |
| | | rtcmSource = data.substring(start); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // ===== ç»æè·åæ¹æ³ ===== |
| | | public String getHeader() { return header; } |
| | | public String getDeviceId() { return deviceId; } |
| | | public String getBattery() { return battery; } |
| | | public String getVersion() { return version; } |
| | | public String getCcid() { return ccid; } |
| | | public String getButton() { return button; } |
| | | public String getRtcmSource() { return rtcmSource; } |
| | | } |
| | |
| | | |
| | | import databases.DBConnector; |
| | | import dell_targets.Dell_BaseStation; |
| | | |
| | | import publicsWay.ButtonUtils; |
| | | import publicsWay.TableUtils; |
| | | import javax.swing.*; |
| | | import javax.swing.border.EmptyBorder; |
| | | import javax.swing.table.*; |
| | | import java.awt.*; |
| | | import java.awt.event.*; |
| | | import java.sql.SQLException; |
| | | import java.util.*; |
| | | import java.util.List; |
| | |
| | | setLayout(new BorderLayout()); |
| | | setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
| | | |
| | | // å建æç´¢é¢æ¿ |
| | | JPanel searchPanel = new JPanel(new BorderLayout(5, 5)); |
| | | searchPanel.setBorder(BorderFactory.createTitledBorder(getMessage("SEARCH"))); |
| | | // 顶鍿ä½é¢æ¿ |
| | | JPanel topPanel = new JPanel(new BorderLayout(5, 5)); |
| | | topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("QUICK_OPERATION"))); |
| | | |
| | | // å建æç´¢ç»ä»¶ |
| | | // æç´¢é¢æ¿ |
| | | JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
| | | JLabel searchLabel = new JLabel(messages.getString("BASE_STATION_ID") + ":"); |
| | | searchField = new JTextField(15); |
| | | JButton searchButton = new JButton(getMessage("SEARCH")); |
| | | JButton refreshButton = new JButton(getMessage("REFRESH")); |
| | | JButton addButton = new JButton(getMessage("ADD")); |
| | | JButton editButton = new JButton(getMessage("EDIT")); |
| | | JButton deleteButton = new JButton(getMessage("DELETE")); |
| | | refreshButton.addActionListener(e -> loadBaseStationData()); |
| | | |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); |
| | | buttonPanel.add(searchButton); |
| | | buttonPanel.add(refreshButton); |
| | | buttonPanel.add(addButton); |
| | | buttonPanel.add(editButton); |
| | | buttonPanel.add(deleteButton); |
| | | |
| | | searchPanel.add(searchField, BorderLayout.CENTER); |
| | | searchPanel.add(buttonPanel, BorderLayout.EAST); |
| | | |
| | | // æ·»å æé®äºä»¶çå¬å¨ |
| | | addButton.addActionListener(e -> addNewBaseStation()); |
| | | editButton.addActionListener(e -> editSelectedBaseStation()); |
| | | deleteButton.addActionListener(e -> deleteSelectedBaseStations()); |
| | | searchButton.addActionListener(new SearchAction()); |
| | | |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH")); |
| | | JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET")); |
| | | JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH")); |
| | | JButton addButton = ButtonUtils.createBlueButton(messages.getString("ADD")); |
| | | JButton editButton = ButtonUtils.createBlueButton(messages.getString("EDIT")); |
| | | JButton deleteButton = ButtonUtils.createBlueButton(messages.getString("DELETE")); |
| | | |
| | | searchInputPanel.add(searchLabel); |
| | | searchInputPanel.add(searchField); |
| | | searchInputPanel.add(searchButton); |
| | | searchInputPanel.add(resetButton); |
| | | searchInputPanel.add(refreshButton); |
| | | |
| | | // æä½æé®é¢æ¿ |
| | | JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); |
| | | actionPanel.add(addButton); |
| | | actionPanel.add(editButton); |
| | | actionPanel.add(deleteButton); |
| | | |
| | | // å°æç´¢é¢æ¿åæä½æé®é¢æ¿æ¾å¨ä¸è¡ |
| | | JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); |
| | | rowPanel.add(searchInputPanel); |
| | | rowPanel.add(actionPanel); |
| | | |
| | | topPanel.add(rowPanel, BorderLayout.CENTER); |
| | | |
| | | // åå»ºè¡¨æ ¼åå |
| | | String[] columnNames = { |
| | | getMessage("INDEX"), |
| | | getMessage("BASE_STATION_ID"), |
| | | getMessage("BASE_STATION_STATUS"), |
| | | getMessage("X_COORD"), |
| | | getMessage("Y_COORD"), |
| | | getMessage("Z_COORD"), |
| | | getMessage("LAYER"), |
| | | getMessage("GROUP"), |
| | | getMessage("PORT"), |
| | | getMessage("FIRMWARE_VERSION"), |
| | | getMessage("ONLINE_TIME"), |
| | | getMessage("COMPANY") |
| | | messages.getString("INDEX"), |
| | | messages.getString("BASE_STATION_ID"), |
| | | messages.getString("BASE_STATION_STATUS"), |
| | | messages.getString("X_COORD"), |
| | | messages.getString("Y_COORD"), |
| | | messages.getString("Z_COORD"), |
| | | messages.getString("LAYER"), |
| | | messages.getString("GROUP"), |
| | | messages.getString("PORT"), |
| | | messages.getString("FIRMWARE_VERSION"), |
| | | messages.getString("ONLINE_TIME"), |
| | | messages.getString("COMPANY") |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼æ¨¡å |
| | |
| | | } |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼ |
| | | // åå»ºè¡¨æ ¼ - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | baseStationTable = new JTable(tableModel); |
| | | TableUtils.setupTableStyle(baseStationTable); |
| | | TableUtils.setupTableHeaderStyle(baseStationTable); |
| | | baseStationTable.setAutoCreateRowSorter(true); |
| | | baseStationTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
| | | |
| | | // 设置å宽 |
| | | TableColumnModel columnModel = baseStationTable.getColumnModel(); |
| | | columnModel.getColumn(0).setPreferredWidth(30); // åºå· |
| | | columnModel.getColumn(0).setPreferredWidth(30); // ç´¢å¼ |
| | | columnModel.getColumn(1).setPreferredWidth(100); // åºç«ç¼å· |
| | | columnModel.getColumn(2).setPreferredWidth(70); // ״̬ |
| | | columnModel.getColumn(3).setPreferredWidth(70); // Xåæ |
| | |
| | | columnModel.getColumn(10).setPreferredWidth(120); // ä¸çº¿æ¶é´ |
| | | columnModel.getColumn(11).setPreferredWidth(100); // æå±å
¬å¸ |
| | | |
| | | // è®¾ç½®è¡¨å¤´æ ·å¼ |
| | | JTableHeader header = baseStationTable.getTableHeader(); |
| | | // è®¾ç½®è¡¨å¤´å·¦å¯¹é½ |
| | | header.setDefaultRenderer(new DefaultTableCellRenderer() { |
| | | @Override |
| | | public Component getTableCellRendererComponent(JTable table, Object value, |
| | | boolean isSelected, boolean hasFocus, int row, int column) { |
| | | super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
| | | setHorizontalAlignment(SwingConstants.LEFT); |
| | | setBackground(Color.GRAY); |
| | | setForeground(Color.WHITE); |
| | | setFont(getFont().deriveFont(Font.BOLD)); |
| | | return this; |
| | | } |
| | | }); |
| | | // åºç¨åå
æ ¼æ¸²æå¨å°ææå - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer(); |
| | | for (int i = 0; i < baseStationTable.getColumnCount(); i++) { |
| | | baseStationTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); |
| | | } |
| | | |
| | | JScrollPane scrollPane = new JScrollPane(baseStationTable); |
| | | scrollPane.setPreferredSize(new Dimension(1200, 500)); |
| | | scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ç§»é¤æ»å¨é¢æ¿è¾¹æ¡ |
| | | |
| | | // æ·»å ç»ä»¶ |
| | | add(searchPanel, BorderLayout.NORTH); |
| | | add(topPanel, BorderLayout.NORTH); |
| | | add(scrollPane, BorderLayout.CENTER); |
| | | |
| | | // å è½½æ°æ® |
| | | loadBaseStationData(); |
| | | |
| | | // æ·»å äºä»¶çå¬å¨ |
| | | searchButton.addActionListener(e -> searchBaseStations()); |
| | | resetButton.addActionListener(e -> resetSearch()); |
| | | refreshButton.addActionListener(e -> loadBaseStationData()); |
| | | addButton.addActionListener(e -> addNewBaseStation()); |
| | | editButton.addActionListener(e -> editSelectedBaseStation()); |
| | | deleteButton.addActionListener(e -> deleteSelectedBaseStations()); |
| | | } |
| | | |
| | | private void loadBaseStationData() { |
| | |
| | | bs.getCompany() |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // æç´¢åºç« |
| | | private void searchBaseStations() { |
| | | String keyword = searchField.getText().trim(); |
| | | if (keyword.isEmpty()) { |
| | | updateTable(allBaseStations); |
| | | return; |
| | | } |
| | | |
| | | List<LocationBaseStation> filtered = new ArrayList<>(); |
| | | for (LocationBaseStation bs : allBaseStations) { |
| | | if ((bs.getCode() != null && bs.getCode().toLowerCase().contains(keyword.toLowerCase())) || |
| | | (bs.getCompany() != null && bs.getCompany().toLowerCase().contains(keyword.toLowerCase()))) { |
| | | filtered.add(bs); |
| | | } |
| | | } |
| | | |
| | | if (filtered.isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, getMessage("SEARCH_NO_RESULTS"), |
| | | getMessage("INFO"), JOptionPane.INFORMATION_MESSAGE); |
| | | } |
| | | |
| | | updateTable(filtered); |
| | | } |
| | | |
| | | // éç½®æç´¢ |
| | | private void resetSearch() { |
| | | searchField.setText(""); |
| | | updateTable(allBaseStations); |
| | | } |
| | | |
| | | // æ·»å æ°åºç« |
| | |
| | | return false; |
| | | } |
| | | |
| | | // HEXæ ¼å¼éªè¯ï¼0-9, A-Fï¼ |
| | | // HEXæ ¼å¼éªè¯(0-9, A-F) |
| | | if (!Pattern.matches("[0-9A-Fa-f]+", bs.getCode())) { |
| | | JOptionPane.showMessageDialog(this, getMessage("INVALID_HEX_FORMAT"), |
| | | getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); |
| | |
| | | return result > 0; |
| | | } |
| | | |
| | | // æç´¢åè½ |
| | | private class SearchAction implements ActionListener { |
| | | @Override |
| | | public void actionPerformed(ActionEvent e) { |
| | | String keyword = searchField.getText().trim(); |
| | | if (keyword.isEmpty()) { |
| | | updateTable(allBaseStations); |
| | | return; |
| | | } |
| | | |
| | | List<LocationBaseStation> filteredList = new ArrayList<>(); |
| | | for (LocationBaseStation bs : allBaseStations) { |
| | | if (matchesKeyword(bs, keyword)) { |
| | | filteredList.add(bs); |
| | | } |
| | | } |
| | | |
| | | updateTable(filteredList); |
| | | } |
| | | |
| | | private boolean matchesKeyword(LocationBaseStation bs, String keyword) { |
| | | return (bs.getCode() != null && bs.getCode().contains(keyword)) || |
| | | (bs.getCompany() != null && bs.getCompany().contains(keyword)); |
| | | } |
| | | } |
| | | |
| | | private String getMessage(String key) { |
| | | try { |
| | | return messages.getString(key); |
| | |
| | | |
| | | // æé®é¢æ¿ |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); |
| | | JButton okButton = new JButton(messages.getString("OK")); |
| | | JButton cancelButton = new JButton(messages.getString("CANCEL")); |
| | | JButton okButton = ButtonUtils.createBlueButton(messages.getString("OK")); |
| | | JButton cancelButton = ButtonUtils.createBlueButton(messages.getString("CANCEL")); |
| | | |
| | | okButton.addActionListener(e -> { |
| | | confirmed = true; |
| | |
| | | import java.util.*; |
| | | import java.util.List; |
| | | import java.util.ResourceBundle; |
| | | import publicsWay.ButtonUtils; // æ·»å ButtonUtils导å
¥ |
| | | import publicsWay.TableUtils; // æ·»å TableUtils导å
¥ |
| | | |
| | | public class CompanyManagementPanel extends JPanel { |
| | | private static final long serialVersionUID = 1L; |
| | | private JTable companyTable; |
| | |
| | | private JTextField searchField; |
| | | |
| | | @SuppressWarnings("serial") |
| | | public CompanyManagementPanel(ResourceBundle messages) { |
| | | public CompanyManagementPanel(ResourceBundle messages) { |
| | | this.messages = messages; |
| | | setLayout(new BorderLayout()); |
| | | setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
| | | |
| | | // é¡¶é¨é¢æ¿ |
| | | |
| | | // 顶鍿ä½é¢æ¿ |
| | | JPanel topPanel = new JPanel(new BorderLayout(5, 5)); |
| | | topPanel.setBorder(BorderFactory.createTitledBorder(getMessage("QKOP"))); |
| | | topPanel.setBorder(BorderFactory.createTitledBorder(getMessage("QUICK_OPERATION"))); |
| | | |
| | | // 左侧æç´¢è¾å
¥ç»ä»¶ |
| | | JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
| | | JLabel searchLabel = new JLabel(getMessage("COMPANY_NAME") + ":"); |
| | | searchField = new JTextField(20); |
| | | JButton searchButton = new JButton(getMessage("SEARCH")); |
| | | JButton resetButton = new JButton(getMessage("RESET")); |
| | | searchField = new JTextField(15); |
| | | |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton searchButton = ButtonUtils.createBlueButton(getMessage("SEARCH")); |
| | | JButton resetButton = ButtonUtils.createBlueButton(getMessage("RESET")); |
| | | JButton refreshButton = ButtonUtils.createBlueButton(getMessage("REFRESH")); |
| | | |
| | | searchInputPanel.add(searchLabel); |
| | | searchInputPanel.add(searchField); |
| | | searchInputPanel.add(searchButton); |
| | | searchInputPanel.add(resetButton); |
| | | searchInputPanel.add(refreshButton); |
| | | |
| | | // å³ä¾§æä½æé® |
| | | JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); |
| | | JButton addButton = new JButton(getMessage("ADD")); |
| | | JButton editButton = new JButton(getMessage("EDIT")); |
| | | JButton deleteButton = new JButton(getMessage("DELETE")); |
| | | JButton refreshButton = new JButton(getMessage("REFRESH")); |
| | | JButton addButton = ButtonUtils.createBlueButton(getMessage("ADD")); |
| | | JButton editButton = ButtonUtils.createBlueButton(getMessage("EDIT")); |
| | | JButton deleteButton = ButtonUtils.createBlueButton(getMessage("DELETE")); |
| | | |
| | | actionPanel.add(addButton); |
| | | actionPanel.add(editButton); |
| | |
| | | actionPanel.add(refreshButton); |
| | | |
| | | // å°å·¦ä¾§æç´¢åå³ä¾§æä½æ·»å å°æç´¢é¢æ¿ |
| | | topPanel.add(searchInputPanel, BorderLayout.CENTER); |
| | | topPanel.add(actionPanel, BorderLayout.EAST); |
| | | JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); |
| | | rowPanel.add(searchInputPanel); |
| | | rowPanel.add(actionPanel); |
| | | |
| | | topPanel.add(rowPanel, BorderLayout.CENTER); |
| | | |
| | | // åå»ºè¡¨æ ¼åå |
| | | String[] columnNames = { |
| | |
| | | } |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼ |
| | | // åå»ºè¡¨æ ¼ - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | companyTable = new JTable(tableModel); |
| | | TableUtils.setupTableStyle(companyTable); |
| | | TableUtils.setupTableHeaderStyle(companyTable); |
| | | companyTable.setAutoCreateRowSorter(true); |
| | | companyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
| | | |
| | |
| | | companyTable.getColumnModel().getColumn(2).setPreferredWidth(100); |
| | | companyTable.getColumnModel().getColumn(3).setPreferredWidth(200); |
| | | |
| | | // è®¾ç½®è¡¨å¤´æ ·å¼ |
| | | JTableHeader header = companyTable.getTableHeader(); |
| | | header.setBackground(Color.GRAY); |
| | | header.setForeground(Color.WHITE); |
| | | header.setFont(header.getFont().deriveFont(Font.BOLD)); |
| | | |
| | | // å建表头渲æå¨ |
| | | DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer() { |
| | | { |
| | | setHorizontalAlignment(SwingConstants.LEFT); |
| | | setBackground(Color.GRAY); |
| | | setForeground(Color.WHITE); |
| | | setFont(getFont().deriveFont(Font.BOLD)); |
| | | } |
| | | }; |
| | | |
| | | // åºç¨è¡¨å¤´æ¸²æå¨ |
| | | // åºç¨åå
æ ¼æ¸²æå¨å°ææå - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer(); |
| | | for (int i = 0; i < companyTable.getColumnCount(); i++) { |
| | | companyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); |
| | | companyTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); |
| | | } |
| | | |
| | | JScrollPane scrollPane = new JScrollPane(companyTable); |
| | | scrollPane.setPreferredSize(new Dimension(800, 400)); |
| | | scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ç§»é¤æ»å¨é¢æ¿è¾¹æ¡ |
| | | |
| | | // æ·»å ç»ä»¶ |
| | | add(topPanel, BorderLayout.NORTH); |
| | |
| | | |
| | | // æé®é¢æ¿ |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); |
| | | JButton okButton = new JButton(getMessage("OK")); |
| | | JButton cancelButton = new JButton(getMessage("CANCEL")); |
| | | JButton okButton = ButtonUtils.createBlueButton(getMessage("OK")); |
| | | JButton cancelButton = ButtonUtils.createBlueButton(getMessage("CANCEL")); |
| | | |
| | | okButton.addActionListener(e -> { |
| | | confirmed = true; |
| | |
| | | import java.util.ResourceBundle; |
| | | import dell_targets.Dell_tag; |
| | | import publicsWay.Languages; |
| | | import publicsWay.UDPPortAReceiver; |
| | | import udptcp.UDPPortAReceiver; |
| | | import udptcp.UDPPortBReceiver; |
| | | |
| | | public class MessageViewPanel extends JPanel { |
| | |
| | | private JRadioButton rdoSendHex; |
| | | private JRadioButton rdoSendAscii; |
| | | private JCheckBox chkAppendNewline; |
| | | // æ·»å 常éå®ä¹æå¤§è¡æ° |
| | | private static final int MAX_LINES = 10000; |
| | | private static final int TRIM_LINES = 5000; // å½è¶
è¿æå¤§è¡æ°æ¶ä¿ççè¡æ° |
| | | |
| | | private static final ThreadLocal<StringBuilder> SB = |
| | | ThreadLocal.withInitial(() -> new StringBuilder(256)); |
| | |
| | | "ALL", |
| | | "55AA01", "55AA02", "55AA03", "55AA05", "55AA07", |
| | | "55AA0A", "55AA0C", "55AA12", "55AA14", "55AA20", |
| | | "GNGGA", "XTB" |
| | | "GNGGA", "XTB", "GBGGA", "SSGGA" |
| | | }); |
| | | protocolPanel.add(cbProtocol, BorderLayout.CENTER); |
| | | add(protocolPanel, gbc); |
| | |
| | | |
| | | SwingUtilities.invokeLater(() -> { |
| | | txtDataView.append(displayData.toString() + "\n"); |
| | | |
| | | // æ£æ¥å¹¶éå¶è¡æ° |
| | | int lineCount = txtDataView.getLineCount(); |
| | | if (lineCount > MAX_LINES) { |
| | | try { |
| | | int end = txtDataView.getLineEndOffset(TRIM_LINES - 1); |
| | | txtDataView.replaceRange("", 0, end); |
| | | } catch (Exception ex) { |
| | | ex.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | txtDataView.setCaretPosition(txtDataView.getDocument().getLength()); |
| | | }); |
| | | } |
| | |
| | | SwingUtilities.invokeLater(() -> { |
| | | txtDataView.append(finalText); |
| | | txtDataView.append("\n"); |
| | | |
| | | // æ£æ¥å¹¶éå¶è¡æ° |
| | | int lineCount = txtDataView.getLineCount(); |
| | | if (lineCount > MAX_LINES) { |
| | | try { |
| | | int end = txtDataView.getLineEndOffset(TRIM_LINES - 1); |
| | | txtDataView.replaceRange("", 0, end); |
| | | } catch (Exception ex) { |
| | | ex.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | txtDataView.setCaretPosition(txtDataView.getDocument().getLength()); |
| | | }); |
| | | |
| | |
| | | return sb.toString(); |
| | | } |
| | | |
| | | String button = r.buttonPressed ? bundle.getString("yes") : bundle.getString("no"); |
| | | String button = r.buttonPressed2 ? bundle.getString("yes") : bundle.getString("no"); |
| | | sb.append(bundle.getString("label.sequence")).append(": ").append(r.sequenceNum).append(',') |
| | | .append(bundle.getString("label.id")).append(": ").append(r.tagId).append(',') |
| | | .append(bundle.getString("label.anchor_ids")).append(": ").append(r.anchorId).append(',') |
| | |
| | | .append(bundle.getString("status.button")).append(": ").append(button); |
| | | |
| | | } else if (hex.startsWith("55AA12")) { |
| | | ParseResult r = Dell55AA12HighPerf.parse(hex); |
| | | ParseResult r = Dell55AA12HighPerf.parse(hex,"127.0.0.1",0); |
| | | if (r == null) { |
| | | sb.append(bundle.getString("parser.invalid")).append(" 55AA12"); |
| | | return sb.toString(); |
| | |
| | | import javax.swing.JRadioButton; |
| | | import javax.swing.JTextField; |
| | | import targets.SystemConfiguration; |
| | | import publicsWay.ButtonUtils; // æ°å¢å¯¼å
¥ |
| | | |
| | | @SuppressWarnings("serial") |
| | | public class SettingsPanelContent extends JPanel { |
| | | private ResourceBundle messages; // å¤è¯è¨èµæºå
|
| | | private ResourceBundle messages; // è¯è¨èµæºå
|
| | | private Map<String, JComponent> settingComponents; // 设置ç»ä»¶æ å° |
| | | private SystemConfiguration currentConfig; // å½åç³»ç»é
ç½® |
| | | private int settingIndex = 1; // è®¾ç½®é¡¹ç´¢å¼ |
| | |
| | | |
| | | // æ·»å ç»åæ¡è®¾ç½® |
| | | addComboBoxSetting("REALTIME_TRAJECTORY_COLOR", "realTimeTrajectoryColor", |
| | | new String[]{"红è²", "绿è²", "é»è²", "ç´«è²", "é»è²"}, |
| | | new String[]{"红è²", "绿è²", "é»è²", "èè²", "é»è²"}, |
| | | new Integer[]{1, 2, 3, 4, 5}); |
| | | addComboBoxSetting("SYSTEM_LANGUAGE", "systemLanguage", |
| | | new String[]{"䏿", "è±æ", "æ³æ", "é¿æä¼¯æ"}, |
| | |
| | | gbcButton.anchor = GridBagConstraints.WEST; // å·¦å¯¹é½ |
| | | gbcButton.insets = new Insets(5, 0, 5, 5); // è¾¹è· |
| | | |
| | | JButton confirmButton = new JButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton confirmButton = ButtonUtils.createBlueButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | confirmButton.setFont(new Font("微软é
é»", Font.PLAIN, 12)); // 设置åä½ |
| | | confirmButton.setPreferredSize(new Dimension(80, 30)); // è®¾ç½®å¤§å° |
| | | // æ·»å ä¿åæä½çå¬å¨ |
| | |
| | | gbcButton.anchor = GridBagConstraints.WEST; // å·¦å¯¹é½ |
| | | gbcButton.insets = new Insets(5, 0, 5, 5); // è¾¹è· |
| | | |
| | | JButton confirmButton = new JButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton confirmButton = ButtonUtils.createBlueButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | confirmButton.setFont(new Font("微软é
é»", Font.PLAIN, 12)); // 设置åä½ |
| | | confirmButton.setPreferredSize(new Dimension(80, 30)); // è®¾ç½®å¤§å° |
| | | // æ·»å ä¿åæä½çå¬å¨ |
| | |
| | | gbcButton.anchor = GridBagConstraints.WEST; // å·¦å¯¹é½ |
| | | gbcButton.insets = new Insets(5, 0, 5, 5); // è¾¹è· |
| | | |
| | | JButton confirmButton = new JButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton confirmButton = ButtonUtils.createBlueButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | confirmButton.setFont(new Font("微软é
é»", Font.PLAIN, 12)); // 设置åä½ |
| | | confirmButton.setPreferredSize(new Dimension(80, 30)); // è®¾ç½®å¤§å° |
| | | // æ·»å ä¿åæä½çå¬å¨ |
| | |
| | | gbcButton.anchor = GridBagConstraints.WEST; // å·¦å¯¹é½ |
| | | gbcButton.insets = new Insets(5, 0, 5, 5); // è¾¹è· |
| | | |
| | | JButton confirmButton = new JButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton confirmButton = ButtonUtils.createBlueButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | confirmButton.setFont(new Font("微软é
é»", Font.PLAIN, 12)); // 设置åä½ |
| | | confirmButton.setPreferredSize(new Dimension(80, 30)); // è®¾ç½®å¤§å° |
| | | // æ·»å ä¿åæä½çå¬å¨ |
| | |
| | | gbcButton.anchor = GridBagConstraints.WEST; // å·¦å¯¹é½ |
| | | gbcButton.insets = new Insets(5, 0, 5, 5); // è¾¹è· |
| | | |
| | | JButton confirmButton = new JButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton confirmButton = ButtonUtils.createBlueButton(messages.getString("SAVE")); // "ä¿å"æé® |
| | | confirmButton.setFont(new Font("微软é
é»", Font.PLAIN, 12)); // 设置åä½ |
| | | confirmButton.setPreferredSize(new Dimension(80, 30)); // è®¾ç½®å¤§å° |
| | | // æ·»å ä¿åæä½çå¬å¨ |
| | |
| | | public static String language="0"; |
| | | public static int hexport=8234; |
| | | public static int ascallport=7000; |
| | | public static int TrajectoryRetentionDays=30;//轨迹ä¿åå¤©æ° |
| | | // è·åç³»ç»é
ç½®å表 |
| | | public static List<SystemConfiguration> getSystemConfigurations() { |
| | | // å建é
置对象å表 |
| | |
| | | // ä½ç½®è½¬åé´é |
| | | config.setLocationForwardingInterval(rs.getString("location_forwarding_interval")); |
| | | // 轨迹ä¿åå¤©æ° |
| | | config.setTrajectorySaveDays(rs.getString("trajectory_save_days")); |
| | | String savedays=rs.getString("trajectory_save_days"); |
| | | if (savedays != null && !savedays.trim().isEmpty()) { |
| | | try { |
| | | TrajectoryRetentionDays= Integer.parseInt(savedays); |
| | | if (TrajectoryRetentionDays <= 0) { |
| | | // å¦æè½¬æ¢åçå¼ä¸æ¯æ£æ´æ°ï¼å¯ä»¥æåºå¼å¸¸æè®¾ç½®ä¸ºé»è®¤å¼ |
| | | throw new IllegalArgumentException("The value must be a positive integer."); |
| | | } |
| | | } catch (NumberFormatException e) { |
| | | // 妿åç¬¦ä¸²ä¸æ¯ææçæ´æ°æ ¼å¼ï¼å¯ä»¥æåºå¼å¸¸æè®¾ç½®ä¸ºé»è®¤å¼ |
| | | System.err.println("Invalid number format: " + savedays); |
| | | } |
| | | } |
| | | config.setTrajectorySaveDays(savedays); |
| | | // æ ç¾ç¦»çº¿å¤ææ¶é¿ |
| | | config.setTagOfflineJudgmentDuration(rs.getString("tag_offline_judgment_duration")); |
| | | // åºç«ç¦»çº¿å¤ææ¶é¿ |
| | |
| | | } |
| | | while (rs.next()) { |
| | | LocationTag locationTag = new LocationTag(); |
| | | locationTag.setId((int) rs.getLong("id")); |
| | | locationTag.setId((int) rs.getLong("id")); |
| | | locationTag.setDeviceNumber(rs.getString("device_id")); |
| | | locationTag.setDeviceName(rs.getString("device_name")); |
| | | locationTag.setDeviceVersion(rs.getString("device_version")); |
| | |
| | | locationTag.setMotionlessEndTime(rs.getString("stationary_end_time")); |
| | | locationTag.setMotionlessDuration(rs.getString("stationary_duration")); |
| | | locationTag.setValidSatelliteSignal(rs.getString("tag_valid_satellite_signal")); |
| | | locationTag.setCompany(rs.getString("company")); |
| | | String company=rs.getString("company"); |
| | | if (company == null || company.trim().isEmpty() || company.equals("-1") ) { |
| | | company = "Unknown"; |
| | | } |
| | | locationTag.setCompany(company); |
| | | locationTag.setSleepTime(rs.getString("sleep_time")); |
| | | locationTag.setVibrationTime(rs.getString("vibration_time")); |
| | | locationTag.setFrequency(rs.getString("frequency")); |
| | |
| | | locationTag.setInteractionType(rs.getString("Interaction_Type")); |
| | | locationTag.setIpAddress(rs.getString("ipAddress")); |
| | | locationTag.setIpPort(rs.getString("Interaction_Type")); |
| | | |
| | | locationTag.setId((int) rs.getLong("id")); |
| | | |
| | | String deviceNumber = rs.getString("device_id"); |
| | | if (deviceNumber == null || deviceNumber.trim().isEmpty() || deviceNumber.equals("-1")) { |
| | | deviceNumber = "Unknown"; |
| | | } |
| | | locationTag.setDeviceNumber(deviceNumber); |
| | | |
| | | String deviceName = rs.getString("device_name"); |
| | | if (deviceName == null || deviceName.trim().isEmpty() || deviceName.equals("-1")) { |
| | | deviceName = "Unknown"; |
| | | } |
| | | locationTag.setDeviceName(deviceName); |
| | | |
| | | String deviceVersion = rs.getString("device_version"); |
| | | if (deviceVersion == null || deviceVersion.trim().isEmpty() || deviceVersion.equals("-1")) { |
| | | deviceVersion = "Unknown"; |
| | | } |
| | | locationTag.setDeviceVersion(deviceVersion); |
| | | |
| | | String deviceCardNumber = rs.getString("device_card_number"); |
| | | if (deviceCardNumber == null || deviceCardNumber.trim().isEmpty() || deviceCardNumber.equals("-1")) { |
| | | deviceCardNumber = "Unknown"; |
| | | } |
| | | locationTag.setDeviceCardNumber(deviceCardNumber); |
| | | |
| | | String deviceType = rs.getString("device_type"); |
| | | if (deviceType == null || deviceType.trim().isEmpty() || deviceType.equals("-1")) { |
| | | deviceType = "Unknown"; |
| | | } |
| | | locationTag.setDeviceType(deviceType); |
| | | |
| | | String team = rs.getString("affiliated_class"); |
| | | if (team == null || team.trim().isEmpty() || team.equals("-1")) { |
| | | team = "Unknown"; |
| | | } |
| | | locationTag.setTeam(team); |
| | | |
| | | String group = rs.getString("affiliated_group"); |
| | | if (group == null || group.trim().isEmpty() || group.equals("-1")) { |
| | | group = "Unknown"; |
| | | } |
| | | locationTag.setGroup(group); |
| | | |
| | | String department = rs.getString("department"); |
| | | if (department == null || department.trim().isEmpty() || department.equals("-1")) { |
| | | department = "Unknown"; |
| | | } |
| | | locationTag.setDepartment(department); |
| | | |
| | | String iconAddress = rs.getString("icon_url"); |
| | | if (iconAddress == null || iconAddress.trim().isEmpty() || iconAddress.equals("-1")) { |
| | | iconAddress = "Unknown"; |
| | | } |
| | | locationTag.setIconAddress(iconAddress); |
| | | |
| | | String gender = rs.getString("gender"); |
| | | if (gender == null || gender.trim().isEmpty() || gender.equals("-1")) { |
| | | gender = "Unknown"; |
| | | } |
| | | locationTag.setGender(gender); |
| | | |
| | | String ethnicity = rs.getString("ethnic_group"); |
| | | if (ethnicity == null || ethnicity.trim().isEmpty() || ethnicity.equals("-1")) { |
| | | ethnicity = "Unknown"; |
| | | } |
| | | locationTag.setEthnicity(ethnicity); |
| | | |
| | | String communicationAddress = rs.getString("communication_address"); |
| | | if (communicationAddress == null || communicationAddress.trim().isEmpty() || communicationAddress.equals("-1")) { |
| | | communicationAddress = "Unknown"; |
| | | } |
| | | locationTag.setCommunicationAddress(communicationAddress); |
| | | |
| | | String boundPhone = rs.getString("bound_phone"); |
| | | if (boundPhone == null || boundPhone.trim().isEmpty() || boundPhone.equals("-1")) { |
| | | boundPhone = "Unknown"; |
| | | } |
| | | locationTag.setBoundPhone(boundPhone); |
| | | |
| | | String idNumber = rs.getString("id_card_number"); |
| | | if (idNumber == null || idNumber.trim().isEmpty() || idNumber.equals("-1")) { |
| | | idNumber = "Unknown"; |
| | | } |
| | | locationTag.setIdNumber(idNumber); |
| | | |
| | | String position = rs.getString("personnel_position"); |
| | | if (position == null || position.trim().isEmpty() || position.equals("-1")) { |
| | | position = "Unknown"; |
| | | } |
| | | locationTag.setPosition(position); |
| | | |
| | | String boundPlateNumber = rs.getString("bound_license_plate"); |
| | | if (boundPlateNumber == null || boundPlateNumber.trim().isEmpty() || boundPlateNumber.equals("-1")) { |
| | | boundPlateNumber = "Unknown"; |
| | | } |
| | | locationTag.setBoundPlateNumber(boundPlateNumber); |
| | | |
| | | String faceAddress = rs.getString("face_image_url"); |
| | | if (faceAddress == null || faceAddress.trim().isEmpty() || faceAddress.equals("-1")) { |
| | | faceAddress = "Unknown"; |
| | | } |
| | | locationTag.setFaceAddress(faceAddress); |
| | | |
| | | String heartRate = rs.getString("heart_rate"); |
| | | if (heartRate == null || heartRate.trim().isEmpty() || heartRate.equals("-1")) { |
| | | heartRate = "Unknown"; |
| | | } |
| | | locationTag.setHeartRate(heartRate); |
| | | |
| | | String bloodPressure = rs.getString("blood_pressure"); |
| | | if (bloodPressure == null || bloodPressure.trim().isEmpty() || bloodPressure.equals("-1")) { |
| | | bloodPressure = "Unknown"; |
| | | } |
| | | locationTag.setBloodPressure(bloodPressure); |
| | | |
| | | String bloodOxygen = rs.getString("blood_oxygen"); |
| | | if (bloodOxygen == null || bloodOxygen.trim().isEmpty() || bloodOxygen.equals("-1")) { |
| | | bloodOxygen = "Unknown"; |
| | | } |
| | | locationTag.setBloodOxygen(bloodOxygen); |
| | | |
| | | String temperature = rs.getString("body_temperature"); |
| | | if (temperature == null || temperature.trim().isEmpty() || temperature.equals("-1")) { |
| | | temperature = "Unknown"; |
| | | } |
| | | locationTag.setTemperature(temperature); |
| | | |
| | | String sosStatus = rs.getString("sos_status"); |
| | | if (sosStatus == null || sosStatus.trim().isEmpty() || sosStatus.equals("-1")) { |
| | | sosStatus = "Unknown"; |
| | | } |
| | | locationTag.setSosStatus(sosStatus); |
| | | |
| | | String motionStatus = rs.getString("motion_status"); |
| | | if (motionStatus == null || motionStatus.trim().isEmpty() || motionStatus.equals("-1")) { |
| | | motionStatus = "Unknown"; |
| | | } |
| | | locationTag.setMotionStatus(motionStatus); |
| | | |
| | | String onlineStatus = rs.getString("online_status"); |
| | | if (onlineStatus == null || onlineStatus.trim().isEmpty() || onlineStatus.equals("-1")) { |
| | | onlineStatus = "Unknown"; |
| | | } |
| | | locationTag.setOnlineStatus(onlineStatus); |
| | | |
| | | String searchStatus = rs.getString("search_status"); |
| | | if (searchStatus == null || searchStatus.trim().isEmpty() || searchStatus.equals("-1")) { |
| | | searchStatus = "Unknown"; |
| | | } |
| | | locationTag.setSearchStatus(searchStatus); |
| | | |
| | | String batteryStatus = rs.getString("battery_status"); |
| | | if (batteryStatus == null || batteryStatus.trim().isEmpty() || batteryStatus.equals("-1")) { |
| | | batteryStatus = "Unknown"; |
| | | } |
| | | locationTag.setBatteryStatus(batteryStatus); |
| | | |
| | | String deviceBattery = rs.getString("device_battery"); |
| | | if (deviceBattery == null || deviceBattery.trim().isEmpty() || deviceBattery.equals("-1")) { |
| | | deviceBattery = "Unknown"; |
| | | } |
| | | locationTag.setDeviceBattery(deviceBattery); |
| | | |
| | | String removalStatus = rs.getString("removal_status"); |
| | | if (removalStatus == null || removalStatus.trim().isEmpty() || removalStatus.equals("-1")) { |
| | | removalStatus = "Unknown"; |
| | | } |
| | | locationTag.setRemovalStatus(removalStatus); |
| | | |
| | | String collisionStatus = rs.getString("collision_status"); |
| | | if (collisionStatus == null || collisionStatus.trim().isEmpty() || collisionStatus.equals("-1")) { |
| | | collisionStatus = "Unknown"; |
| | | } |
| | | locationTag.setCollisionStatus(collisionStatus); |
| | | |
| | | String elevationStatus = rs.getString("climbing_status"); |
| | | if (elevationStatus == null || elevationStatus.trim().isEmpty() || elevationStatus.equals("-1")) { |
| | | elevationStatus = "Unknown"; |
| | | } |
| | | locationTag.setElevationStatus(elevationStatus); |
| | | |
| | | String gatheringCount = rs.getString("gathering_count"); |
| | | if (gatheringCount == null || gatheringCount.trim().isEmpty() || gatheringCount.equals("-1")) { |
| | | gatheringCount = "Unknown"; |
| | | } |
| | | locationTag.setGatheringCount(gatheringCount); |
| | | |
| | | String proximityAlarm = rs.getString("proximity_alarm"); |
| | | if (proximityAlarm == null || proximityAlarm.trim().isEmpty() || proximityAlarm.equals("-1")) { |
| | | proximityAlarm = "Unknown"; |
| | | } |
| | | locationTag.setProximityAlarm(proximityAlarm); |
| | | |
| | | String area = rs.getString("current_area"); |
| | | if (area == null || area.trim().isEmpty() || area.equals("-1")) { |
| | | area = "Unknown"; |
| | | } |
| | | locationTag.setArea(area); |
| | | |
| | | String xCoordinate = rs.getString("x_coordinate"); |
| | | if (xCoordinate == null || xCoordinate.trim().isEmpty() || xCoordinate.equals("-1")) { |
| | | xCoordinate = "Unknown"; |
| | | } |
| | | locationTag.setXCoordinate(xCoordinate); |
| | | |
| | | String yCoordinate = rs.getString("y_coordinate"); |
| | | if (yCoordinate == null || yCoordinate.trim().isEmpty() || yCoordinate.equals("-1")) { |
| | | yCoordinate = "Unknown"; |
| | | } |
| | | locationTag.setYCoordinate(yCoordinate); |
| | | |
| | | String zCoordinate = rs.getString("z_coordinate"); |
| | | if (zCoordinate == null || zCoordinate.trim().isEmpty() || zCoordinate.equals("-1")) { |
| | | zCoordinate = "Unknown"; |
| | | } |
| | | locationTag.setZCoordinate(zCoordinate); |
| | | |
| | | String floor = rs.getString("current_floor"); |
| | | if (floor == null || floor.trim().isEmpty() || floor.equals("-1")) { |
| | | floor = "Unknown"; |
| | | } |
| | | locationTag.setFloor(floor); |
| | | |
| | | String speed = rs.getString("movement_speed"); |
| | | if (speed == null || speed.trim().isEmpty() || speed.equals("-1")) { |
| | | speed = "Unknown"; |
| | | } |
| | | locationTag.setSpeed(speed); |
| | | |
| | | String locationSource = rs.getString("position_source"); |
| | | if (locationSource == null || locationSource.trim().isEmpty() || locationSource.equals("-1")) { |
| | | locationSource = "Unknown"; |
| | | } |
| | | locationTag.setLocationSource(locationSource); |
| | | |
| | | String lastUwbSignalTime = rs.getString("last_uwb_signal_time"); |
| | | if (lastUwbSignalTime == null || lastUwbSignalTime.trim().isEmpty() || lastUwbSignalTime.equals("-1")) { |
| | | lastUwbSignalTime = "Unknown"; |
| | | } |
| | | locationTag.setLastUwbSignalTime(lastUwbSignalTime); |
| | | |
| | | String lastSatelliteSignalTime = rs.getString("last_satellite_signal_time"); |
| | | if (lastSatelliteSignalTime == null || lastSatelliteSignalTime.trim().isEmpty() || lastSatelliteSignalTime.equals("-1")) { |
| | | lastSatelliteSignalTime = "Unknown"; |
| | | } |
| | | |
| | | locationTag.setAutoUpgraded("Unknown"); |
| | | locationTag.setIsSatelliteDevice("-1"); |
| | | locationTag.setRTKsource("Unknown"); |
| | | locationTags.add(locationTag); |
| | | tagMap.put(locationTag.getDeviceNumber(), locationTag); // æ·»å å°æ å° |
| | | } |
| | |
| | | case "interactionType": tag.setInteractionType(value); break; |
| | | case "ipAddress": tag.setIpAddress(value); break; |
| | | case "ipPort": tag.setIpPort(value); break; |
| | | case "gnGgaDataTime": tag.setGnGgaDataTime(value); break; |
| | | case "isSatelliteDevice": tag.setIsSatelliteDevice(value);break; |
| | | case "RTKsource": tag.setRTKsource(value);break; |
| | | default: |
| | | throw new IllegalArgumentException("æ æå±æ§: " + propertyName); |
| | | } |
| | |
| | | } |
| | | return tagMap.size(); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®åä¸ªå±æ§æ¥è¯¢LocationTag对象 |
| | | * @param propertyName 屿§åï¼deviceNumber/deviceVersion/companyï¼ |
| | | * @param propertyValue 屿§å¼ |
| | | * @return 满足æ¡ä»¶çLocationTag对象å表 |
| | | */ |
| | | public static List<LocationTag> getLocationTagsByProperty(String propertyName, String propertyValue) { |
| | | if (tagMap == null || tagMap.isEmpty()) { |
| | | try { |
| | | getlocationTags(); // åå§åæ°æ® |
| | | } catch (SQLException e) { |
| | | e.printStackTrace(); |
| | | return Collections.emptyList(); |
| | | } |
| | | } |
| | | |
| | | List<LocationTag> result = new ArrayList<>(); |
| | | |
| | | for (LocationTag tag : tagMap.values()) { |
| | | switch (propertyName) { |
| | | case "deviceNumber": |
| | | if (propertyValue.equals(tag.getDeviceNumber())) { |
| | | result.add(tag); |
| | | } |
| | | break; |
| | | case "deviceVersion": |
| | | if (propertyValue.equals(tag.getDeviceVersion())) { |
| | | result.add(tag); |
| | | } |
| | | break; |
| | | case "company": |
| | | if (propertyValue.equals(tag.getCompany())) { |
| | | result.add(tag); |
| | | } |
| | | break; |
| | | default: |
| | | throw new IllegalArgumentException("䏿¯æç屿§: " + propertyName); |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package dell_targets; |
| | | import targets.LocationTag; |
| | | import dell_targets.Dell_tag; |
| | | import javax.swing.*; |
| | | import javax.swing.table.*; |
| | | import java.awt.*; |
| | | import java.awt.event.WindowAdapter; |
| | | import java.awt.event.WindowEvent; |
| | | import java.util.*; |
| | | import java.util.List; |
| | | import java.util.ResourceBundle; |
| | | import publicsWay.ButtonUtils; // 导å
¥ButtonUtils |
| | | import publicsWay.TableUtils; // 导å
¥TableUtils |
| | | |
| | | public class SatelliteDevicePanel extends JPanel { |
| | | private static final long serialVersionUID = 1L; |
| | | private JTable deviceTable; |
| | | private DefaultTableModel tableModel; |
| | | private List<LocationTag> allDevices; |
| | | private ResourceBundle messages; |
| | | private JTextField searchField; |
| | | private JComboBox<String> upgradeConditionCombo; |
| | | private JTextField upgradeValueField; |
| | | private JButton startUpgradeButton; |
| | | private JTextField firmwareUrlField; // åºä»¶åçº§ææ¬å |
| | | |
| | | public static String FirmwareURL="";//åºä»¶å级å°å |
| | | public static boolean isOpenUpgrade=false;//æ¯å¦å¼å¯äºå级åè½ |
| | | public static List<LocationTag> needUpgradeList=null;//éè¦å级ç设å¤éå |
| | | |
| | | @SuppressWarnings("serial") |
| | | public SatelliteDevicePanel(ResourceBundle messages) { |
| | | this.messages = messages; |
| | | setLayout(new BorderLayout()); |
| | | setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
| | | |
| | | // æ·»å çªå£å
³éçå¬å¨ |
| | | addWindowCloseListener(); |
| | | |
| | | // 顶鍿ä½é¢æ¿ |
| | | JPanel topPanel = new JPanel(new BorderLayout(5, 5)); |
| | | topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("QUICK_OPERATION"))); |
| | | |
| | | // æç´¢é¢æ¿ |
| | | JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
| | | JLabel searchLabel = new JLabel(messages.getString("DEVICE_NUMBER") + ":"); |
| | | searchField = new JTextField(15); |
| | | |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH")); |
| | | JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET")); |
| | | JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH")); |
| | | |
| | | searchInputPanel.add(searchLabel); |
| | | searchInputPanel.add(searchField); |
| | | searchInputPanel.add(searchButton); |
| | | searchInputPanel.add(resetButton); |
| | | searchInputPanel.add(refreshButton); |
| | | |
| | | // å级æ¡ä»¶é¢æ¿ |
| | | JPanel upgradePanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); |
| | | upgradeConditionCombo = new JComboBox<>(new String[]{ |
| | | messages.getString("SET_UPGRADE_CONDITIONS"), |
| | | messages.getString("BY_VERSION"), |
| | | messages.getString("BY_NUMBER"), |
| | | messages.getString("BY_SELECTED_DEVICE"), |
| | | messages.getString("BY_COMPANY_NAME") |
| | | }); |
| | | upgradeValueField = new JTextField(15); |
| | | startUpgradeButton = ButtonUtils.createBlueButton(messages.getString("START_UPGRADE")); |
| | | |
| | | // æ°å¢åºä»¶å°åææ¬æ¡ |
| | | JLabel firmwareUrlLabel = new JLabel(messages.getString("FIRMWARE_URL") + ":"); |
| | | firmwareUrlField = new JTextField(20); |
| | | firmwareUrlField.setToolTipText(messages.getString("ENTER_FIRMWARE_DOWNLOAD_URL")); |
| | | |
| | | upgradePanel.add(upgradeConditionCombo); |
| | | upgradePanel.add(upgradeValueField); |
| | | upgradePanel.add(firmwareUrlLabel); |
| | | upgradePanel.add(firmwareUrlField); |
| | | upgradePanel.add(startUpgradeButton); |
| | | |
| | | // æä½æé®é¢æ¿ |
| | | JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); |
| | | |
| | | // å°æç´¢é¢æ¿ãåçº§é¢æ¿åæä½é¢æ¿æ¾å¨ä¸è¡ |
| | | JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); |
| | | rowPanel.add(searchInputPanel); |
| | | rowPanel.add(upgradePanel); |
| | | rowPanel.add(actionPanel); |
| | | |
| | | topPanel.add(rowPanel, BorderLayout.CENTER); |
| | | |
| | | // åå»ºè¡¨æ ¼åå - å¢å æå±å
¬å¸åæä»¤åéå |
| | | String[] columnNames = { |
| | | messages.getString("SELECT"), |
| | | messages.getString("INDEX"), |
| | | messages.getString("COMPANY"), // æ°å¢æå±å
¬å¸å |
| | | messages.getString("DEVICE_NUMBER"), |
| | | messages.getString("LONGITUDE"), |
| | | messages.getString("LATITUDE"), |
| | | messages.getString("ALTITUDE"), |
| | | messages.getString("STATUS"), |
| | | messages.getString("SATELLITE_COUNT"), |
| | | messages.getString("DIFFERENTIAL_TIME"), |
| | | messages.getString("RtkSource"), |
| | | messages.getString("VERSION"), |
| | | messages.getString("CARD_NUMBER"), |
| | | messages.getString("ADDRESS"), |
| | | messages.getString("PORT"), |
| | | messages.getString("COMMAND_SEND"), // æ°å¢æä»¤åéå |
| | | messages.getString("UPDATE_TIME") |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼æ¨¡å |
| | | tableModel = new DefaultTableModel(columnNames, 0) { |
| | | @Override |
| | | public boolean isCellEditable(int row, int column) { |
| | | // åªæéæ©ååæä»¤åéåå¯ç¼è¾ |
| | | return column == 0 || column == 14; |
| | | } |
| | | |
| | | @Override |
| | | public Class<?> getColumnClass(int columnIndex) { |
| | | // éæ©å使ç¨Booleanç±»å |
| | | if (columnIndex == 0) { |
| | | return Boolean.class; |
| | | } |
| | | return Object.class; |
| | | } |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼ - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | deviceTable = new JTable(tableModel); |
| | | TableUtils.setupTableStyle(deviceTable); |
| | | TableUtils.setupTableHeaderStyle(deviceTable); |
| | | deviceTable.setAutoCreateRowSorter(true); |
| | | deviceTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
| | | |
| | | // æ´æ°å宽设置ï¼å¢å å·®åæºåç宽度 |
| | | deviceTable.getColumnModel().getColumn(0).setPreferredWidth(50); |
| | | deviceTable.getColumnModel().getColumn(1).setPreferredWidth(50); |
| | | deviceTable.getColumnModel().getColumn(2).setPreferredWidth(100); |
| | | deviceTable.getColumnModel().getColumn(3).setPreferredWidth(100); |
| | | deviceTable.getColumnModel().getColumn(4).setPreferredWidth(80); |
| | | deviceTable.getColumnModel().getColumn(5).setPreferredWidth(80); |
| | | deviceTable.getColumnModel().getColumn(6).setPreferredWidth(80); |
| | | deviceTable.getColumnModel().getColumn(7).setPreferredWidth(60); |
| | | deviceTable.getColumnModel().getColumn(8).setPreferredWidth(80); |
| | | deviceTable.getColumnModel().getColumn(9).setPreferredWidth(100); |
| | | deviceTable.getColumnModel().getColumn(10).setPreferredWidth(100); // å·®åæºå宽度 |
| | | deviceTable.getColumnModel().getColumn(11).setPreferredWidth(80); |
| | | deviceTable.getColumnModel().getColumn(12).setPreferredWidth(100); |
| | | deviceTable.getColumnModel().getColumn(13).setPreferredWidth(120); |
| | | deviceTable.getColumnModel().getColumn(14).setPreferredWidth(80); |
| | | deviceTable.getColumnModel().getColumn(15).setPreferredWidth(100); |
| | | deviceTable.getColumnModel().getColumn(16).setPreferredWidth(150); |
| | | |
| | | // åºç¨åå
æ ¼æ¸²æå¨å°ææå - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer(); |
| | | for (int i = 0; i < deviceTable.getColumnCount(); i++) { |
| | | deviceTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); |
| | | } |
| | | |
| | | // ç¹æ®å¤çéæ©å(å¤éæ¡) |
| | | TableColumn selectColumn = deviceTable.getColumnModel().getColumn(0); |
| | | selectColumn.setCellRenderer(new DefaultTableCellRenderer() { |
| | | private JCheckBox checkBox = new JCheckBox(); |
| | | |
| | | @Override |
| | | public Component getTableCellRendererComponent(JTable table, Object value, |
| | | boolean isSelected, boolean hasFocus, |
| | | int row, int column) { |
| | | if (value instanceof Boolean) { |
| | | checkBox.setSelected((Boolean) value); |
| | | } |
| | | checkBox.setHorizontalAlignment(SwingConstants.CENTER); |
| | | |
| | | // 设置交æ¿è¡é¢è² |
| | | if (!isSelected) { |
| | | if (row % 2 == 0) { |
| | | checkBox.setBackground(new Color(240, 240, 200)); // æ·¡é»è² |
| | | } else { |
| | | checkBox.setBackground(Color.WHITE); // ç½è² |
| | | } |
| | | } else { |
| | | checkBox.setBackground(new Color(200, 220, 240)); // éä¸è¡çèè² |
| | | } |
| | | |
| | | checkBox.setOpaque(true); |
| | | return checkBox; |
| | | } |
| | | }); |
| | | |
| | | JScrollPane scrollPane = new JScrollPane(deviceTable); |
| | | scrollPane.setPreferredSize(new Dimension(1200, 400)); |
| | | scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ç§»é¤æ»å¨é¢æ¿è¾¹æ¡ |
| | | |
| | | // æ·»å ç»ä»¶ |
| | | add(topPanel, BorderLayout.NORTH); |
| | | add(scrollPane, BorderLayout.CENTER); |
| | | |
| | | // å è½½æ°æ® |
| | | loadDeviceData(); |
| | | |
| | | // æ·»å äºä»¶çå¬å¨ |
| | | searchButton.addActionListener(e -> searchDevices()); |
| | | resetButton.addActionListener(e -> resetSearch()); |
| | | refreshButton.addActionListener(e -> loadDeviceData()); |
| | | startUpgradeButton.addActionListener(e -> startUpgrade()); |
| | | |
| | | // æ·»å è¡¨æ ¼æ¨¡åçå¬å¨ï¼ç¨äºèªå¨æ´æ°éä¸è®¾å¤å°ææ¬æ¡ |
| | | tableModel.addTableModelListener(e -> { |
| | | if (e.getColumn() == 0 && messages.getString("BY_SELECTED_DEVICE").equals(upgradeConditionCombo.getSelectedItem())) { |
| | | updateSelectedDevicesToTextField(); |
| | | } |
| | | }); |
| | | |
| | | // æ·»å å级æ¡ä»¶ç»åæ¡çå¬å¨ |
| | | upgradeConditionCombo.addActionListener(e -> { |
| | | if (messages.getString("BY_SELECTED_DEVICE").equals(upgradeConditionCombo.getSelectedItem())) { |
| | | updateSelectedDevicesToTextField(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // æ´æ°éä¸è®¾å¤å°ææ¬æ¡ |
| | | private void updateSelectedDevicesToTextField() { |
| | | List<String> selectedDevices = new ArrayList<>(); |
| | | for (int i = 0; i < tableModel.getRowCount(); i++) { |
| | | Boolean isSelected = (Boolean) tableModel.getValueAt(i, 0); |
| | | if (isSelected != null && isSelected) { |
| | | String deviceNumber = (String) tableModel.getValueAt(i, 3); // 设å¤ç¼å·å¨ç¬¬3å |
| | | selectedDevices.add(deviceNumber); |
| | | } |
| | | } |
| | | upgradeValueField.setText(String.join(",", selectedDevices)); |
| | | } |
| | | |
| | | // æé®æ¸²æå¨ |
| | | class ButtonRenderer extends JButton implements TableCellRenderer { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public ButtonRenderer() { |
| | | setOpaque(true); |
| | | } |
| | | |
| | | @Override |
| | | public Component getTableCellRendererComponent(JTable table, Object value, |
| | | boolean isSelected, boolean hasFocus, |
| | | int row, int column) { |
| | | setText((value == null) ? "" : value.toString()); |
| | | return this; |
| | | } |
| | | } |
| | | |
| | | // æé®ç¼è¾å¨ |
| | | class ButtonEditor extends DefaultCellEditor { |
| | | private static final long serialVersionUID = 1L; |
| | | private String label; |
| | | private JButton button; |
| | | |
| | | public ButtonEditor(JCheckBox checkBox) { |
| | | super(checkBox); |
| | | button = new JButton(); |
| | | button.setOpaque(true); |
| | | button.addActionListener(e -> fireEditingStopped()); |
| | | } |
| | | |
| | | @Override |
| | | public Component getTableCellEditorComponent(JTable table, Object value, |
| | | boolean isSelected, int row, int column) { |
| | | label = (value == null) ? "" : value.toString(); |
| | | button.setText(label); |
| | | return button; |
| | | } |
| | | |
| | | @Override |
| | | public Object getCellEditorValue() { |
| | | return label; |
| | | } |
| | | } |
| | | |
| | | private void loadDeviceData() { |
| | | try { |
| | | allDevices = Dell_tag.getOnlineLocationTags(); |
| | | updateTable(allDevices); |
| | | } catch (Exception ex) { |
| | | JOptionPane.showMessageDialog(this, messages.getString("DATA_LOAD_ERROR") + ": " + ex.getMessage(), |
| | | messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); |
| | | } |
| | | } |
| | | |
| | | // æç´¢è®¾å¤ |
| | | private void searchDevices() { |
| | | String keyword = searchField.getText().trim(); |
| | | if (keyword.isEmpty()) { |
| | | updateTable(allDevices); |
| | | return; |
| | | } |
| | | |
| | | List<LocationTag> filtered = new ArrayList<>(); |
| | | for (LocationTag device : allDevices) { |
| | | if (device.getDeviceNumber() != null && |
| | | device.getDeviceNumber().toLowerCase().contains(keyword.toLowerCase())) { |
| | | filtered.add(device); |
| | | } |
| | | } |
| | | |
| | | if (filtered.isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, messages.getString("SEARCH_NO_RESULTS"), |
| | | messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE); |
| | | } |
| | | |
| | | updateTable(filtered); |
| | | } |
| | | |
| | | // éç½®æç´¢ |
| | | private void resetSearch() { |
| | | searchField.setText(""); |
| | | updateTable(allDevices); |
| | | } |
| | | |
| | | private void updateTable(List<LocationTag> devices) { |
| | | tableModel.setRowCount(0); |
| | | |
| | | int index = 1; |
| | | for (LocationTag device : devices) { |
| | | tableModel.addRow(new Object[]{ |
| | | false, // éæ©å |
| | | index++, |
| | | device.getCompany(), // æ°å¢å
¬å¸å |
| | | device.getDeviceNumber(), |
| | | device.getLongitude(), |
| | | device.getLatitude(), |
| | | device.getAltitude(), |
| | | device.getSatelliteQuality(), |
| | | device.getSatelliteCount(), |
| | | device.getDifferentialTime(), |
| | | device.getRTKsource(), // æ°å¢å·®åæºæ°æ® |
| | | device.getDeviceVersion(), |
| | | device.getDeviceCardNumber(), |
| | | device.getIpAddress(), |
| | | device.getIpPort(), |
| | | device.getAutoUpgraded(),// æä»¤åéæé® |
| | | device.getGnGgaDataTime() |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // å¯å¨å级 |
| | | private void startUpgrade() { |
| | | int dex = upgradeConditionCombo.getSelectedIndex(); |
| | | |
| | | String value = upgradeValueField.getText().trim(); |
| | | String firmwareUrl = firmwareUrlField.getText().trim(); |
| | | |
| | | if (firmwareUrl.isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, messages.getString("FIRMWARE_URL_REQUIRED"), |
| | | messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); |
| | | return; |
| | | } |
| | | |
| | | if (value.isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, messages.getString("UPGRADE_VALUE_REQUIRED"), |
| | | messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); |
| | | return; |
| | | } |
| | | |
| | | List<LocationTag> devicesToUpgrade = new ArrayList<>(); |
| | | |
| | | // æ ¹æ®æ¡ä»¶æ§è¡å级é»è¾ |
| | | if (dex == 3) { |
| | | // è·åéä¸çè®¾å¤ |
| | | for (int i = 0; i < tableModel.getRowCount(); i++) { |
| | | Boolean isSelected = (Boolean) tableModel.getValueAt(i, 0); |
| | | if (isSelected != null && isSelected) { |
| | | String deviceNumber = (String) tableModel.getValueAt(i, 3); |
| | | LocationTag device = Dell_tag.getTagByDeviceId(deviceNumber); |
| | | if (device != null) { |
| | | devicesToUpgrade.add(device); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (devicesToUpgrade.isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, messages.getString("SELECT_DEVICE_TO_UPGRADE"), |
| | | messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); |
| | | return; |
| | | } |
| | | } else if (dex == 1) { |
| | | // æ§è¡æçæ¬å级 |
| | | devicesToUpgrade = Dell_tag.getLocationTagsByProperty("deviceVersion", value); |
| | | } else if (dex == 2) { |
| | | // æ§è¡æè®¾å¤ç¼å·å级 - ä¿®å¤é»è¾é误 |
| | | String[] tagIds = value.split("[\\s,;]+"); // ä½¿ç¨æ£å表达å¼åå²å¤ç§åé符 |
| | | for (String tagId : tagIds) { |
| | | List<LocationTag> devicesForId = Dell_tag.getLocationTagsByProperty("deviceNumber", tagId.trim()); |
| | | if (devicesForId != null) { |
| | | devicesToUpgrade.addAll(devicesForId); |
| | | } |
| | | } |
| | | } else if (dex == 4) { |
| | | // æ§è¡æå
¬å¸åç§°å级 |
| | | devicesToUpgrade = Dell_tag.getLocationTagsByProperty("company", value); |
| | | } |
| | | |
| | | // éªè¯æ¯å¦æè®¾å¤éè¦å级 |
| | | if (devicesToUpgrade.isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, messages.getString("NO_DEVICES_TO_UPGRADE"), |
| | | messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); |
| | | return; |
| | | } |
| | | |
| | | FirmwareURL = firmwareUrl; // åºä»¶å级å°å |
| | | isOpenUpgrade = true; // æ¯å¦å¼å¯äºå级åè½ |
| | | needUpgradeList = devicesToUpgrade; // éè¦å级ç设å¤éå |
| | | |
| | | // æ§è¡å级 |
| | | performUpgrade(devicesToUpgrade, firmwareUrl); |
| | | } |
| | | |
| | | private void performUpgrade(List<LocationTag> devices, String firmwareUrl) { |
| | | // æå»ºè®¾å¤ç¼å·å表å符串 |
| | | StringBuilder deviceListBuilder = new StringBuilder(); |
| | | int maxDisplay = 20; |
| | | int displayCount = Math.min(devices.size(), maxDisplay); |
| | | |
| | | for (int i = 0; i < displayCount; i++) { |
| | | if (i > 0) { |
| | | deviceListBuilder.append(", "); |
| | | } |
| | | deviceListBuilder.append(devices.get(i).getDeviceNumber()); |
| | | } |
| | | |
| | | if (devices.size() > maxDisplay) { |
| | | deviceListBuilder.append(messages.getString("UPGRADE_DEVICE_ELLIPSIS")) |
| | | .append(devices.size()) |
| | | .append(messages.getString("UPGRADE_DEVICE_UNIT")); |
| | | } |
| | | |
| | | // å建å
å«è®¾å¤å表ååºä»¶å°åç宿´æ¶æ¯ |
| | | String message = messages.getString("UPGRADE_CONFIRMATION_HEADER") + |
| | | deviceListBuilder.toString() + |
| | | "\n\n" + messages.getString("FIRMWARE_URL_LABEL") + ": " + firmwareUrl + |
| | | "\n\n" + String.format(messages.getString("TOTAL_DEVICES_COUNT"), devices.size()); |
| | | |
| | | JOptionPane.showMessageDialog(this, |
| | | message, |
| | | messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE); |
| | | } |
| | | |
| | | // æ·»å çªå£å
³éçå¬å¨ |
| | | private void addWindowCloseListener() { |
| | | // è·åé¡¶å±çªå£ |
| | | Window window = SwingUtilities.getWindowAncestor(this); |
| | | if (window != null) { |
| | | window.addWindowListener(new WindowAdapter() { |
| | | @Override |
| | | public void windowClosing(WindowEvent e) { |
| | | isOpenUpgrade = false; |
| | | } |
| | | |
| | | @Override |
| | | public void windowClosed(WindowEvent e) { |
| | | isOpenUpgrade = false; |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | public static String getFirmwareURL() { |
| | | return FirmwareURL; |
| | | } |
| | | |
| | | public static boolean isOpenUpgrade() { |
| | | return isOpenUpgrade; |
| | | } |
| | | |
| | | public static List<LocationTag> getNeedUpgradeList() { |
| | | return needUpgradeList; |
| | | } |
| | | } |
| | |
| | | |
| | | import targets.LocationTag; |
| | | import javax.swing.*; |
| | | import javax.swing.table.DefaultTableCellRenderer; |
| | | import javax.swing.table.DefaultTableModel; |
| | | import javax.swing.table.JTableHeader; |
| | | import java.awt.*; |
| | | import java.awt.event.ActionEvent; |
| | | import java.awt.event.ActionListener; |
| | | import java.sql.SQLException; |
| | | import java.util.List; |
| | | import java.util.ResourceBundle; |
| | | import publicsWay.ButtonUtils; // Added import |
| | | |
| | | public class TagManagementPanel extends JPanel { |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | public TagManagementPanel(ResourceBundle messages) { |
| | | this.messages = messages; |
| | | setLayout(new BorderLayout()); |
| | | setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); |
| | | setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
| | | |
| | | // å建æç´¢é¢æ¿ |
| | | JPanel searchPanel = new JPanel(new BorderLayout(5, 5)); |
| | | searchPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("SEARCH"))); |
| | | // å建顶é¨é¢æ¿ |
| | | JPanel topPanel = new JPanel(new BorderLayout(5, 5)); |
| | | topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("SEARCH"))); |
| | | |
| | | // å建æç´¢ææ¬æ¡åæé® |
| | | searchField = new JTextField(10); // 缩çæç´¢ææ¬æ¡é¿åº¦ |
| | | JButton searchButton = new JButton(messages.getString("SEARCH")); |
| | | JButton refreshButton = new JButton(messages.getString("REFRESH")); // æ·»å å·æ°æé® |
| | | refreshButton.addActionListener(e -> loadTagData()); // ç»å®å·æ°å¨ä½ |
| | | // 左侧æç´¢ç»ä»¶é¢æ¿ |
| | | JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
| | | JLabel searchLabel = new JLabel(messages.getString("DEVICE_NUMBER") + ":"); |
| | | searchField = new JTextField(20); |
| | | |
| | | // 使ç¨ButtonUtilså建æé® |
| | | JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH")); |
| | | JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET")); |
| | | |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); |
| | | buttonPanel.add(searchButton); |
| | | buttonPanel.add(refreshButton); |
| | | searchInputPanel.add(searchLabel); |
| | | searchInputPanel.add(searchField); |
| | | searchInputPanel.add(searchButton); |
| | | searchInputPanel.add(resetButton); |
| | | |
| | | searchPanel.add(searchField, BorderLayout.CENTER); |
| | | searchPanel.add(buttonPanel, BorderLayout.EAST); |
| | | |
| | | // å建æä½æé®é¢æ¿ |
| | | JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); |
| | | JButton addButton = new JButton(messages.getString("ADD")); |
| | | JButton deleteButton = new JButton(messages.getString("DELETE")); |
| | | // å³ä¾§æä½æé®é¢æ¿ |
| | | JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); |
| | | JButton addButton = ButtonUtils.createBlueButton(messages.getString("ADD")); |
| | | JButton deleteButton = ButtonUtils.createBlueButton(messages.getString("DELETE")); |
| | | JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH")); |
| | | |
| | | actionPanel.add(addButton); |
| | | actionPanel.add(deleteButton); |
| | | actionPanel.add(refreshButton); |
| | | |
| | | // å°å·¦ä¾§æç´¢åå³ä¾§æä½æ·»å å°é¡¶é¨é¢æ¿ |
| | | topPanel.add(searchInputPanel, BorderLayout.CENTER); |
| | | topPanel.add(actionPanel, BorderLayout.EAST); |
| | | |
| | | // åå»ºè¡¨æ ¼ - æç
§è¡¨5è¦æ±ä¿®æ¹åå |
| | | String[] columnNames = { |
| | |
| | | tagTable.setAutoCreateRowSorter(true); |
| | | tagTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
| | | |
| | | // è®¾ç½®è¡¨æ ¼æ ·å¼ - 廿ç«çº¿ï¼åªæ¾ç¤ºæ¨ªçº¿ï¼æ
æ ææ |
| | | tagTable.setShowVerticalLines(false); // 䏿¾ç¤ºç«çº¿ |
| | | tagTable.setShowHorizontalLines(true); // æ¾ç¤ºæ¨ªçº¿ |
| | | tagTable.setGridColor(new Color(220, 220, 220)); // è®¾ç½®ç½æ ¼çº¿é¢è²ä¸ºæµ
ç°è² |
| | | tagTable.setIntercellSpacing(new Dimension(0, 1)); // 设置åå
æ ¼é´è·ï¼å¢å è¡é´è· |
| | | tagTable.setRowHeight(25); // 设置è¡é« |
| | | |
| | | // 设置å宽 |
| | | tagTable.getColumnModel().getColumn(0).setPreferredWidth(30); |
| | | tagTable.getColumnModel().getColumn(1).setPreferredWidth(100); |
| | |
| | | tagTable.getColumnModel().getColumn(9).setPreferredWidth(120); // ä¸çº¿æ¶é´ |
| | | tagTable.getColumnModel().getColumn(10).setPreferredWidth(100); |
| | | |
| | | // è®¾ç½®è¡¨å¤´æ ·å¼ |
| | | JTableHeader header = tagTable.getTableHeader(); |
| | | header.setBackground(new Color(70, 130, 180)); // é¢èè²è¡¨å¤´ |
| | | header.setForeground(Color.WHITE); |
| | | header.setFont(header.getFont().deriveFont(Font.BOLD)); |
| | | header.setPreferredSize(new Dimension(header.getWidth(), 30)); // å¢å 表头é«åº¦ |
| | | |
| | | // å建表头渲æå¨ |
| | | DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer() { |
| | | /** |
| | | * |
| | | */ |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | { |
| | | setHorizontalAlignment(SwingConstants.CENTER); |
| | | setBackground(new Color(70, 130, 180)); // é¢èè²è¡¨å¤´ |
| | | setForeground(Color.WHITE); |
| | | setFont(getFont().deriveFont(Font.BOLD)); |
| | | setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // å¢å 表头å
è¾¹è· |
| | | } |
| | | }; |
| | | |
| | | // åºç¨è¡¨å¤´æ¸²æå¨ |
| | | for (int i = 0; i < tagTable.getColumnCount(); i++) { |
| | | tagTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); |
| | | } |
| | | |
| | | // å建åå
æ ¼æ¸²æå¨ï¼å®ç°æ
æ ææ |
| | | DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() { |
| | | /** |
| | | * |
| | | */ |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @Override |
| | | public Component getTableCellRendererComponent(JTable table, Object value, |
| | | boolean isSelected, boolean hasFocus, |
| | | int row, int column) { |
| | | Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
| | | |
| | | // 设置交æ¿è¡é¢è² |
| | | if (!isSelected) { |
| | | if (row % 2 == 0) { |
| | | c.setBackground(new Color(240, 240, 200)); // æµ
ç°è² |
| | | } else { |
| | | c.setBackground(Color.WHITE); // ç½è² |
| | | } |
| | | } else { |
| | | c.setBackground(new Color(200, 220, 240)); // éä¸è¡çèè² |
| | | } |
| | | |
| | | // 设置åå
æ ¼å¯¹é½æ¹å¼ |
| | | if (column == 0) { // ç´¢å¼åå±
ä¸ |
| | | setHorizontalAlignment(SwingConstants.CENTER); |
| | | } else if (column == 5) { // çµæ± çµéåå±
ä¸ |
| | | setHorizontalAlignment(SwingConstants.CENTER); |
| | | } else { |
| | | setHorizontalAlignment(SwingConstants.CENTER); |
| | | } |
| | | |
| | | // 设置åå
æ ¼è¾¹æ¡ |
| | | setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); // å·¦å³å
è¾¹è· |
| | | |
| | | return c; |
| | | } |
| | | }; |
| | | |
| | | // åºç¨åå
æ ¼æ¸²æå¨å°ææå |
| | | for (int i = 0; i < tagTable.getColumnCount(); i++) { |
| | | tagTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); |
| | | } |
| | | |
| | | JScrollPane scrollPane = new JScrollPane(tagTable); |
| | | scrollPane.setPreferredSize(new Dimension(1200, 400)); |
| | | scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ç§»é¤æ»å¨é¢æ¿è¾¹æ¡ |
| | | |
| | | // æ·»å ç»ä»¶ |
| | | add(searchPanel, BorderLayout.NORTH); |
| | | add(topPanel, BorderLayout.NORTH); |
| | | add(scrollPane, BorderLayout.CENTER); |
| | | add(actionPanel, BorderLayout.SOUTH); |
| | | |
| | | // å è½½æ°æ® |
| | | loadTagData(); |
| | | |
| | | // æ·»å äºä»¶çå¬å¨ |
| | | searchButton.addActionListener(new SearchAction()); |
| | | resetButton.addActionListener(e -> resetSearch()); |
| | | refreshButton.addActionListener(e -> loadTagData()); |
| | | |
| | | addButton.addActionListener(e -> { |
| | | AddTagDialog dialog = new AddTagDialog((Frame) SwingUtilities.getWindowAncestor(TagManagementPanel.this), messages); |
| | | dialog.setVisible(true); |
| | |
| | | } |
| | | } |
| | | |
| | | // éç½®æç´¢ |
| | | private void resetSearch() { |
| | | searchField.setText(""); |
| | | updateTable(allTags); |
| | | } |
| | | |
| | | private class SearchAction implements ActionListener { |
| | | @Override |
| | | public void actionPerformed(ActionEvent e) { |
| | |
| | | import java.util.List; |
| | | import java.util.ResourceBundle; |
| | | import java.nio.charset.StandardCharsets; |
| | | import publicsWay.ButtonUtils; // 导å
¥ButtonUtils |
| | | import publicsWay.TableUtils; // 导å
¥TableUtils |
| | | |
| | | public class TagTypeManagementPanel extends JPanel { |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | private ResourceBundle messages; |
| | | |
| | | @SuppressWarnings("serial") |
| | | public TagTypeManagementPanel(ResourceBundle messages) { |
| | | public TagTypeManagementPanel(ResourceBundle messages) { |
| | | this.messages = messages; |
| | | setLayout(new BorderLayout()); |
| | | setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
| | |
| | | |
| | | // å建æé®é¢æ¿ |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); |
| | | JButton addButton = new JButton(getMessage("ADD")); |
| | | JButton editButton = new JButton(getMessage("EDIT")); |
| | | JButton deleteButton = new JButton(getMessage("DELETE")); |
| | | JButton refreshButton = new JButton(getMessage("REFRESH")); |
| | | |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton addButton = ButtonUtils.createBlueButton(getMessage("ADD")); |
| | | JButton editButton = ButtonUtils.createBlueButton(getMessage("EDIT")); |
| | | JButton deleteButton = ButtonUtils.createBlueButton(getMessage("DELETE")); |
| | | JButton refreshButton = ButtonUtils.createBlueButton(getMessage("REFRESH")); |
| | | |
| | | buttonPanel.add(addButton); |
| | | buttonPanel.add(editButton); |
| | |
| | | public boolean isCellEditable(int row, int column) { |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public Class<?> getColumnClass(int columnIndex) { |
| | | return Object.class; |
| | | } |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼ |
| | | // åå»ºè¡¨æ ¼ - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | typeTable = new JTable(tableModel); |
| | | TableUtils.setupTableStyle(typeTable); |
| | | TableUtils.setupTableHeaderStyle(typeTable); |
| | | typeTable.setAutoCreateRowSorter(true); |
| | | typeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
| | | |
| | |
| | | typeTable.getColumnModel().getColumn(2).setPreferredWidth(150); |
| | | typeTable.getColumnModel().getColumn(3).setPreferredWidth(200); |
| | | |
| | | // è®¾ç½®è¡¨å¤´æ ·å¼ï¼å·¦å¯¹é½ï¼ |
| | | JTableHeader header = typeTable.getTableHeader(); |
| | | header.setBackground(Color.GRAY); |
| | | header.setForeground(Color.WHITE); |
| | | header.setFont(header.getFont().deriveFont(Font.BOLD)); |
| | | |
| | | // å建表头渲æå¨ï¼å·¦å¯¹é½ï¼ |
| | | DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer() { |
| | | { |
| | | setHorizontalAlignment(SwingConstants.LEFT); |
| | | setBackground(Color.GRAY); |
| | | setForeground(Color.WHITE); |
| | | setFont(getFont().deriveFont(Font.BOLD)); |
| | | } |
| | | }; |
| | | |
| | | // åºç¨è¡¨å¤´æ¸²æå¨ |
| | | // åºç¨åå
æ ¼æ¸²æå¨å°ææå - 使ç¨TableUtilsä¸çæ¹æ³ |
| | | DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer(); |
| | | for (int i = 0; i < typeTable.getColumnCount(); i++) { |
| | | typeTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); |
| | | typeTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); |
| | | } |
| | | |
| | | JScrollPane scrollPane = new JScrollPane(typeTable); |
| | | scrollPane.setPreferredSize(new Dimension(800, 400)); |
| | | scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ç§»é¤æ»å¨é¢æ¿è¾¹æ¡ |
| | | |
| | | // æ·»å ç»ä»¶ |
| | | add(topPanel, BorderLayout.NORTH); |
| | |
| | | |
| | | private String getInteractionCodeFromIndex(int index) { |
| | | switch (index) { |
| | | case 0: return "1"; // éå¨ |
| | | case 0: return "1"; // æ¯å¨ |
| | | case 1: return "2"; // è鸣 |
| | | case 2: return "3"; // TTS |
| | | case 3: return "4"; // æ |
| | |
| | | fieldValues.put("interaction_type", type.getInteractionType()); |
| | | fieldValues.put("save_time", type.getSaveTime()); // æ´æ°æ¶é´ |
| | | |
| | | // ç´æ¥ä½¿ç¨ä¼ å
¥ç type 对象ç ID |
| | | // ç´æ¥ä½¿ç¨ä¼ å
¥çtype对象çID |
| | | if (type.getId() == null || type.getId().trim().isEmpty()) { |
| | | JOptionPane.showMessageDialog(this, getMessage("TAG_TYPE_NOT_FOUND"), |
| | | getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); |
| | |
| | | // 交äºç±»å |
| | | JLabel interactionLabel = new JLabel(getMessage("INTERACTION_TYPE") + ": *"); |
| | | String[] options = { |
| | | getMessage("VIBRATION"), // éå¨ |
| | | getMessage("VIBRATION"), // æ¯å¨ |
| | | getMessage("BEEP"), // è鸣 |
| | | getMessage("TTS"), // è¯é³ |
| | | getMessage("NONE") // æ |
| | |
| | | |
| | | // æé®é¢æ¿ |
| | | JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); |
| | | JButton okButton = new JButton(getMessage("OK")); |
| | | JButton cancelButton = new JButton(getMessage("CANCEL")); |
| | | |
| | | // 使ç¨ButtonUtilså建èè²æé® |
| | | JButton okButton = ButtonUtils.createBlueButton(getMessage("OK")); |
| | | JButton cancelButton = ButtonUtils.createBlueButton(getMessage("CANCEL")); |
| | | |
| | | okButton.addActionListener(e -> { |
| | | confirmed = true; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package publicsWay; |
| | | import javax.swing.*; |
| | | import java.awt.*; |
| | | import java.awt.event.MouseAdapter; |
| | | import java.awt.event.MouseEvent; |
| | | |
| | | public class ButtonUtils { |
| | | |
| | | /** |
| | | * å建èè²æ ·å¼æé®çéç¨æ¹æ³ |
| | | * @param text æé®ææ¬ |
| | | * @return é
ç½®å¥½æ ·å¼çJButton |
| | | */ |
| | | public static JButton createBlueButton(String text) { |
| | | JButton button = new JButton(text); |
| | | button.setBackground(new Color(0, 120, 215)); // èè²èæ¯ |
| | | button.setForeground(Color.WHITE); // ç½è²æå |
| | | button.setFocusPainted(false); |
| | | button.setOpaque(true); |
| | | button.setBorderPainted(false); |
| | | button.setFont(button.getFont().deriveFont(Font.BOLD)); // å ç²åä½ |
| | | |
| | | // æ·»å é¼ æ æ¬åææ |
| | | button.addMouseListener(new MouseAdapter() { |
| | | @Override |
| | | public void mouseEntered(MouseEvent e) { |
| | | button.setBackground(Color.GRAY); // é¼ æ æ¬åæ¶å为ç°è² |
| | | button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // é¼ æ å为æå |
| | | } |
| | | |
| | | @Override |
| | | public void mouseExited(MouseEvent e) { |
| | | button.setBackground(new Color(0, 120, 215)); // é¼ æ ç¦»å¼æ¶æ¢å¤èè² |
| | | button.setCursor(Cursor.getDefaultCursor()); // é¼ æ æ¢å¤é»è®¤å½¢ç¶ |
| | | } |
| | | }); |
| | | |
| | | return button; |
| | | } |
| | | } |
| | |
| | | import java.util.concurrent.ConcurrentLinkedQueue; |
| | | import java.util.concurrent.atomic.AtomicBoolean; |
| | | import dell55AAData.Dell55AA01Parser; |
| | | import dell55AAData.Dell55AA02Parser; |
| | | import dell55AAData.Dell55AA12HighPerf; |
| | | |
| | | import java.util.concurrent.ExecutorService; |
| | |
| | | // å¤çè§£æåçæ°æ®å
|
| | | for (PacketParser.DataPacket p : parsedPackets) { |
| | | // æ ¹æ®å
头类åè·¯ç±å°ä¸åè§£æå¨ |
| | | // System.out.println(p.getPacketType()); |
| | | switch (p.getPacketType()) { |
| | | case 0x01: |
| | | processType01(p,ip,port);break; |
| | |
| | | |
| | | private static void processType02(PacketParser.DataPacket packet,String ip,int port) { |
| | | String hexData = PacketParser.bytesToHexString(packet.getPacket()); |
| | | System.out.println("å¤ç55AA02å
: " + packet); |
| | | Dell55AA02Parser.parse(hexData,ip,port); |
| | | // å®é
ä¸å¡é»è¾ |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package publicsWay; |
| | | |
| | | import java.util.concurrent.ConcurrentLinkedQueue; |
| | | import java.util.concurrent.atomic.AtomicBoolean; |
| | | import java.util.regex.Pattern; |
| | | import dell55AAData.DellGngga; |
| | | import dell55AAData.XTB; |
| | | |
| | | import java.util.regex.Matcher; |
| | | import dell_system.MessageViewPanel; |
| | | import dell_targets.Dell_tag; |
| | | |
| | | import java.util.concurrent.ExecutorService; |
| | | import java.util.concurrent.Executors; |
| | | |
| | | public class PacketProcessingSystemB { |
| | | // 线ç¨å®å
¨çæ¥æåå¨éåï¼éåAï¼ |
| | | private static final ConcurrentLinkedQueue<HexPacket> packetQueue = new ConcurrentLinkedQueue<>(); |
| | | private static final AtomicBoolean isRunning = new AtomicBoolean(false); |
| | | private static final ExecutorService parserExecutor = Executors.newSingleThreadExecutor(); |
| | | private static Thread parserThread; |
| | | private static boolean a1 = true; |
| | | |
| | | // å¯éç¨çDellGnggaå®ä¾ï¼çº¿ç¨å®å
¨ï¼ |
| | | private static final ThreadLocal<DellGngga> dellGnggaParser = ThreadLocal.withInitial(DellGngga::new); |
| | | private static final ThreadLocal<XTB> dellXTB = ThreadLocal.withInitial(XTB::new); |
| | | // æ¥æåå¨ç»æ |
| | | public static class HexPacket { |
| | | public final String ip; |
| | | public final int port; |
| | | public final String hexData; |
| | | public final long timestamp; |
| | | |
| | | public HexPacket(String ip, int port, String hexData, long timestamp) { |
| | | this.ip = ip; |
| | | this.port = port; |
| | | this.hexData = hexData; |
| | | this.timestamp = timestamp; |
| | | } |
| | | |
| | | public String getIp() { |
| | | return ip; |
| | | } |
| | | |
| | | public int getPort() { |
| | | return port; |
| | | } |
| | | |
| | | public String getHexData() { |
| | | return hexData; |
| | | } |
| | | |
| | | public long getTimestamp() { |
| | | return timestamp; |
| | | } |
| | | } |
| | | |
| | | // æ¥æ¶ç«¯å卿¥æï¼UDPPortAReceiverä¸è°ç¨ï¼ |
| | | public static void storePacket(String ip, int port, String hexData) { |
| | | if (a1) { |
| | | startProcessing(); |
| | | a1 = false; |
| | | } |
| | | if (packetQueue.size() < 100000) { // éå¶éå大å°é²æ¢OOM |
| | | packetQueue.offer(new HexPacket(ip, port, hexData, System.currentTimeMillis())); |
| | | } |
| | | } |
| | | |
| | | // å¯å¨è§£æç³»ç» |
| | | public static void startProcessing() { |
| | | if (isRunning.get()) return; |
| | | |
| | | isRunning.set(true); |
| | | parserThread = new Thread(() -> { |
| | | while (isRunning.get()) { |
| | | HexPacket packet = packetQueue.poll(); |
| | | if (packet == null) { |
| | | Thread.yield(); // éå为空æ¶è®©åºCPU |
| | | continue; |
| | | } |
| | | |
| | | try { |
| | | String receivedata = packet.hexData; |
| | | String ip = packet.getIp(); |
| | | int port = packet.getPort(); |
| | | processData(receivedata, ip, port); |
| | | |
| | | } catch (Exception e) { |
| | | System.err.println("è§£æé误: " + e.getMessage()); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | parserThread.setDaemon(true); |
| | | parserThread.start(); |
| | | } |
| | | |
| | | // åæ¢è§£æç³»ç» |
| | | public static void stopProcessing() { |
| | | isRunning.set(false); |
| | | parserExecutor.shutdownNow(); |
| | | if (parserThread != null) { |
| | | parserThread.interrupt(); |
| | | } |
| | | } |
| | | |
| | | public static void processData(String receivedata, String ip, int port) { |
| | | // 廿å车æ¢è¡ç¬¦ |
| | | receivedata = receivedata.replaceAll("[\\r\\n]+", ""); |
| | | // 转大å |
| | | receivedata = receivedata.toUpperCase(); |
| | | |
| | | // å®ä¹æ£å表达å¼ï¼å¹é
以 $GNGGAã$XTBã$SSGGAã$GBGGA æ 55AA å¼å¤´çæ°æ® |
| | | String regex = "(\\$GNGGA[^$]*|\\$XTB[^$]*|\\$SSGGA[^$]*|\\$GBGGA[^$]*|55AA[^$]*)"; |
| | | |
| | | // ä½¿ç¨æ£å表达å¼åå²å符串 |
| | | Pattern pattern = Pattern.compile(regex); |
| | | Matcher matcher = pattern.matcher(receivedata); |
| | | |
| | | // éåå¹é
å°çæ°æ® |
| | | while (matcher.find()) { |
| | | String data = matcher.group(1); |
| | | |
| | | if (data.startsWith("$GNGGA")) { |
| | | handleGNGGA(data, ip, port); |
| | | } else if (data.startsWith("$XTB")) { |
| | | handleXTB(data, ip, port); |
| | | } else if (data.startsWith("$SSGGA")) { |
| | | handleSSGGA(data, ip, port); |
| | | } else if (data.startsWith("$GBGGA")) { |
| | | handleGBGGA(data, ip, port); |
| | | } else if (data.startsWith("55AA")) { |
| | | handle55AA(data, ip, port); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private static void handleGNGGA(String data, String ip, int port) {// å¤ç$GNGGAæ°æ® |
| | | MessageViewPanel.showData(data, ip, port, 0, "UDPB", "GNGGA", "ALL"); |
| | | // 使ç¨å¯éç¨çè§£æå¨å®ä¾è§£ææ°æ® |
| | | dellGGA(data, ip,port); |
| | | |
| | | } |
| | | |
| | | private static void handleXTB(String data, String ip, int port) { |
| | | // å¤ç$XTBæ°æ® |
| | | MessageViewPanel.showData(data, ip, port, 0, "UDPB", "XTB", "ALL"); |
| | | // å
·ä½è§£æé»è¾ |
| | | dellXTB(data,ip,port) ; |
| | | } |
| | | |
| | | private static void handleSSGGA(String data, String ip, int port) { |
| | | // å¤ç$SSGGAæ°æ® |
| | | MessageViewPanel.showData(data, ip, port, 0, "UDPB", "SSGGA", "ALL"); |
| | | dellGGA(data, ip,port); |
| | | // å
·ä½è§£æé»è¾ |
| | | } |
| | | |
| | | private static void handleGBGGA(String data, String ip, int port) { |
| | | // å¤ç$GBGGAæ°æ® |
| | | MessageViewPanel.showData(data, ip, port, 0, "UDPB", "GBGGA", "ALL"); |
| | | // å
·ä½è§£æé»è¾ |
| | | dellGGA(data, ip,port); |
| | | } |
| | | |
| | | private static void handle55AA(String data, String ip, int port) { |
| | | // å¤ç55AAæ°æ® |
| | | System.out.println("Handling 55AA: " + data); |
| | | // å
·ä½è§£æé»è¾ |
| | | } |
| | | |
| | | private static void dellGGA(String data, String ip, int port) { |
| | | DellGngga parser = dellGnggaParser.get(); |
| | | parser.parse(data); |
| | | String utcTime= parser.getUtcTime(); |
| | | String latitude = parser.getLatitude(); // è·åçº¬åº¦å¼ |
| | | String latHemisphere = parser.getLatHemisphere(); // è·å纬度åçï¼NæSï¼ |
| | | String longitude = parser.getLongitude(); // è·åç»åº¦å¼ |
| | | String lonHemisphere = parser.getLonHemisphere(); // è·åç»åº¦åçï¼EæWï¼ |
| | | String quality = parser.getQuality(); // è·åGPSå®ä½è´¨é |
| | | String satellites = parser.getSatellites(); // è·å使ç¨ç嫿æ°é |
| | | String hdop = parser.getHdop(); // è·å水平精度å å |
| | | String altitude = parser.getAltitude(); // è·åæµ·æé«åº¦ |
| | | String altitudeUnit = parser.getAltitudeUnit(); // è·åæµ·æåä½ |
| | | String geoidHeight = parser.getGeoidHeight(); // è·å大尿°´åé¢é«åº¦ |
| | | String geoidHeightUnit = parser.getGeoidHeightUnit(); // è·å大尿°´åé¢é«åº¦åä½ |
| | | String differentialTime = parser.getDifferentialTime(); // è·åå·®åæ¶é´ |
| | | String checksum = parser.getChecksum(); // è·åæ ¡éªå |
| | | String deviceId = parser.getDeviceId(); // è·å设å¤ID |
| | | String battery = parser.getBattery(); // è·åçµæ± çµé |
| | | String signalStrength = parser.getSignalStrength(); // è·åä¿¡å·å¼ºåº¦ |
| | | String reserve1 = parser.getReserve1(); // è·åä¿çåæ®µ1 |
| | | String reserve2 = parser.getReserve2(); // è·åä¿çåæ®µ2 |
| | | String reserve3 = parser.getReserve3(); // è·åä¿çåæ®µ3 |
| | | |
| | | String portStr = String.valueOf(port); // å°ç«¯å£å·è½¬æ¢ä¸ºå符串 |
| | | String time = EfficientTimeFormatter.getCurrentTimeFormatted(); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "utcTime",utcTime); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "deviceBattery",time); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "lastSatelliteSignalTime",time); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "gnGgaDataTime",time); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "latitude",latitude); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "longitude",longitude); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "satelliteQuality",quality); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "satelliteCount",satellites); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "altitude",altitude); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "ipAddress",ip); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "ipPort",portStr); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "onlineStatus","1"); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "isSatelliteDevice","1"); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "differentialTime",differentialTime); |
| | | |
| | | // å建TrackData对象并添å å°æ¹éæå
¥å¨ |
| | | TrackData trackData = new TrackData( |
| | | parser.getDeviceId(), |
| | | parser.getUtcTime(), |
| | | parser.getLatitude(), |
| | | parser.getLongitude(), |
| | | parser.getQuality(), |
| | | parser.getSatellites(), |
| | | parser.getHdop(), |
| | | parser.getAltitude(), |
| | | parser.getGeoidHeight(), |
| | | parser.getDifferentialTime(), |
| | | parser.getBattery() |
| | | ); |
| | | |
| | | TrackDataBatchInserter.addTrackData(trackData); |
| | | |
| | | } |
| | | private static void dellXTB(String data, String ip, int port) { |
| | | String portStr = String.valueOf(port); // å°ç«¯å£å·è½¬æ¢ä¸ºå符串 |
| | | XTB parser = dellXTB.get(); |
| | | parser.parse(data); |
| | | String deviceId=parser.getDeviceId();// 设å¤ç¼å· |
| | | String battery=parser.getBattery();// çµé |
| | | String version=parser.getVersion();// çæ¬å· |
| | | String ccid=parser.getCcid(); // CCID |
| | | String button=parser.getButton(); // æé® |
| | | String rtcmSource=parser.getRtcmSource(); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "ipAddress",ip); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "ipPort",portStr); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "RTKsource",rtcmSource); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "sosStatus",button); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "deviceCardNumber",ccid); |
| | | Dell_tag.updateLocationTagProperty(deviceId, "deviceVersion",version); |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | package publicsWay; // å
声æ |
| | | import javax.swing.*; // 导å
¥Swingç»ä»¶ |
| | | import javax.swing.table.DefaultTableCellRenderer; // 导å
¥è¡¨æ ¼åå
æ ¼æ¸²æå¨ |
| | | import javax.swing.table.DefaultTableModel; // 导å
¥é»è®¤è¡¨æ ¼æ¨¡å |
| | | import java.awt.*; // 导å
¥AWTå¾å½¢ç»ä»¶ |
| | | package publicsWay; |
| | | |
| | | public class TableUtils { // è¡¨æ ¼å·¥å
·ç±» |
| | | import javax.swing.*; |
| | | import javax.swing.table.DefaultTableCellRenderer; |
| | | import javax.swing.table.DefaultTableModel; |
| | | import javax.swing.table.JTableHeader; |
| | | import java.awt.*; |
| | | |
| | | public class TableUtils { |
| | | |
| | | // å建éç¨è¡¨æ ¼çæ¹æ³ |
| | | // Create a styled table with specified column names |
| | | @SuppressWarnings("serial") |
| | | public static JTable createCommonTable(String[] columnNames) { // éææ¹æ³å¯ç´æ¥è°ç¨ |
| | | // åå»ºè¡¨æ ¼æ¨¡å - å¿åå
é¨ç±»æ©å±DefaultTableModel |
| | | DefaultTableModel model = new DefaultTableModel(columnNames, 0) { // åå§åè¡¨æ ¼æ¨¡å |
| | | public static JTable createCommonTable(String[] columnNames) { |
| | | // Create table model |
| | | DefaultTableModel model = new DefaultTableModel(columnNames, 0) { |
| | | @Override |
| | | public boolean isCellEditable(int row, int column) { // éååå
æ ¼å¯ç¼è¾æ§ |
| | | return false; // ææåå
æ ¼ä¸å¯ç¼è¾ |
| | | public boolean isCellEditable(int row, int column) { |
| | | return false; |
| | | } |
| | | }; |
| | | |
| | | // åå»ºè¡¨æ ¼å®ä¾ |
| | | JTable table = new JTable(model); // 使ç¨èªå®ä¹æ¨¡ååå»ºè¡¨æ ¼ |
| | | table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设置å鿍¡å¼ |
| | | // Create table instance |
| | | JTable table = new JTable(model); |
| | | table.setAutoCreateRowSorter(true); |
| | | table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
| | | |
| | | // å建表头渲æå¨ |
| | | DefaultTableCellRenderer headerRenderer = createHeaderRenderer(); // è°ç¨æ¸²æå¨åå»ºæ¹æ³ |
| | | // Apply table styling |
| | | setupTableStyle(table); |
| | | |
| | | // åºç¨è¡¨å¤´æ¸²æå¨å°ææå |
| | | for (int i = 0; i < table.getColumnCount(); i++) { // éåææå |
| | | table.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); // 设置å头渲æå¨ |
| | | } |
| | | // Apply header styling |
| | | setupTableHeaderStyle(table); |
| | | |
| | | return table; // è¿åé
置好çè¡¨æ ¼å®ä¾ |
| | | return table; |
| | | } |
| | | |
| | | // å建表头渲æå¨ |
| | | // Setup basic table styling |
| | | public static void setupTableStyle(JTable table) { |
| | | table.setShowVerticalLines(false); |
| | | table.setShowHorizontalLines(true); |
| | | table.setGridColor(new Color(220, 220, 220)); |
| | | table.setIntercellSpacing(new Dimension(0, 1)); |
| | | table.setRowHeight(25); |
| | | } |
| | | |
| | | // Setup table header styling |
| | | public static void setupTableHeaderStyle(JTable table) { |
| | | JTableHeader header = table.getTableHeader(); |
| | | header.setBackground(new Color(70, 130, 180)); |
| | | header.setForeground(Color.WHITE); |
| | | header.setFont(header.getFont().deriveFont(Font.BOLD)); |
| | | header.setPreferredSize(new Dimension(header.getWidth(), 30)); |
| | | |
| | | // Create and apply header renderer |
| | | DefaultTableCellRenderer headerRenderer = createHeaderRenderer(); |
| | | for (int i = 0; i < table.getColumnCount(); i++) { |
| | | table.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); |
| | | } |
| | | } |
| | | |
| | | // Create header renderer |
| | | @SuppressWarnings("serial") |
| | | private static DefaultTableCellRenderer createHeaderRenderer() { // ç§æå·¥å
·æ¹æ³ |
| | | return new DefaultTableCellRenderer() { // è¿åå¿åå
é¨ç±»å®ä¾ |
| | | { // å®ä¾åå§åå |
| | | setHorizontalAlignment(SwingConstants.LEFT); // è®¾ç½®è¡¨å¤´ææ¬å·¦å¯¹é½ |
| | | setBackground(Color.GRAY); // è®¾ç½®è¡¨å¤´èæ¯ä¸ºç°è² |
| | | setForeground(Color.WHITE); // 设置表头æå为ç½è² |
| | | setFont(getFont().deriveFont(Font.BOLD)); // 设置表头åä½å ç² |
| | | private static DefaultTableCellRenderer createHeaderRenderer() { |
| | | return new DefaultTableCellRenderer() { |
| | | { |
| | | setHorizontalAlignment(SwingConstants.CENTER); |
| | | setBackground(new Color(70, 130, 180)); |
| | | setForeground(Color.WHITE); |
| | | setFont(getFont().deriveFont(Font.BOLD)); |
| | | setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | // Create cell renderer with zebra striping |
| | | @SuppressWarnings("serial") |
| | | public static DefaultTableCellRenderer createCellRenderer(int alignment) { |
| | | return new DefaultTableCellRenderer() { |
| | | @Override |
| | | public Component getTableCellRendererComponent(JTable table, Object value, |
| | | boolean isSelected, boolean hasFocus, |
| | | int row, int column) { |
| | | Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
| | | |
| | | // Set alternating row colors |
| | | if (!isSelected) { |
| | | if (row % 2 == 0) { |
| | | c.setBackground(new Color(240, 240, 200)); |
| | | } else { |
| | | c.setBackground(Color.WHITE); |
| | | } |
| | | } else { |
| | | c.setBackground(new Color(200, 220, 240)); |
| | | } |
| | | |
| | | // Set cell alignment |
| | | setHorizontalAlignment(alignment); |
| | | |
| | | // Set cell padding |
| | | setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); |
| | | |
| | | return c; |
| | | } |
| | | }; |
| | | } |
| | | |
| | | // Create centered cell renderer with zebra striping (most common case) |
| | | public static DefaultTableCellRenderer createCenteredCellRenderer() { |
| | | return createCellRenderer(SwingConstants.CENTER); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package publicsWay; |
| | | |
| | | public class TrackData { |
| | | public String deviceNumber; // 设å¤ç¼å· |
| | | public String deviceName; // 设å¤åç§° |
| | | public String xCoordinate; // Xåæ |
| | | public String yCoordinate; // Yåæ |
| | | public String zCoordinate; // Zåæ |
| | | public String layer; // å±çº§ |
| | | public String battery; // çµæ± çµé |
| | | public String utcTimes; // UTCæ¶é´ |
| | | public String latitude; // 纬度 |
| | | public String longitude; // ç»åº¦ |
| | | public String positioningQuality; // å®ä½è´¨é |
| | | public String satelliteCount; // 嫿æ°é |
| | | public String hdop; // 水平精度å å |
| | | public String altitude; // æµ·æé«åº¦ |
| | | public String geoidHeight; // å°çé«ç¨ |
| | | public String differentialTime; // å·®åæ¶é´ |
| | | public String source; // æ°æ®æ¥æº |
| | | public String company; // å
¬å¸åç§° |
| | | public String saveTime; // ä¿åæ¶é´ |
| | | public TrackData( |
| | | String deviceNumber, // 设å¤ç¼å· |
| | | String deviceName, // 设å¤åç§° |
| | | String xCoordinate, // Xåæ |
| | | String yCoordinate, // Yåæ |
| | | String zCoordinate, // Zåæ |
| | | String layer, // å±çº§ |
| | | String battery, // çµæ± çµé |
| | | String utcTimes, // UTCæ¶é´ |
| | | String latitude, // 纬度 |
| | | String longitude, // ç»åº¦ |
| | | String positioningQuality, // å®ä½è´¨é |
| | | String satelliteCount, // 嫿æ°é |
| | | String hdop, // 水平精度å å |
| | | String altitude, // æµ·æé«åº¦ |
| | | String geoidHeight, // å°çé«ç¨ |
| | | String differentialTime, // å·®åæ¶é´ |
| | | String source, // æ°æ®æ¥æº |
| | | String company, // å
¬å¸åç§° |
| | | String saveTime) { |
| | | this.deviceNumber = deviceNumber; |
| | | this.deviceName = deviceName; // è¡¥å
åå§å |
| | | this.xCoordinate = xCoordinate; // è¡¥å
åå§å |
| | | this.yCoordinate = yCoordinate; // è¡¥å
åå§å |
| | | this.zCoordinate = zCoordinate; // è¡¥å
åå§å |
| | | this.layer = layer; // è¡¥å
åå§å |
| | | this.battery = battery; |
| | | this.utcTimes = utcTimes; |
| | | this.latitude = latitude; |
| | | this.longitude = longitude; |
| | | this.positioningQuality = positioningQuality; |
| | | this.satelliteCount = satelliteCount; |
| | | this.hdop = hdop; |
| | | this.altitude = altitude; |
| | | this.geoidHeight = geoidHeight; |
| | | this.differentialTime = differentialTime; |
| | | this.source = source; // 使ç¨ä¼ å
¥ç source åæ° |
| | | this.company = company; // è¡¥å
åå§å |
| | | this.saveTime = saveTime; // 使ç¨ä¼ å
¥ç saveTime åæ° |
| | | } |
| | | public String getDeviceNumber() { |
| | | return deviceNumber; |
| | | } |
| | | public String getDeviceName() { |
| | | return deviceName; |
| | | } |
| | | public String getxCoordinate() { |
| | | return xCoordinate; |
| | | } |
| | | public String getyCoordinate() { |
| | | return yCoordinate; |
| | | } |
| | | public String getzCoordinate() { |
| | | return zCoordinate; |
| | | } |
| | | public String getLayer() { |
| | | return layer; |
| | | } |
| | | public String getBattery() { |
| | | return battery; |
| | | } |
| | | public String getUtcTimes() { |
| | | return utcTimes; |
| | | } |
| | | public String getLatitude() { |
| | | return latitude; |
| | | } |
| | | public String getLongitude() { |
| | | return longitude; |
| | | } |
| | | public String getPositioningQuality() { |
| | | return positioningQuality; |
| | | } |
| | | public String getSatelliteCount() { |
| | | return satelliteCount; |
| | | } |
| | | public String getHdop() { |
| | | return hdop; |
| | | } |
| | | public String getAltitude() { |
| | | return altitude; |
| | | } |
| | | public String getGeoidHeight() { |
| | | return geoidHeight; |
| | | } |
| | | public String getDifferentialTime() { |
| | | return differentialTime; |
| | | } |
| | | public String getSource() { |
| | | return source; |
| | | } |
| | | public String getCompany() { |
| | | return company; |
| | | } |
| | | public String getSaveTime() { |
| | | return saveTime; |
| | | } |
| | | public void setDeviceNumber(String deviceNumber) { |
| | | this.deviceNumber = deviceNumber; |
| | | } |
| | | public void setDeviceName(String deviceName) { |
| | | this.deviceName = deviceName; |
| | | } |
| | | public void setxCoordinate(String xCoordinate) { |
| | | this.xCoordinate = xCoordinate; |
| | | } |
| | | public void setyCoordinate(String yCoordinate) { |
| | | this.yCoordinate = yCoordinate; |
| | | } |
| | | public void setzCoordinate(String zCoordinate) { |
| | | this.zCoordinate = zCoordinate; |
| | | } |
| | | public void setLayer(String layer) { |
| | | this.layer = layer; |
| | | } |
| | | public void setBattery(String battery) { |
| | | this.battery = battery; |
| | | } |
| | | public void setUtcTimes(String utcTimes) { |
| | | this.utcTimes = utcTimes; |
| | | } |
| | | public void setLatitude(String latitude) { |
| | | this.latitude = latitude; |
| | | } |
| | | public void setLongitude(String longitude) { |
| | | this.longitude = longitude; |
| | | } |
| | | public void setPositioningQuality(String positioningQuality) { |
| | | this.positioningQuality = positioningQuality; |
| | | } |
| | | public void setSatelliteCount(String satelliteCount) { |
| | | this.satelliteCount = satelliteCount; |
| | | } |
| | | public void setHdop(String hdop) { |
| | | this.hdop = hdop; |
| | | } |
| | | public void setAltitude(String altitude) { |
| | | this.altitude = altitude; |
| | | } |
| | | public void setGeoidHeight(String geoidHeight) { |
| | | this.geoidHeight = geoidHeight; |
| | | } |
| | | public void setDifferentialTime(String differentialTime) { |
| | | this.differentialTime = differentialTime; |
| | | } |
| | | public void setSource(String source) { |
| | | this.source = source; |
| | | } |
| | | public void setCompany(String company) { |
| | | this.company = company; |
| | | } |
| | | public void setSaveTime(String saveTime) { |
| | | this.saveTime = saveTime; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package publicsWay; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.concurrent.ConcurrentLinkedQueue; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | import databases.DBConnector; |
| | | import scheduled_task.TrackTableManager; |
| | | |
| | | public class TrackDataBatchInserter { |
| | | private static final int BATCH_SIZE = 1000; |
| | | private static final long BATCH_INTERVAL_MS = 1000; |
| | | private static final int MAX_QUEUE_SIZE = 100000; |
| | | |
| | | private static final ConcurrentLinkedQueue<TrackData> trackDataQueue = new ConcurrentLinkedQueue<>(); |
| | | private static final ScheduledExecutorService batchInsertExecutor = Executors.newSingleThreadScheduledExecutor(); |
| | | |
| | | static { |
| | | batchInsertExecutor.scheduleAtFixedRate(() -> { |
| | | try { |
| | | batchInsertTrackData(); |
| | | } catch (Exception e) { |
| | | System.err.println("æ¹éæå
¥æ°æ®å¼å¸¸: " + e.getMessage()); |
| | | } |
| | | }, BATCH_INTERVAL_MS, BATCH_INTERVAL_MS, TimeUnit.MILLISECONDS); |
| | | } |
| | | |
| | | |
| | | // æ·»å æ°æ®å°éå |
| | | public static void addTrackData(TrackData data) { |
| | | if (trackDataQueue.size() < MAX_QUEUE_SIZE) { |
| | | trackDataQueue.offer(data); |
| | | } |
| | | } |
| | | |
| | | private static void batchInsertTrackData() { |
| | | if (trackDataQueue.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | String tableName = "tb_track_" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); |
| | | |
| | | List<TrackData> batchList = new ArrayList<>(BATCH_SIZE); |
| | | int count = 0; |
| | | |
| | | while (count < BATCH_SIZE && !trackDataQueue.isEmpty()) { |
| | | TrackData data = trackDataQueue.poll(); |
| | | if (data != null) { |
| | | batchList.add(data); |
| | | count++; |
| | | } |
| | | } |
| | | |
| | | if (batchList.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | // 使ç¨DBConnectoræ£æ¥è¡¨æ¯å¦åå¨ï¼ä¸åå¨åå建 |
| | | if (!DBConnector.tableExists(tableName)) { |
| | | DBConnector.executeDDL(TrackTableManager.getcreateSQL(tableName)); |
| | | } |
| | | |
| | | // å夿¹éæå
¥æ°æ® |
| | | List<Object[]> paramsList = new ArrayList<>(); |
| | | for (TrackData data : batchList) { |
| | | Object[] params = new Object[]{ |
| | | data.getDeviceNumber(), |
| | | data.getDeviceName(), |
| | | data.getxCoordinate(), |
| | | data.getxCoordinate(), |
| | | data.getxCoordinate(), |
| | | data.getLayer(), |
| | | data.getBattery(), |
| | | data.getUtcTimes(), |
| | | data.getLatitude(), |
| | | data.getLongitude(), |
| | | data.getPositioningQuality(), |
| | | data.getSatelliteCount(), |
| | | data.getHdop(), |
| | | data.getAltitude(), |
| | | data.getGeoidHeight(), |
| | | data.getDifferentialTime(), |
| | | data.getSource(), |
| | | data.getCompany(), |
| | | data.getSaveTime() |
| | | }; |
| | | paramsList.add(params); |
| | | } |
| | | |
| | | // 使ç¨DBConnectorè¿è¡æ¹éæå
¥ |
| | | String sql = "INSERT INTO " + tableName + " (device_number, device_name, x_coordinate, " + |
| | | "y_coordinate, z_coordinate, layer, battery, utc_times, latitude, longitude, " + |
| | | "positioning_quality, satellite_count, hdop, altitude, geoid_height, " + |
| | | "differential_time, source, company, save_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
| | | |
| | | DBConnector.executeBatchUpdate(sql, paramsList); |
| | | |
| | | } catch (Exception e) { |
| | | System.err.println("æ¹éæå
¥æ°æ®è¡¨å¼å¸¸: " + e.getMessage()); |
| | | // å°éè¯¯çæ°æ®éæ°æ¾åéå |
| | | trackDataQueue.addAll(batchList); |
| | | } |
| | | } |
| | | |
| | | // å
³éæ¹éæå
¥æå¡ |
| | | public static void shutdown() { |
| | | batchInsertExecutor.shutdown(); |
| | | try { |
| | | if (!batchInsertExecutor.awaitTermination(5, TimeUnit.SECONDS)) { |
| | | batchInsertExecutor.shutdownNow(); |
| | | } |
| | | } catch (InterruptedException e) { |
| | | batchInsertExecutor.shutdownNow(); |
| | | Thread.currentThread().interrupt(); |
| | | } |
| | | } |
| | | } |
| | |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | import dell_targets.Dell_SystemConfiguration; |
| | | import databases.DBConnector; // æ·»å 导å
¥ |
| | | |
| | | public class TrackTableManager { |
| | | |
| | | // é
ç½®åæ° |
| | | private static final String JDBC_URL = "jdbc:mysql://localhost:3306/your_database?useSSL=false"; |
| | | private static final String USERNAME = "your_username"; |
| | | private static final String PASSWORD = "your_password"; |
| | | private static final int SAVE_DAYS = 30; // è½¨è¿¹æ°æ®ä¿åå¤©æ° |
| | | // ç§»é¤ç¡¬ç¼ç çæ°æ®åºè¿æ¥åæ° |
| | | private static final int SAVE_DAYS = Dell_SystemConfiguration.TrajectoryRetentionDays; |
| | | private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); |
| | | private static final String TABLE_PREFIX = "tb_track_"; |
| | | |
| | | public static void main(String[] args) { |
| | | |
| | | public static void Start() { |
| | | // åå§åæ¶ç«å³æ§è¡ä¸æ¬¡ |
| | | manageTables(); |
| | | |
| | | manageTables(); |
| | | // åå»ºå®æ¶ä»»å¡ï¼æ¯å¤©åæ¨1ç¹æ§è¡ï¼ |
| | | ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); |
| | | scheduler.scheduleAtFixedRate( |
| | |
| | | |
| | | // 主管çé»è¾ |
| | | private static void manageTables() { |
| | | try (Connection conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD)) { |
| | | // 1. å建æå¤©ç表 |
| | | createTomorrowTable(conn); |
| | | try { |
| | | // 1. åå»ºæªæ¥3天ç表 |
| | | createFutureTables(); |
| | | |
| | | // 2. å é¤è¿æè¡¨ |
| | | deleteExpiredTables(conn); |
| | | deleteExpiredTables(); |
| | | |
| | | } catch (SQLException e) { |
| | | System.err.println("æ°æ®åºæä½å¤±è´¥: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | // å建æå¤©ç表 |
| | | private static void createTomorrowTable(Connection conn) throws SQLException { |
| | | String tomorrow = LocalDate.now().plusDays(1).format(DATE_FORMATTER); |
| | | String tableName = TABLE_PREFIX + tomorrow; |
| | | |
| | | if (!tableExists(conn, tableName)) { |
| | | String createSQL = "CREATE TABLE " + tableName + " (" + |
| | | "id INT(30) PRIMARY KEY AUTO_INCREMENT COMMENT 'åºå·'," + |
| | | "device_number VARCHAR(30) NOT NULL COMMENT '设å¤ç¼å·'," + |
| | | "device_name VARCHAR(30) COMMENT '设å¤åç§°'," + |
| | | "x_coordinate VARCHAR(30) COMMENT 'Xåæ '," + |
| | | "y_coordinate VARCHAR(30) COMMENT 'Yåæ '," + |
| | | "z_coordinate VARCHAR(30) COMMENT 'Zåæ '," + |
| | | "layer VARCHAR(30) COMMENT 'æå¨å±'," + |
| | | "battery VARCHAR(30) COMMENT 'çµé'," + |
| | | "utc_times VARCHAR(30) COMMENT 'UTCæ¶é´'," + |
| | | "latitude VARCHAR(30) COMMENT '纬度'," + |
| | | "longitude VARCHAR(30) COMMENT 'ç»åº¦'," + |
| | | "positioning_quality VARCHAR(30) COMMENT 'å®ä½è´¨é'," + |
| | | "satellite_count VARCHAR(30) COMMENT '嫿æ°é'," + |
| | | "hdop VARCHAR(30) COMMENT '水平精度å å'," + |
| | | "altitude VARCHAR(30) COMMENT 'æµ·æé«åº¦'," + |
| | | "geoid_height VARCHAR(30) COMMENT '大尿°´åé¢é«åº¦'," + |
| | | "differential_time VARCHAR(30) COMMENT '差忶é´'," + |
| | | "source VARCHAR(30) COMMENT 'å®ä½ç»ææ¥æº(0=UWB,1=嫿,3=èç)'," + |
| | | "company VARCHAR(30) COMMENT 'æå±å
¬å¸'," + |
| | | "save_time VARCHAR(30) COMMENT 'ä¿åæ¶é´'" + |
| | | ") ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='轨迹记å½è¡¨'"; |
| | | |
| | | try (Statement stmt = conn.createStatement()) { |
| | | stmt.executeUpdate(createSQL); |
| | | System.out.println("表å建æå: " + tableName); |
| | | } |
| | | } else { |
| | | System.out.println("表已åå¨: " + tableName); |
| | | // åå»ºæªæ¥3天ç表ï¼å
æ¬æå¤©ãå天å大åå¤©ï¼ |
| | | private static void createFutureTables() throws SQLException { |
| | | for (int i = 1; i <= 3; i++) { |
| | | String futureDate = LocalDate.now().plusDays(i).format(DATE_FORMATTER); |
| | | String tableName = TABLE_PREFIX + futureDate; |
| | | if (!tableExists(tableName)) { |
| | | DBConnector.executeUpdate(getcreateSQL(tableName)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // å é¤è¿æè¡¨ |
| | | private static void deleteExpiredTables(Connection conn) throws SQLException { |
| | | private static void deleteExpiredTables() throws SQLException { |
| | | LocalDate thresholdDate = LocalDate.now().minusDays(SAVE_DAYS); |
| | | String threshold = thresholdDate.format(DATE_FORMATTER); |
| | | |
| | | for (String table : getAllTrackTables(conn)) { |
| | | for (String table : getAllTrackTables()) { |
| | | String datePart = table.substring(TABLE_PREFIX.length()); |
| | | if (datePart.compareTo(threshold) < 0) { |
| | | try (Statement stmt = conn.createStatement()) { |
| | | stmt.executeUpdate("DROP TABLE " + table); |
| | | System.out.println("å·²å é¤è¿æè¡¨: " + table); |
| | | } |
| | | DBConnector.executeUpdate("DROP TABLE " + table); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static String getcreateSQL(String tableName) { |
| | | String createSQL = "CREATE TABLE " + tableName + " (" + |
| | | "id INT(30) PRIMARY KEY AUTO_INCREMENT COMMENT 'åºå·'," + |
| | | "device_number VARCHAR(30) NOT NULL COMMENT '设å¤ç¼å·'," + |
| | | "device_name VARCHAR(30) COMMENT '设å¤åç§°'," + |
| | | "x_coordinate VARCHAR(30) COMMENT 'Xåæ '," + |
| | | "y_coordinate VARCHAR(30) COMMENT 'Yåæ '," + |
| | | "z_coordinate VARCHAR(30) COMMENT 'Zåæ '," + |
| | | "layer VARCHAR(30) COMMENT 'æå¨å±'," + |
| | | "battery VARCHAR(30) COMMENT 'çµé'," + |
| | | "utc_times VARCHAR(30) COMMENT 'UTCæ¶é´'," + |
| | | "latitude VARCHAR(30) COMMENT '纬度'," + |
| | | "longitude VARCHAR(30) COMMENT 'ç»åº¦'," + |
| | | "positioning_quality VARCHAR(30) COMMENT 'å®ä½è´¨é'," + |
| | | "satellite_count VARCHAR(30) COMMENT '嫿æ°é'," + |
| | | "hdop VARCHAR(30) COMMENT '水平精度å å'," + |
| | | "altitude VARCHAR(30) COMMENT 'æµ·æé«åº¦'," + |
| | | "geoid_height VARCHAR(30) COMMENT '大尿°´åé¢é«åº¦'," + |
| | | "differential_time VARCHAR(30) COMMENT '差忶é´'," + |
| | | "source VARCHAR(30) COMMENT 'å®ä½ç»ææ¥æº(0=UWB,1=嫿,3=èç)'," + |
| | | "company VARCHAR(30) COMMENT 'æå±å
¬å¸'," + |
| | | "save_time VARCHAR(30) COMMENT 'ä¿åæ¶é´'" + |
| | | ") ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='轨迹记å½è¡¨'"; |
| | | return createSQL; |
| | | } |
| | | |
| | | // æ£æ¥è¡¨æ¯å¦åå¨ |
| | | private static boolean tableExists(Connection conn, String tableName) throws SQLException { |
| | | try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) { |
| | | return rs.next(); |
| | | private static boolean tableExists(String tableName) throws SQLException { |
| | | try (ResultSet rs = DBConnector.executeQuery( |
| | | "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?", |
| | | tableName)) { |
| | | return rs.next() && rs.getInt(1) > 0; |
| | | } |
| | | } |
| | | |
| | | // è·åææè½¨è¿¹è¡¨ |
| | | private static List<String> getAllTrackTables(Connection conn) throws SQLException { |
| | | private static List<String> getAllTrackTables() throws SQLException { |
| | | List<String> tables = new ArrayList<>(); |
| | | try (ResultSet rs = conn.getMetaData().getTables(null, null, TABLE_PREFIX + "%", null)) { |
| | | try (ResultSet rs = DBConnector.executeQuery( |
| | | "SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name LIKE ?", |
| | | TABLE_PREFIX + "%")) { |
| | | while (rs.next()) { |
| | | tables.add(rs.getString("TABLE_NAME")); |
| | | tables.add(rs.getString("table_name")); |
| | | } |
| | | } |
| | | return tables; |
| | |
| | | public String InteractionType; |
| | | public String ipAddress; |
| | | public String ipPort; |
| | | |
| | | public String gnGgaDataTime;//æ¥æ¶å°gnggaæ°æ®æ¶é´ |
| | | public String satelliteChipType;//嫿è¯çç±»å |
| | | public String AutoUpgraded;//宿äºèªå¨å级 |
| | | public String isSatelliteDevice;//æ¯å¦æ¯å«æå®ä½è®¾å¤,-1ä¸ç¥é1æ¯0䏿¯ |
| | | public String RTKsource;//å·®åæº |
| | | // GetteråSetteræ¹æ³ |
| | | public int getId() { |
| | | return id; |
| | |
| | | public void setIpPort(String ipPort) { |
| | | this.ipPort = ipPort; |
| | | } |
| | | |
| | | public String getGnGgaDataTime() { |
| | | return gnGgaDataTime; |
| | | } |
| | | |
| | | public String getSatelliteChipType() { |
| | | return satelliteChipType; |
| | | } |
| | | |
| | | public void setGnGgaDataTime(String gnGgaDataTime) { |
| | | this.gnGgaDataTime = gnGgaDataTime; |
| | | } |
| | | |
| | | public void setSatelliteChipType(String satelliteChipType) { |
| | | this.satelliteChipType = satelliteChipType; |
| | | } |
| | | |
| | | public String getAutoUpgraded() { |
| | | return AutoUpgraded; |
| | | } |
| | | |
| | | public void setAutoUpgraded(String autoUpgraded) { |
| | | AutoUpgraded = autoUpgraded; |
| | | } |
| | | |
| | | public String getIsSatelliteDevice() { |
| | | return isSatelliteDevice; |
| | | } |
| | | |
| | | public void setIsSatelliteDevice(String isSatelliteDevice) { |
| | | this.isSatelliteDevice = isSatelliteDevice; |
| | | } |
| | | |
| | | public String getRTKsource() { |
| | | return RTKsource; |
| | | } |
| | | |
| | | public void setRTKsource(String rTKsource) { |
| | | RTKsource = rTKsource; |
| | | } |
| | | } |
ÎļþÃû´Ó src/publicsWay/UDPPortAReceiver.java ÐÞ¸Ä |
| | |
| | | package publicsWay; |
| | | package udptcp; |
| | | import java.net.DatagramPacket; |
| | | import java.net.DatagramSocket; |
| | | import java.net.InetAddress; |
| | |
| | | |
| | | import dell_system.MessageViewPanel; |
| | | import dell_targets.Dell_SystemConfiguration; |
| | | import publicsWay.PacketProcessingSystem; |
| | | |
| | | public class UDPPortAReceiver { |
| | | public static final int PORT =Dell_SystemConfiguration.hexport; |
| | |
| | | import java.net.DatagramPacket; |
| | | import java.net.DatagramSocket; |
| | | import java.net.InetAddress; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.concurrent.ExecutorService; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.atomic.AtomicLong; |
| | | |
| | | import publicsWay.PacketProcessingSystem; |
| | | import dell_system.MessageViewPanel; |
| | | import dell_targets.Dell_SystemConfiguration; |
| | | import publicsWay.PacketProcessingSystemB; |
| | | |
| | | public class UDPPortBReceiver { |
| | | public static final int PORT = 7000; |
| | | @SuppressWarnings("unused") |
| | | public static final int PORT =Dell_SystemConfiguration.ascallport; |
| | | @SuppressWarnings("unused") |
| | | private static final int MAX_DEVICES = 50000; |
| | | private static final AtomicLong packetCount = new AtomicLong(0); |
| | | private static final ExecutorService executor = Executors.newFixedThreadPool(10); |
| | | private static DatagramSocket socket; |
| | | private static volatile boolean isRunning = false; |
| | | private static Thread receiverThread; |
| | | @SuppressWarnings("unused") |
| | | private static final AtomicLong packetCount = new AtomicLong(0); |
| | | private static final ExecutorService executor = Executors.newFixedThreadPool(10); |
| | | private static DatagramSocket socket; |
| | | private static volatile boolean isRunning = false; |
| | | private static Thread receiverThread; |
| | | @SuppressWarnings("unused") |
| | | private static final int LOCAL_PORT = PORT; // å®ä¹æ¬å°ç«¯å£ |
| | | // å¯å¨æ¥æ¶å¨çéææ¹æ³ |
| | | public static void startReceiver() { |
| | | if (isRunning) return; |
| | | |
| | | isRunning = true; |
| | | receiverThread = new Thread(() -> { |
| | | try { |
| | | socket = new DatagramSocket(PORT); |
| | | byte[] buffer = new byte[2048]; |
| | | |
| | | while (isRunning) { |
| | | DatagramPacket packet = new DatagramPacket(buffer, buffer.length); |
| | | socket.receive(packet); |
| | | |
| | | executor.execute(() -> { |
| | | try { |
| | | String ip = packet.getAddress().getHostAddress(); |
| | | int port = packet.getPort(); |
| | | String hexData = bytesToHex(packet.getData(), packet.getLength()); |
| | | // è°ç¨æ¶æ·»å æ¬å°ç«¯å£åæ° |
| | | PacketProcessingSystem.storePacket(ip, port, hexData); |
| | | |
| | | } catch (Exception e) { |
| | | System.err.println("Error processing UDP-A packet: " + e.getMessage()); |
| | | } |
| | | }); |
| | | } |
| | | } catch (Exception e) { |
| | | System.err.println("UDP-A Server crashed: " + e.getMessage()); |
| | | } finally { |
| | | if (socket != null && !socket.isClosed()) { |
| | | socket.close(); |
| | | } |
| | | } |
| | | }); |
| | | receiverThread.setDaemon(true); |
| | | receiverThread.start(); |
| | | } |
| | | |
| | | // åæ¢æ¥æ¶å¨ |
| | | public static void stopReceiver() { |
| | | isRunning = false; |
| | | if (socket != null && !socket.isClosed()) { |
| | | socket.close(); |
| | | } |
| | | executor.shutdown(); |
| | | } |
| | | |
| | | // åéæ°æ®å°æå®è®¾å¤ |
| | | public static void sendData(String ip, int port, String data, boolean isHex) { |
| | | try { |
| | | byte[] sendBytes; |
| | | if (isHex) { |
| | | // HEXæ ¼å¼åéï¼å°åå
è¿å¶å符串转æ¢ä¸ºåèæ°ç» |
| | | sendBytes = hexStringToByteArray(data); |
| | | } else { |
| | | // ASCIIæ ¼å¼åéï¼ç´æ¥è·ååèæ°ç» |
| | | sendBytes = data.getBytes(); |
| | | } |
| | | |
| | | InetAddress address = InetAddress.getByName(ip); |
| | | DatagramPacket packet = new DatagramPacket(sendBytes, sendBytes.length, address, port); |
| | | socket.send(packet); |
| | | } catch (Exception e) { |
| | | System.err.println("Error sending UDP data: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | private static String bytesToHex(byte[] bytes, int length) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (int i = 0; i < length; i++) { |
| | | sb.append(String.format("%02X", bytes[i])); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | private static byte[] hexStringToByteArray(String hex) { |
| | | hex = hex.replaceAll("\\s", ""); // ç§»é¤ææç©ºæ ¼ |
| | | int len = hex.length(); |
| | | byte[] data = new byte[len / 2]; |
| | | for (int i = 0; i < len; i += 2) { |
| | | // å¤çæ¯ä¸¤ä¸ªå符ä½ä¸ºä¸ä¸ªåè |
| | | data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) |
| | | + Character.digit(hex.charAt(i+1), 16)); |
| | | } |
| | | return data; |
| | | } |
| | | // å¯å¨æ¥æ¶å¨çéææ¹æ³ |
| | | public static void startReceiver() { |
| | | if (isRunning) return; |
| | | |
| | | public static long getPacketCount() { |
| | | return packetCount.get(); |
| | | } |
| | | isRunning = true; |
| | | receiverThread = new Thread(() -> { |
| | | try { |
| | | socket = new DatagramSocket(PORT); |
| | | byte[] buffer = new byte[2048]; |
| | | |
| | | while (isRunning) { |
| | | DatagramPacket packet = new DatagramPacket(buffer, buffer.length); |
| | | socket.receive(packet); |
| | | executor.execute(() -> { |
| | | try { |
| | | String ip = packet.getAddress().getHostAddress(); |
| | | int port = packet.getPort(); |
| | | //String hexData = bytesToHex(packet.getData(), packet.getLength()); |
| | | String asciiData = new String(packet.getData(), 0, packet.getLength(), StandardCharsets.US_ASCII); |
| | | // 廿åè½¦åæ¢è¡ |
| | | asciiData = asciiData.replaceAll("\r", "").replaceAll("\n", ""); |
| | | // è°ç¨æ¶æ·»å æ¬å°ç«¯å£åæ° |
| | | PacketProcessingSystemB.storePacket(ip, port, asciiData); |
| | | // æ¥ææ¥ççªå£æ¾ç¤ºæ°æ® |
| | | MessageViewPanel.showData(asciiData, ip, port, PORT,"UDPB","ALL","ALL"); |
| | | packetCount.incrementAndGet(); // å
³é®ä¿®å¤ï¼å¢å 计æ°å¨ |
| | | |
| | | } catch (Exception e) { |
| | | System.err.println("Error processing UDP-B packet: " + e.getMessage()); |
| | | } |
| | | }); |
| | | } |
| | | } catch (Exception e) { |
| | | System.err.println("UDP-B Server crashed: " + e.getMessage()); |
| | | } finally { |
| | | if (socket != null && !socket.isClosed()) { |
| | | socket.close(); |
| | | } |
| | | } |
| | | }); |
| | | receiverThread.setDaemon(true); |
| | | receiverThread.start(); |
| | | } |
| | | |
| | | // åæ¢æ¥æ¶å¨ |
| | | public static void stopReceiver() { |
| | | isRunning = false; |
| | | if (socket != null && !socket.isClosed()) { |
| | | socket.close(); |
| | | } |
| | | executor.shutdown(); |
| | | } |
| | | |
| | | // åéæ°æ®å°æå®è®¾å¤ |
| | | public static void sendData(String ip, int port, String data, boolean isHex) { |
| | | try { |
| | | byte[] sendBytes; |
| | | if (isHex) { |
| | | // HEXæ ¼å¼åéï¼å°åå
è¿å¶å符串转æ¢ä¸ºåèæ°ç» |
| | | sendBytes = hexStringToByteArray(data); |
| | | } else { |
| | | // ASCIIæ ¼å¼åéï¼ç´æ¥è·ååèæ°ç» |
| | | sendBytes = data.getBytes(); |
| | | } |
| | | |
| | | InetAddress address = InetAddress.getByName(ip); |
| | | DatagramPacket packet = new DatagramPacket(sendBytes, sendBytes.length, address, port); |
| | | socket.send(packet); |
| | | } catch (Exception e) { |
| | | System.err.println("Error sending UDP data: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | private static byte[] hexStringToByteArray(String hex) { |
| | | hex = hex.replaceAll("\\s", ""); // ç§»é¤ææç©ºæ ¼ |
| | | int len = hex.length(); |
| | | byte[] data = new byte[len / 2]; |
| | | for (int i = 0; i < len; i += 2) { |
| | | // å¤çæ¯ä¸¤ä¸ªå符ä½ä¸ºä¸ä¸ªåè |
| | | data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) |
| | | + Character.digit(hex.charAt(i+1), 16)); |
| | | } |
| | | return data; |
| | | } |
| | | |
| | | public static long getPacketCount() { |
| | | return packetCount.get(); |
| | | } |
| | | } |
| | |
| | | import dell_system.VersionInfoPanel; |
| | | import dell_targets.BatteryRecordPanel; |
| | | import dell_targets.DifferentialBaseStationManagementPanel; |
| | | import dell_targets.SatelliteDevicePanel; |
| | | import dell_targets.TagManagementPanel; |
| | | import dell_targets.TagTypeManagementPanel; |
| | | import javax.swing.*; |
| | |
| | | panel.add(new QuickCalculationPanel(messages), BorderLayout.CENTER); |
| | | } else if (nodeName.equals(messages.getString("Serial_Port_Tool"))) {// 串å£å·¥å
· |
| | | panel.add(new SerialCommPanel(messages), BorderLayout.CENTER); |
| | | }else if (nodeName.equals(messages.getString("SatelliteEquipment"))) {//å«æè®¾å¤ |
| | | panel.add(new SatelliteDevicePanel(messages), BorderLayout.CENTER); |
| | | } else { |
| | | // å¯¹äºæªå®ç°åè½ï¼æ¾ç¤ºå¼åä¸æç¤º |
| | | JLabel label = new JLabel(messages.getString("DEVELOPING") + ": " + nodeName, SwingConstants.CENTER); |
| | |
| | | deviceNode.add(new DefaultMutableTreeNode(messages.getString("BASE_MANAGEMENT"))); // åºç«ç®¡ç |
| | | deviceNode.add(new DefaultMutableTreeNode(messages.getString("GATEWAY_MANAGEMENT"))); // ç½å
³ç®¡ç |
| | | deviceNode.add(new DefaultMutableTreeNode(messages.getString("DIFF_BASE"))); // å·®ååºç« |
| | | deviceNode.add(new DefaultMutableTreeNode(messages.getString("TAG_TYPE"))); // æ ç¾ç±»å |
| | | deviceNode.add(new DefaultMutableTreeNode(messages.getString("TAG_TYPE"))); |
| | | deviceNode.add(new DefaultMutableTreeNode(messages.getString("SatelliteEquipment"))); // å«æè®¾å¤ |
| | | root.add(deviceNode); |
| | | |
| | | // ç®æ³èç¹ (ä¸çº§) |
| | |
| | | |
| | | import java.util.ResourceBundle; |
| | | |
| | | import udptcp.UDPPortAReceiver; |
| | | import udptcp.UDPPortBReceiver; |
| | | import dell_targets.Dell_BaseStation; |
| | | import dell_targets.Dell_tag; |
| | | import publicsWay.UDPPortAReceiver; |
| | | import dell_targets.Dell_SystemConfiguration; |
| | | |
| | | public class WelcomeFrame extends JInternalFrame { |
| | |
| | | RtkSource=RtkSource |
| | | UPGRADE_DEVICE_ELLIPSIS=... |
| | | UPGRADE_DEVICE_UNIT=device(s) |
| | | UPGRADE_CONFIRMATION_HEADER=Preparing to upgrade the following devices: |
| | | FIRMWARE_URL_LABEL=Firmware URL |
| | | TOTAL_DEVICES_COUNT=Total devices: %d |
| | | UPGRADE_DEVICES_WITH_URL=Preparing to upgrade %d devices, device IDs: %s, firmware address: %s |
| | | SET_UPGRADE_CONDITIONS=SetUpgradeConditions |
| | | BY_COMPANY_NAME=ByCompanyName |
| | | COMPANY = Company |
| | | COMMAND_SEND = Command Send |
| | | FIRMWARE_URL = Firmware URL |
| | | ENTER_FIRMWARE_DOWNLOAD_URL = Enter the firmware download URL |
| | | FIRMWARE_URL_REQUIRED = Firmware download URL is required |
| | | UPGRADE_DEVICES_WITH_URL = Upgrading %d devices with firmware URL: %s |
| | | SEND_COMMAND = Send Command |
| | | SatelliteEquipment=SatelliteEquipment |
| | | QUICK_OPERATION=Quick Operation |
| | | SELECT=Select |
| | | INDEX=Index |
| | | DEVICE_NUMBER=Device Number |
| | | LONGITUDE=Longitude |
| | | LATITUDE=Latitude |
| | | ALTITUDE=Altitude |
| | | STATUS=Status |
| | | SATELLITE_COUNT=Satellite Count |
| | | DIFFERENTIAL_TIME=Differential Time |
| | | VERSION=Version |
| | | CARD_NUMBER=Card Number |
| | | ADDRESS=Address |
| | | PORT=Port |
| | | UPDATE_TIME=Update Time |
| | | UPGRADE_CONDITION=Upgrade Condition |
| | | BY_VERSION=By Version |
| | | BY_NUMBER=By Number |
| | | BY_SELECTED_DEVICE=By Selected Device |
| | | START_UPGRADE=Start Upgrade |
| | | UPGRADE_VALUE_REQUIRED=Upgrade value is required |
| | | SELECT_DEVICE_TO_UPGRADE=Select device to upgrade |
| | | UPGRADE_SELECTED_DEVICES=Start upgrading the selected %d devices |
| | | UPGRADE_BY_VERSION=Start upgrading devices with version %s |
| | | UPGRADE_BY_NUMBER=Start upgrading device with number %s |
| | | TAG_STATS = Tag Statistics |
| | | BASE_STATION_STATS = Base Station Statistics |
| | | SOFTWARE_VERSION = Software Version |
| | |
| | | # å«æè®¾å¤ç®¡çç¸å
³èµæº |
| | | RtkSource=å·®åæº |
| | | UPGRADE_DEVICE_ELLIPSIS=... (å
± |
| | | UPGRADE_DEVICE_UNIT=个设å¤) |
| | | UPGRADE_CONFIRMATION_HEADER=åå¤å级以ä¸è®¾å¤:\n |
| | | FIRMWARE_URL_LABEL=åºä»¶å°å |
| | | TOTAL_DEVICES_COUNT=æ»å
± %d ä¸ªè®¾å¤ |
| | | UPGRADE_DEVICES_WITH_URL=åå¤å级 %d 个设å¤ï¼è®¾å¤ç¼å·ï¼%sï¼åºä»¶å°åï¼%s |
| | | SET_UPGRADE_CONDITIONS=设置å级æ¡ä»¶ |
| | | BY_COMPANY_NAME=æ ¹æ®å
¬å¸åç§° |
| | | COMPANY=æå±å
¬å¸ |
| | | COMMAND_SEND=æä»¤åé |
| | | FIRMWARE_URL=åºä»¶å°å |
| | | ENTER_FIRMWARE_DOWNLOAD_URL=å½å
¥éè¦å级åºä»¶ä¸è½½å°å |
| | | FIRMWARE_URL_REQUIRED=请è¾å
¥åºä»¶ä¸è½½å°å |
| | | UPGRADE_DEVICES_WITH_URL=å°ä¸º%dä¸ªè®¾å¤æ§è¡å级ï¼åºä»¶å°åï¼%s |
| | | SEND_COMMAND=åéæä»¤ |
| | | SatelliteEquipment=å«æè®¾å¤ |
| | | QUICK_OPERATION=å¿«æ·æä½ |
| | | SELECT=éæ© |
| | | INDEX=åºå· |
| | | DEVICE_NUMBER=ç¼å· |
| | | LONGITUDE=ç»åº¦ |
| | | LATITUDE=纬度 |
| | | ALTITUDE=é«ç¨ |
| | | STATUS=ç¶æ |
| | | SATELLITE_COUNT=å«ææ° |
| | | DIFFERENTIAL_TIME=å·®åæ¶é´ |
| | | VERSION=çæ¬ |
| | | CARD_NUMBER=å¡å· |
| | | ADDRESS=å°å |
| | | PORT=ç«¯å£ |
| | | UPDATE_TIME=æ´æ°æ¶é´ |
| | | UPGRADE_CONDITION=å级æ¡ä»¶ |
| | | BY_VERSION=æ ¹æ®çæ¬ |
| | | BY_NUMBER=æ ¹æ®ç¼å· |
| | | BY_SELECTED_DEVICE=æ ¹æ®éä¸çè®¾å¤ |
| | | START_UPGRADE=å¯å¨å级 |
| | | UPGRADE_VALUE_REQUIRED=请è¾å
¥å级æ¡ä»¶å¼ |
| | | SELECT_DEVICE_TO_UPGRADE=è¯·éæ©è¦å级çè®¾å¤ |
| | | UPGRADE_SELECTED_DEVICES=å¼å§å级éä¸ç %d ä¸ªè®¾å¤ |
| | | UPGRADE_BY_VERSION=å¼å§åçº§çæ¬ä¸º %s çè®¾å¤ |
| | | UPGRADE_BY_NUMBER=å¼å§å级设å¤ç¼å·ä¸º %s çè®¾å¤ |
| | | TAG_STATS=æ ç¾ç»è®¡ |
| | | BASE_STATION_STATS=åºç«ç»è®¡ |
| | | SOFTWARE_VERSION=è½¯ä»¶çæ¬ |
| | |
| | | 工使¶é¿: 0å°æ¶ 0åé 25ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-11 23:04:55 |
| | | ç¨åºå
³é: 2025-08-11 23:15:52 |
| | | 工使¶é¿: 0å°æ¶ 10åé 57ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 21:50:17 |
| | | ç¨åºå
³é: 2025-08-12 21:52:16 |
| | | 工使¶é¿: 0å°æ¶ 1åé 58ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 21:52:33 |
| | | ç¨åºå
³é: 2025-08-12 21:52:57 |
| | | 工使¶é¿: 0å°æ¶ 0åé 24ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 21:52:59 |
| | | ç¨åºå
³é: 2025-08-12 21:57:54 |
| | | 工使¶é¿: 0å°æ¶ 4åé 54ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 21:57:56 |
| | | ç¨åºå
³é: 2025-08-12 21:58:34 |
| | | 工使¶é¿: 0å°æ¶ 0åé 38ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 21:58:40 |
| | | ç¨åºå¯å¨: 2025-08-12 22:01:53 |
| | | ç¨åºå¯å¨: 2025-08-12 22:03:37 |
| | | ç¨åºå¯å¨: 2025-08-12 22:06:02 |
| | | ç¨åºå¯å¨: 2025-08-12 22:12:48 |
| | | ç¨åºå
³é: 2025-08-12 22:15:41 |
| | | 工使¶é¿: 0å°æ¶ 2åé 52ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 22:19:13 |
| | | ç¨åºå¯å¨: 2025-08-12 23:13:17 |
| | | ç¨åºå
³é: 2025-08-12 23:13:21 |
| | | 工使¶é¿: 0å°æ¶ 54åé 8ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 23:13:23 |
| | | ç¨åºå
³é: 2025-08-12 23:16:01 |
| | | 工使¶é¿: 0å°æ¶ 2åé 37ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-12 23:16:02 |
| | | ç¨åºå
³é: 2025-08-12 23:16:28 |
| | | 工使¶é¿: 0å°æ¶ 0åé 25ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-15 23:09:00 |
| | | ç¨åºå
³é: 2025-08-15 23:17:24 |
| | | 工使¶é¿: 0å°æ¶ 8åé 24ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-21 21:25:25 |
| | | ç¨åºå
³é: 2025-08-21 21:28:51 |
| | | 工使¶é¿: 0å°æ¶ 3åé 25ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 15:41:33 |
| | | ç¨åºå
³é: 2025-08-23 15:43:01 |
| | | 工使¶é¿: 0å°æ¶ 1åé 28ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 15:45:38 |
| | | ç¨åºå
³é: 2025-08-23 15:46:00 |
| | | 工使¶é¿: 0å°æ¶ 0åé 21ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 15:47:59 |
| | | ç¨åºå
³é: 2025-08-23 15:48:09 |
| | | 工使¶é¿: 0å°æ¶ 0åé 9ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 16:18:45 |
| | | ç¨åºå
³é: 2025-08-23 16:19:17 |
| | | 工使¶é¿: 0å°æ¶ 0åé 32ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 16:22:53 |
| | | ç¨åºå¯å¨: 2025-08-23 16:25:27 |
| | | ç¨åºå
³é: 2025-08-23 16:31:00 |
| | | 工使¶é¿: 0å°æ¶ 5åé 32ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 16:31:02 |
| | | ç¨åºå
³é: 2025-08-23 16:31:31 |
| | | 工使¶é¿: 0å°æ¶ 0åé 28ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 16:32:43 |
| | | ç¨åºå
³é: 2025-08-23 16:34:04 |
| | | 工使¶é¿: 0å°æ¶ 1åé 21ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 16:35:29 |
| | | ç¨åºå¯å¨: 2025-08-23 16:37:39 |
| | | ç¨åºå¯å¨: 2025-08-23 16:43:57 |
| | | ç¨åºå
³é: 2025-08-23 16:45:05 |
| | | 工使¶é¿: 0å°æ¶ 1åé 8ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 17:01:49 |
| | | ç¨åºå
³é: 2025-08-23 21:13:53 |
| | | 工使¶é¿: 4å°æ¶ 12åé 4ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 21:13:57 |
| | | ç¨åºå
³é: 2025-08-23 21:14:07 |
| | | 工使¶é¿: 0å°æ¶ 0åé 9ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 21:15:06 |
| | | ç¨åºå
³é: 2025-08-23 21:55:14 |
| | | 工使¶é¿: 0å°æ¶ 40åé 7ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 21:55:16 |
| | | ç¨åºå
³é: 2025-08-23 21:59:33 |
| | | 工使¶é¿: 0å°æ¶ 4åé 17ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 21:59:35 |
| | | ç¨åºå
³é: 2025-08-23 22:01:21 |
| | | 工使¶é¿: 0å°æ¶ 1åé 46ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:01:23 |
| | | ç¨åºå
³é: 2025-08-23 22:04:10 |
| | | 工使¶é¿: 0å°æ¶ 2åé 46ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:04:12 |
| | | ç¨åºå
³é: 2025-08-23 22:05:25 |
| | | 工使¶é¿: 0å°æ¶ 1åé 13ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:05:27 |
| | | ç¨åºå
³é: 2025-08-23 22:05:48 |
| | | 工使¶é¿: 0å°æ¶ 0åé 21ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:06:20 |
| | | ç¨åºå
³é: 2025-08-23 22:06:34 |
| | | 工使¶é¿: 0å°æ¶ 0åé 14ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:07:49 |
| | | ç¨åºå
³é: 2025-08-23 22:08:14 |
| | | 工使¶é¿: 0å°æ¶ 0åé 24ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:08:34 |
| | | ç¨åºå
³é: 2025-08-23 22:10:39 |
| | | 工使¶é¿: 0å°æ¶ 2åé 5ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:11:06 |
| | | ç¨åºå
³é: 2025-08-23 22:38:24 |
| | | 工使¶é¿: 0å°æ¶ 27åé 17ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:38:27 |
| | | ç¨åºå
³é: 2025-08-23 22:38:52 |
| | | 工使¶é¿: 0å°æ¶ 0åé 25ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:38:57 |
| | | ç¨åºå¯å¨: 2025-08-23 22:42:02 |
| | | ç¨åºå
³é: 2025-08-23 22:46:21 |
| | | 工使¶é¿: 0å°æ¶ 4åé 19ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:46:24 |
| | | ç¨åºå
³é: 2025-08-23 22:47:27 |
| | | 工使¶é¿: 0å°æ¶ 1åé 3ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 22:47:30 |
| | | ç¨åºå¯å¨: 2025-08-23 22:59:41 |
| | | ç¨åºå
³é: 2025-08-23 23:00:29 |
| | | 工使¶é¿: 0å°æ¶ 0åé 47ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-23 23:05:46 |
| | | ç¨åºå
³é: 2025-08-23 23:09:25 |
| | | 工使¶é¿: 0å°æ¶ 3åé 39ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 09:46:48 |
| | | ç¨åºå
³é: 2025-08-24 10:31:07 |
| | | 工使¶é¿: 0å°æ¶ 44åé 19ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 10:31:09 |
| | | ç¨åºå
³é: 2025-08-24 10:31:14 |
| | | 工使¶é¿: 0å°æ¶ 0åé 5ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 10:34:14 |
| | | ç¨åºå¯å¨: 2025-08-24 10:43:12 |
| | | ç¨åºå
³é: 2025-08-24 10:44:57 |
| | | 工使¶é¿: 0å°æ¶ 1åé 45ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 10:52:51 |
| | | ç¨åºå
³é: 2025-08-24 10:53:14 |
| | | 工使¶é¿: 0å°æ¶ 0åé 22ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 10:54:37 |
| | | ç¨åºå
³é: 2025-08-24 10:59:41 |
| | | 工使¶é¿: 0å°æ¶ 5åé 3ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 10:59:43 |
| | | ç¨åºå
³é: 2025-08-24 11:04:30 |
| | | 工使¶é¿: 0å°æ¶ 4åé 47ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 11:04:56 |
| | | ç¨åºå
³é: 2025-08-24 11:05:08 |
| | | 工使¶é¿: 0å°æ¶ 0åé 12ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 11:06:34 |
| | | ç¨åºå
³é: 2025-08-24 11:10:47 |
| | | 工使¶é¿: 0å°æ¶ 4åé 12ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 11:10:50 |
| | | ç¨åºå
³é: 2025-08-24 11:13:07 |
| | | 工使¶é¿: 0å°æ¶ 2åé 16ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 11:13:09 |
| | | ç¨åºå
³é: 2025-08-24 11:23:21 |
| | | 工使¶é¿: 0å°æ¶ 10åé 12ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 11:23:23 |
| | | ç¨åºå
³é: 2025-08-24 12:35:19 |
| | | 工使¶é¿: 1å°æ¶ 11åé 55ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 12:35:22 |
| | | ç¨åºå
³é: 2025-08-24 12:41:38 |
| | | 工使¶é¿: 0å°æ¶ 6åé 15ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 12:41:41 |
| | | ç¨åºå
³é: 2025-08-24 12:55:40 |
| | | 工使¶é¿: 0å°æ¶ 13åé 59ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 12:55:42 |
| | | ç¨åºå
³é: 2025-08-24 12:56:25 |
| | | 工使¶é¿: 0å°æ¶ 0åé 42ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 12:57:15 |
| | | ç¨åºå
³é: 2025-08-24 12:57:47 |
| | | 工使¶é¿: 0å°æ¶ 0åé 31ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:03:07 |
| | | ç¨åºå
³é: 2025-08-24 13:07:28 |
| | | 工使¶é¿: 0å°æ¶ 4åé 20ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:07:30 |
| | | ç¨åºå
³é: 2025-08-24 13:07:48 |
| | | 工使¶é¿: 0å°æ¶ 0åé 17ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:09:13 |
| | | ç¨åºå
³é: 2025-08-24 13:09:55 |
| | | 工使¶é¿: 0å°æ¶ 0åé 41ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:12:54 |
| | | ç¨åºå¯å¨: 2025-08-24 13:18:23 |
| | | ç¨åºå
³é: 2025-08-24 13:18:27 |
| | | 工使¶é¿: 0å°æ¶ 5åé 32ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:18:29 |
| | | ç¨åºå
³é: 2025-08-24 13:19:01 |
| | | 工使¶é¿: 0å°æ¶ 0åé 31ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:20:34 |
| | | ç¨åºå
³é: 2025-08-24 13:25:22 |
| | | 工使¶é¿: 0å°æ¶ 4åé 47ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:25:23 |
| | | ç¨åºå
³é: 2025-08-24 13:26:33 |
| | | 工使¶é¿: 0å°æ¶ 1åé 10ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:26:36 |
| | | ç¨åºå
³é: 2025-08-24 13:27:25 |
| | | 工使¶é¿: 0å°æ¶ 0åé 49ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:40:36 |
| | | ç¨åºå
³é: 2025-08-24 13:41:12 |
| | | 工使¶é¿: 0å°æ¶ 0åé 35ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:41:35 |
| | | ç¨åºå
³é: 2025-08-24 13:42:05 |
| | | 工使¶é¿: 0å°æ¶ 0åé 29ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:43:24 |
| | | ç¨åºå¯å¨: 2025-08-24 13:48:00 |
| | | ç¨åºå
³é: 2025-08-24 13:48:04 |
| | | 工使¶é¿: 0å°æ¶ 4åé 40ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:48:06 |
| | | ç¨åºå
³é: 2025-08-24 13:48:30 |
| | | 工使¶é¿: 0å°æ¶ 0åé 24ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 13:48:46 |
| | | ç¨åºå
³é: 2025-08-24 13:53:20 |
| | | 工使¶é¿: 0å°æ¶ 4åé 33ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 14:28:32 |
| | | ç¨åºå
³é: 2025-08-24 14:31:07 |
| | | 工使¶é¿: 0å°æ¶ 2åé 34ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 14:31:40 |
| | | ç¨åºå
³é: 2025-08-24 14:40:24 |
| | | 工使¶é¿: 0å°æ¶ 8åé 44ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 14:40:26 |
| | | ç¨åºå¯å¨: 2025-08-24 14:51:47 |
| | | ç¨åºå
³é: 2025-08-24 14:51:51 |
| | | 工使¶é¿: 0å°æ¶ 11åé 25ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 14:51:53 |
| | | ç¨åºå
³é: 2025-08-24 16:44:14 |
| | | 工使¶é¿: 1å°æ¶ 52åé 20ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 16:44:16 |
| | | ç¨åºå
³é: 2025-08-24 16:56:04 |
| | | 工使¶é¿: 0å°æ¶ 11åé 48ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 16:56:06 |
| | | ç¨åºå
³é: 2025-08-24 17:01:59 |
| | | 工使¶é¿: 0å°æ¶ 5åé 52ç§ |
| | | ----------------------------------- |
| | | ç¨åºå¯å¨: 2025-08-24 17:02:01 |