826220679@qq.com
2025-08-09 ccb681ec3a4ef38da878ac3a01c498853e9be4ca
修改
已删除4个文件
已添加5个文件
已修改14个文件
1393 ■■■■■ 文件已修改
src/chushihua/Chushihua.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell55AAData/Dell55AA02Parser.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_anchor/BaseStationAdjacentConfigPanel.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_anchor/BaseStationManagementPanel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_anchor/BaseStationSyncConfigPanel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_anchor/Dell_BaseStation.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_system/MessageViewPanel.java 185 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_targets/Dell_BaseStation.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/dell_targets/Dell_SystemConfiguration.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/publicsWay/Languages.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/publicsWay/UwbDataParser.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/targets/LocationBaseStation.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/DellHexBaowen.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/HexBaowen.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/PacketParser.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/PacketProcessingSystem.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/TCPDiffDataReceiver.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/UDPPortAReceiver.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/udptcp/UDPPortBReceiver.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/window/Windows.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
systemfile/Messages_en.properties 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
systemfile/Messages_zh.properties 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
systemfile/logfile/openlog.txt 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/chushihua/Chushihua.java
@@ -1,11 +1,11 @@
package chushihua;
import java.sql.SQLException;
import dell_Fence.Dell_Fence;
import dell_anchor.Dell_BaseStation;
import dell_map.Dell_Map;
import dell_suanfa.Dell_GroupManagement;
import dell_suanfa.Dell_LayerManagement;
import dell_system.Dell_company;
import dell_targets.Dell_BaseStation;
import dell_targets.Dell_SystemConfiguration;
import dell_targets.Dell_tag;
import udptcp.UDPPortAReceiver;
@@ -13,6 +13,7 @@
public class Chushihua {
    public static void getchushihua()  {
        try {
            Dell_SystemConfiguration.getSystemConfigurations();
            Dell_tag.getlocationTags();
            Dell_BaseStation.getBaseStations();
            UDPPortAReceiver.startReceiver();
@@ -21,7 +22,6 @@
            Dell_company.getAllCompanies();
            Dell_LayerManagement.getAllLayers();
            Dell_GroupManagement.getAllGroups();
            Dell_SystemConfiguration.getSystemConfigurations();
            if(Dell_SystemConfiguration.gnsstoxyOpen) {Dell_Map.get_foor_xycs();}            
        } catch (SQLException e) {
            // TODO è‡ªåŠ¨ç”Ÿæˆçš„ catch å—
src/dell55AAData/Dell55AA02Parser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package dell55AAData;
import dell_targets.Dell_BaseStation;
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字节)
    /**
     * è§£æž55AA02格式的基站数据
     * @param message æŽ¥æ”¶åˆ°çš„æ•°æ®ï¼ˆåå…­è¿›åˆ¶å­—符串)
     */
    public static void parseAndUpdate(String message) {
        // 1. åŸºç¡€æ ¡éªŒ
        if (message == null || message.length() < MIN_LENGTH) {
            return;
        }
        // 2. å¤´éƒ¨æ ¡éªŒï¼ˆå›ºå®šå¼€å¤´å­—符串)
        for (int i = 0; i < EXPECTED_HEADER.length(); i++) {
            if (message.charAt(i) != EXPECTED_HEADER.charAt(i)) {
                return;
            }
        }
        // 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)
        });
        // 4. è§£æžåŒæ­¥çŠ¶æ€ï¼ˆ1字节)
        char syncChar = message.charAt(SYNC_STATUS_START + 1); // å–状态字符
        String syncStatus = (syncChar == '0') ? "0" : "1";
        // 5. è§£æžæ°”压值(4字节小端序)
        int pressure = 0;
        for (int i = 0; i < 8; i += 2) {
            int idx = PRESSURE_START + i;
            // ä½¿ç”¨HexUtils的快速转换方法
            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) {
        Dell_BaseStation.updateBaseStationProperty(baseId, "syncStatus", syncStatus);
        Dell_BaseStation.updateBaseStationProperty(baseId, "barometerReading", pressure);
    }
}
src/dell_anchor/BaseStationAdjacentConfigPanel.java
@@ -1,6 +1,7 @@
package dell_anchor;
import databases.DBConnector;
import dell_targets.Dell_BaseStation;
import targets.LocationBaseStation;
import javax.swing.*;
src/dell_anchor/BaseStationManagementPanel.java
@@ -1,6 +1,8 @@
package dell_anchor;
import databases.DBConnector;
import dell_targets.Dell_BaseStation;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;
src/dell_anchor/BaseStationSyncConfigPanel.java
@@ -1,5 +1,7 @@
package dell_anchor;
import databases.DBConnector;
import dell_targets.Dell_BaseStation;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;
src/dell_anchor/Dell_BaseStation.java
ÎļþÒÑɾ³ý
src/dell_system/MessageViewPanel.java
@@ -7,13 +7,11 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import dell_targets.Dell_MessageType;
import dell_targets.Dell_tag;
import publicsWay.Languages;
import udptcp.UDPPortAReceiver;
import udptcp.UDPPortBReceiver;
@@ -28,7 +26,7 @@
    // UI组件声明
    private JButton btnStart, btnPause, btnClear, btnSend; // æŽ§åˆ¶æŒ‰é’®ï¼šå¼€å§‹ã€æš‚停、清除、发送
    private static JComboBox<String> cbDataType; // ä¸‹æ‹‰æ¡†ï¼šæ•°æ®ç±»åž‹ã€åè®®ã€è®¾å¤‡ID
    private JComboBox<String> cbProtocol;
    private static JComboBox<String> cbProtocol;
    private static JComboBox<String> cbDeviceId;
    private static JComboBox<String> cbRemoteDevice; // è¿œç¨‹è®¾å¤‡ä¸‹æ‹‰æ¡†
    private static JCheckBox chkAutoSave; // å¤é€‰æ¡†ï¼šè‡ªåŠ¨ä¿å­˜ã€æ˜¾ç¤ºæ¥æºã€åå…­è¿›åˆ¶æ˜¾ç¤ºã€ASCII显示
@@ -46,8 +44,6 @@
    // çŠ¶æ€å˜é‡
    private static boolean isCapturing = false; // æ˜¯å¦æ­£åœ¨æ•获数据的标志
    // å­˜å‚¨æ‰€æœ‰è¿œç¨‹è®¾å¤‡(IP:端口)
    private static Set<String> remoteDevices = new HashSet<>();
       // ä¿®æ”¹ä¸ºMap存储设备及其本地端口
    private static Map<String, Integer> remoteDeviceLocalPortMap = new HashMap<>();
    // æž„造函数
@@ -55,6 +51,9 @@
        this.messages = messages; // åˆå§‹åŒ–消息资源包        
        initializeUI(); // åˆå§‹åŒ–用户界面
    }
    public void addNotify() {
        super.addNotify();
@@ -333,24 +332,16 @@
        }
    }
    // åŠ è½½è®¾å¤‡ID列表
    private void loadDeviceIds() {
        // ä»ŽDell_tag类获取所有设备ID
        List<String>  tags = Dell_tag.getAlldeviceIds();
        // éåŽ†è®¾å¤‡ID列表并添加到下拉框
        for (String tag : tags) {
            cbDeviceId.addItem(tag);
        }
    }
    // åŠ è½½æ•°æ®ç±»åž‹
    private void loadtyps() {
        // ä»ŽDell_tag类获取所有设备ID
        List<String>  typs = Dell_MessageType.getAllMessageTypes();
        // éåŽ†è®¾å¤‡ID列表并添加到下拉框
        for (String typ : typs) {
            cbDataType.addItem(typ);
        }
        cbDataType.removeAllItems();
        // æ·»åŠ å›½é™…åŒ–é€‰é¡¹
        cbDataType.addItem(messages.getString("MESSAGE_VIEW_ALL_TYPES"));
        cbDataType.addItem(messages.getString("MESSAGE_VIEW_UDP_PORT_A"));
        cbDataType.addItem(messages.getString("MESSAGE_VIEW_UDP_PORT_B"));
        cbDataType.addItem(messages.getString("MESSAGE_VIEW_TCP_PORT"));
        cbDataType.addItem(messages.getString("MESSAGE_VIEW_MQTT_PORT"));
    }
    // è®¾ç½®æŒ‰é’®åŠ¨ä½œ
@@ -385,11 +376,13 @@
    // å‘送数据到远程设备
    private void sendData() {
        // ä½¿ç”¨æ–°æ–¹æ³•获取当前资源包
        ResourceBundle currentMessages = Languages.getCurrentMessages();
        String selectedDevice = (String) cbRemoteDevice.getSelectedItem();
        if (selectedDevice == null || selectedDevice.equals(messages.getString("MESSAGE_VIEW_ALL_DEVICES"))) {
        if (selectedDevice == null || selectedDevice.equals(currentMessages.getString("MESSAGE_VIEW_ALL_DEVICES"))) {
            JOptionPane.showMessageDialog(this, 
                    messages.getString("MESSAGE_VIEW_SELECT_DEVICE"),
                    messages.getString("WARNING"),
                    currentMessages.getString("MESSAGE_VIEW_SELECT_DEVICE"),
                    currentMessages.getString("WARNING"),
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
@@ -399,7 +392,7 @@
        if (localPort == null) {
            JOptionPane.showMessageDialog(this, 
                    "无法确定设备的接收端口",
                    messages.getString("ERROR"),
                    currentMessages.getString("ERROR"),
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
@@ -408,8 +401,8 @@
        String[] parts = selectedDevice.split(":");
        if (parts.length != 2) {
            JOptionPane.showMessageDialog(this, 
                    messages.getString("MESSAGE_VIEW_INVALID_DEVICE"),
                    messages.getString("ERROR"),
                    currentMessages.getString("MESSAGE_VIEW_INVALID_DEVICE"),
                    currentMessages.getString("ERROR"),
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
@@ -420,8 +413,8 @@
            port = Integer.parseInt(parts[1]);
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(this, 
                    messages.getString("MESSAGE_VIEW_INVALID_PORT"),
                    messages.getString("ERROR"),
                    currentMessages.getString("MESSAGE_VIEW_INVALID_PORT"),
                    currentMessages.getString("ERROR"),
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
@@ -429,8 +422,8 @@
        String dataToSend = txtSendData.getText();
        if (dataToSend.isEmpty()) {
            JOptionPane.showMessageDialog(this, 
                    messages.getString("MESSAGE_VIEW_EMPTY_DATA"),
                    messages.getString("WARNING"),
                    currentMessages.getString("MESSAGE_VIEW_EMPTY_DATA"),
                    currentMessages.getString("WARNING"),
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
@@ -503,26 +496,67 @@
    }
    
    // æ•获数据的核心方法
    public  static void captureData(String rawData, String ip, int port, int localPort, String timestamp) {
         // æ£€æŸ¥çª—口是否可见
    // ä¿®æ”¹é€šç”¨æ•°æ®æ˜¾ç¤ºæ–¹æ³•
    public static void showData(String rawData, String ip, int port, int localPort, String deviceId) {
        if (!isWindowVisible) {
            return;
        }
        String formattedData = formatData(rawData,ip,port,timestamp); // æ ¼å¼åŒ–数据
        // èŽ·å–å½“å‰é€‰æ‹©
        String selectedDataType = (String) cbDataType.getSelectedItem();
        String selectedProtocol = (String) cbProtocol.getSelectedItem();
        String selectedDeviceId = (String) cbDeviceId.getSelectedItem();
        // ä½¿ç”¨æ–°æ–¹æ³•获取当前资源包
        ResourceBundle messages = Languages.getCurrentMessages();
        String allTypes = messages.getString("MESSAGE_VIEW_ALL_TYPES");
        String allProtocols = messages.getString("MESSAGE_VIEW_ALL_PROTOCOLS");
        String allDevices = messages.getString("MESSAGE_VIEW_ALL_DEVICES");
        String udpPortA = messages.getString("MESSAGE_VIEW_UDP_PORT_A");
        String udpPortB = messages.getString("MESSAGE_VIEW_UDP_PORT_B");
        String udpProtocol = "UDP"; // ç›´æŽ¥ä½¿ç”¨åè®®åç§°
        // æ£€æŸ¥æ•°æ®ç±»åž‹è¿‡æ»¤
        boolean dataTypeMatch = selectedDataType.equals(allTypes) ||
                (localPort == UDPPortAReceiver.PORT && selectedDataType.equals(udpPortA)) ||
                (localPort == UDPPortBReceiver.PORT && selectedDataType.equals(udpPortB));
        // æ£€æŸ¥åè®®è¿‡æ»¤
        boolean protocolMatch = selectedProtocol.equals(allProtocols) ||
                (localPort == UDPPortAReceiver.PORT && selectedProtocol.equals(udpProtocol)) ||
                (localPort == UDPPortBReceiver.PORT && selectedProtocol.equals(udpProtocol));
        // æ£€æŸ¥è®¾å¤‡ID过滤
        boolean deviceIdMatch=false;
        if("1".equals(deviceId)) {
            deviceIdMatch=true;
        }else {
            deviceIdMatch = selectedDeviceId.equals(allDevices) ||
                    (deviceId != null && deviceId.equals(selectedDeviceId));
        }
        // åªæœ‰å½“所有条件都匹配时才显示
        if (!(dataTypeMatch && protocolMatch && deviceIdMatch)) {
            return;
        }
        // ç”Ÿæˆæ¯«ç§’级时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
        String timestamp = sdf.format(new Date());
        String formattedData = formatData(rawData, ip, port, timestamp);
        if(isCapturing) {
            // æ·»åŠ è¿œç¨‹è®¾å¤‡åˆ°ä¸‹æ‹‰æ¡†
            addRemoteDevice(ip, port, localPort); // ç¡®ä¿è°ƒç”¨å¸¦ç«¯å£å‚数的方法
            // èŽ·å–å½“å‰é€‰æ‹©çš„è®¾å¤‡ID和数据类型
            String deviceId = cbDeviceId.getSelectedItem().toString();
            String dataType = cbDataType.getSelectedItem().toString();
            addRemoteDevice(ip, port, localPort);
            
            // åœ¨EDT线程中更新UI
            SwingUtilities.invokeLater(() -> {
                txtDataView.append(formattedData + "\n"); // æ·»åŠ æ•°æ®åˆ°æ–‡æœ¬åŒºåŸŸ
                // è‡ªåŠ¨æ»šåŠ¨åˆ°åº•éƒ¨
                txtDataView.append(formattedData + "\n");
                txtDataView.setCaretPosition(txtDataView.getDocument().getLength());
            });
        }
        // å¦‚果启用了自动保存,则保存到文件
        if (chkAutoSave.isSelected()) {
            saveToFile(formattedData);
@@ -530,29 +564,56 @@
    }
    // æ ¼å¼åŒ–数据显示
    // ä¿®æ”¹æ ¼å¼æ˜¾ç¤ºæ–¹æ³•,支持混合格式
    private static String formatData(String rawData, String ip,  int port,String timestamp) {
        StringBuilder formatted = new StringBuilder(); // ä½¿ç”¨StringBuilder构建格式化字符串
        // å¦‚果启用了显示来源,添加时间戳和源地址
        StringBuilder formatted = new StringBuilder();
        // ä½¿ç”¨æ–°æ–¹æ³•获取当前资源包
        ResourceBundle messages = Languages.getCurrentMessages();
        // æ˜¾ç¤ºæ¥æºä¿¡æ¯
        if (chkShowSource.isSelected()) {
            formatted.append("["+timestamp+";"+ip+":"+port+"]"); // æ·»åŠ æ¨¡æ‹Ÿæºåœ°å€
            formatted.append("[")
            .append(timestamp)
            .append("][")
            .append(ip)
            .append(":")
            .append(port)
            .append("] ");
        }
        // æ ¹æ®æ˜¾ç¤ºé€‰é¡¹æ ¼å¼åŒ–数据
        if (chkHexDisplay.isSelected() && chkAsciiDisplay.isSelected()) {
            // åŒæ—¶æ˜¾ç¤ºåå…­è¿›åˆ¶å’ŒASCII
            formatted.append(toHexString(rawData)) // æ·»åŠ åå…­è¿›åˆ¶è¡¨ç¤º
            .append(" | ") // æ·»åŠ åˆ†éš”ç¬¦
            .append(rawData); // æ·»åŠ åŽŸå§‹ASCII数据
            formatted.append(formatHexString(rawData))
            .append(" | ")
            .append(hexToAscii(rawData))
            .append(" [")
            .append(messages.getString("MESSAGE_VIEW_MIXED_FORMAT"))
            .append("]");
        } else if (chkHexDisplay.isSelected()) {
            // ä»…显示十六进制
            formatted.append(toHexString(rawData));
            formatted.append(formatHexString(rawData))
            .append(" [")
            .append(messages.getString("MESSAGE_VIEW_HEX_FORMAT"))
            .append("]");
        } else if (chkAsciiDisplay.isSelected()) {
            formatted.append(hexToAscii(rawData))
            .append(" [")
            .append(messages.getString("MESSAGE_VIEW_ASCII_FORMAT"))
            .append("]");
        } else {
            // é»˜è®¤æ˜¾ç¤ºåŽŸå§‹ASCII数据
            formatted.append(rawData);
            formatted.append(hexToAscii(rawData));
        }
        return formatted.toString(); // è¿”回格式化后的字符串
        return formatted.toString();
    }
    // ä¿®æ”¹è®¾å¤‡ID加载方法
    private void loadDeviceIds() {
        cbDeviceId.removeAllItems();
        cbDeviceId.addItem(messages.getString("MESSAGE_VIEW_ALL_DEVICES"));
        List<String> tags = Dell_tag.getAlldeviceIds();
        for (String tag : tags) {
            cbDeviceId.addItem(tag);
        }
    }
    // å°†å­—符串转换为十六进制表示
@@ -563,7 +624,25 @@
        }
        return hex.toString().trim(); // è¿”回并去除末尾空格
    }
    // æ ¼å¼åŒ–十六进制字符串(每两个字符加空格)
    private static String formatHexString(String hex) {
        StringBuilder formatted = new StringBuilder();
        for (int i = 0; i < hex.length(); i += 2) {
            if (i > 0) formatted.append(" ");
            formatted.append(hex.substring(i, Math.min(i + 2, hex.length())));
        }
        return formatted.toString();
    }
    // å°†åå…­è¿›åˆ¶å­—符串转换为ASCII
    private static String hexToAscii(String hexStr) {
        StringBuilder output = new StringBuilder();
        for (int i = 0; i < hexStr.length(); i += 2) {
            String str = hexStr.substring(i, i + 2);
            output.append((char) Integer.parseInt(str, 16));
        }
        return output.toString();
    }
    // ä¿å­˜æ•°æ®åˆ°æ–‡ä»¶
    private static void saveToFile(String data) {
        SimpleDateFormat fileFormat = new SimpleDateFormat("yyyyMMdd"); // æ–‡ä»¶æ—¥æœŸæ ¼å¼
src/dell_targets/Dell_BaseStation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
package dell_targets;
import databases.DBConnector;
import targets.LocationBaseStation;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
public class Dell_BaseStation {
    static List<LocationBaseStation> baseStations;
    private static ConcurrentHashMap<String, LocationBaseStation> baseStationMap; // ä»¥åŸºç«™ID为键的映射
    public static List<LocationBaseStation> getBaseStations() throws SQLException {
        baseStations = new ArrayList<>();
        baseStationMap = new ConcurrentHashMap<>(); // ä¿®å¤ï¼šåˆå§‹åŒ–映射
        ResultSet rs = DBConnector.queryTableData("location_base_station");
        while (rs.next()) {
            LocationBaseStation baseStation = new LocationBaseStation();
            baseStation.setId((int) rs.getLong("id"));
            baseStation.setCode(rs.getString("base_station_id"));
            baseStation.setStatus(rs.getString("statuss"));
            baseStation.setXCoordinate(rs.getString("x_coordinate"));
            baseStation.setYCoordinate(rs.getString("y_coordinate"));
            baseStation.setZCoordinate(rs.getString("z_coordinate"));
            baseStation.setLongitude(rs.getString("longitude"));
            baseStation.setLatitude(rs.getString("latitude"));
            baseStation.setElevation(rs.getString("elevation"));
            baseStation.setHorizontalAngle(rs.getString("horizontal_angle"));
            baseStation.setPitchAngle(rs.getString("pitch_angle"));
            baseStation.setFloor(rs.getString("located_layer"));
            baseStation.setGroup(rs.getString("located_group"));
            baseStation.setRange(rs.getString("range"));
            baseStation.setSyncStatus(rs.getString("sync_status"));
            baseStation.setSyncType(rs.getString("sync_type"));
            baseStation.setSyncBaseStation(rs.getString("sync_base_station"));
            baseStation.setIpAddress(rs.getString("ip_address"));
            baseStation.setPort(rs.getString("ports"));
            baseStation.setFirmwareVersion(rs.getString("firmware_version"));
            baseStation.setJudgmentDistance(rs.getString("judgment_distance"));
            baseStation.setBattery(rs.getString("battery"));
            baseStation.setCalibrationDistance(rs.getString("calibration_distance"));
            baseStation.setSignalSendTime(rs.getString("signal_transmission_time"));
            baseStation.setCommunicationGroup(rs.getString("communication_group"));
            baseStation.setIconAddress(rs.getString("icon_url"));
            baseStation.setOnlineTime(rs.getString("online_time"));
            baseStation.setOfflineTime(rs.getString("offline_time"));
            baseStation.setOfflineDuration(rs.getString("offline_duration"));
            baseStation.setAlgorithmDimension(rs.getString("algorithm_dimension"));
            baseStation.setBottomHeight(rs.getString("located_bottom_height"));
            baseStation.setTopHeight(rs.getString("located_top_height"));
            baseStation.setIsBarometricStation(rs.getString("barometric_base_station"));
            baseStation.setSwitchDistance(rs.getString("handover_distance"));
            baseStation.setMaxDistance(rs.getString("maximum_distance"));
            baseStation.setOutputAllRanging(rs.getString("output_all_base_station_ranging"));
            baseStation.setCompany(rs.getString("company"));
            baseStation.setCrossLayerHeight(rs.getString("cross_layer_height"));
            baseStation.setCrossLayerGroup(rs.getString("cross_layer_group"));
            baseStation.setRequiredDistance(rs.getString("must_pass_distance"));
            baseStation.setAdjacent1(rs.getString("adjacent1"));
            baseStation.setAdjacent2(rs.getString("adjacent2"));
            baseStation.setAdjacent3(rs.getString("adjacent3"));
            baseStation.setAdjacent4(rs.getString("adjacent4"));
            baseStation.setAdjacent5(rs.getString("adjacent5"));
            baseStation.setAdjacent6(rs.getString("adjacent6"));
            baseStation.setAdjacent7(rs.getString("adjacent7"));
            baseStation.setAdjacent8(rs.getString("adjacent8"));
            baseStation.setAdjacent9(rs.getString("adjacent9"));
            baseStation.setAdjacent10(rs.getString("adjacent10"));
            baseStation.setReserved1(rs.getString("reserved1"));
            baseStation.setReserved2(rs.getString("reserved2"));
            baseStation.setReserved3(rs.getString("reserved3"));
            baseStation.setReserved4(rs.getString("reserved4"));
            baseStation.setReserved5(rs.getString("reserved5"));
            baseStation.setReserved6(rs.getString("reserved6"));
            baseStation.setReserved7(rs.getString("reserved7"));
            baseStation.setReserved8(rs.getString("reserved8"));
            baseStation.setReserved9(rs.getString("reserved9"));
            baseStation.setReserved10(rs.getString("reserved10"));
            baseStation.setReserved11(rs.getString("reserved11"));
            baseStation.setReserved12(rs.getString("reserved12"));
            baseStation.setReserved13(rs.getString("reserved13"));
            baseStation.setReserved14(rs.getString("reserved14"));
            baseStation.setReserved15(rs.getString("reserved15"));
            baseStation.setReserved16(rs.getString("reserved16"));
            baseStations.add(baseStation);
            baseStationMap.put(baseStation.getCode(), baseStation); // ä»¥åŸºç«™ID为键存入映射
        }
        return baseStations;
    }
    /**
     * æ ¹æ®åŸºç«™ID高效修改属性值
     * @param baseStationId åŸºç«™ID(base_station_id)
     * @param propertyName å±žæ€§åï¼ˆéœ€ä¸Žsetter方法匹配)
     * @param value æ–°å±žæ€§å€¼
     */
    public static void updateBaseStationProperty(String baseStationId, String propertyName, String value) {
        LocationBaseStation station = baseStationMap.get(baseStationId);
        if (station == null) return; // åŸºç«™ä¸å­˜åœ¨åˆ™å¿½ç•¥
        // æ ¹æ®å±žæ€§åè°ƒç”¨å¯¹åº”setter(高效匹配高频属性)
        switch (propertyName) {
        case "status":
            station.setStatus(value); break; // æ›´æ–°çŠ¶æ€
        case "battery":
            station.setBattery(value); break; // æ›´æ–°ç”µé‡
        case "ipAddress":
            station.setIpAddress(value); break; // æ›´æ–°IP地址
        case "onlineTime":
            station.setOnlineTime(value); break; // æ›´æ–°ä¸Šçº¿æ—¶é—´
        case "offlineTime":
            station.setOfflineTime(value); break; // æ›´æ–°ç¦»çº¿æ—¶é—´
        case "offlineDuration":
            station.setOfflineDuration(value); break; // æ›´æ–°ç¦»çº¿æ—¶é•¿
        case "syncStatus":
            station.setSyncStatus(value); break; //同步状态
        case "barometerReading":
            station.setBarometerReading(value); break; //同步状态
            // æ·»åŠ å…¶ä»–é«˜é¢‘å±žæ€§...
        default:
            throw new IllegalArgumentException("不支持属性: " + propertyName);
        }
    }
    /**
     * æ ¹æ®åŸºç«™ID获取基站对象(高效访问)
     * @param baseStationId åŸºç«™ID
     * @return åŸºç«™å¯¹è±¡ï¼ˆä¸å­˜åœ¨åˆ™è¿”回null)
     */
    public static LocationBaseStation getBaseStationById(String baseStationId) {
        return baseStationMap.get(baseStationId); // O(1)复杂度直接获取
    }
}
src/dell_targets/Dell_SystemConfiguration.java
@@ -14,6 +14,7 @@
    static List<SystemConfiguration> configs;
    public static boolean xytognssOpen=false;
    public static boolean gnsstoxyOpen=false;
    public static String language="0";
    // èŽ·å–ç³»ç»Ÿé…ç½®åˆ—è¡¨
    public static List<SystemConfiguration> getSystemConfigurations()  {
        // åˆ›å»ºé…ç½®å¯¹è±¡åˆ—表
@@ -158,8 +159,10 @@
                config.setRealTimeTrajectoryDuration(rs.getString("real_time_trajectory_duration"));
                // å®žæ—¶è½¨è¿¹é¢œè‰²
                config.setRealTimeTrajectoryColor(rs.getString("real_time_trajectory_color"));
                String langua=rs.getString("system_language");
                language=langua;
                // ç³»ç»Ÿè¯­è¨€
                config.setSystemLanguage(rs.getString("system_language"));
                config.setSystemLanguage(langua);
                // JNA日志开关
                config.setJnaLogSwitch(rs.getString("jna_log_switch"));
                // æ—¶é—´ç‰‡åˆ†é…æ–¹å¼
src/publicsWay/Languages.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package publicsWay;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import dell_targets.Dell_SystemConfiguration;
public class Languages {
    // ä¿®æ”¹åŽçš„资源加载方法
    public static ResourceBundle getCurrentMessages() {
        // æ ¹æ®ç³»ç»Ÿé…ç½®å†³å®šè¯­è¨€
        Locale locale = "1".equals(Dell_SystemConfiguration.language) ?
                Locale.ENGLISH : Locale.SIMPLIFIED_CHINESE;
        // ä½¿ç”¨ä¸ŽWindows.java相同的加载逻辑
        String fileName = locale.equals(Locale.ENGLISH) ?
                "Messages_en.properties" : "Messages_zh.properties";
        File langFile = new File("systemfile/" + fileName);
        if (!langFile.exists()) {
            System.err.println("默认资源文件未找到: " + langFile.getAbsolutePath());
            try {
                return ResourceBundle.getBundle("systemfile.Messages", locale);
            } catch (Exception e) {
                System.err.println("后备资源加载失败: " + e.getMessage());
                // è¿”回空包避免崩溃
                return new ResourceBundle() {
                    @Override
                    protected Object handleGetObject(String key) {
                        return "!" + key + "!";
                    }
                    @Override
                    public Enumeration<String> getKeys() {
                        return java.util.Collections.emptyEnumeration();
                    }
                };
            }
        }
        try (InputStream inputStream = new FileInputStream(langFile)) {
            return new PropertyResourceBundle(inputStream);
        } catch (IOException e) {
            System.err.println("无法加载资源文件: " + e.getMessage());
            return ResourceBundle.getBundle("systemfile.Messages", locale);
        }
    }
}
src/publicsWay/UwbDataParser.java
@@ -131,10 +131,5 @@
            this.buttonStatus = buttonStatus;
        }
        @Override
        public String toString() {
            return String.format("包序: %d, æ ‡ç­¾: %s, åŸºç«™: %s, è·ç¦»: %d mm, ç”µé‡: %d%%, æŒ‰é”®: %d",
                                sequence, tagId, baseId, distance, battery, buttonStatus);
        }
    }
}
src/targets/LocationBaseStation.java
@@ -66,6 +66,7 @@
    private String reserved14; // å¤‡ç”¨ 14
    private String reserved15; // å¤‡ç”¨ 15
    private String reserved16; // å¤‡ç”¨ 16
    private String barometerReading;//气压计值
    // Getter and Setter methods
    public int getId() {
@@ -595,4 +596,36 @@
    public void setReserved16(String reserved16) {
        this.reserved16 = reserved16;
    }
    public String getxCoordinate() {
        return xCoordinate;
    }
    public String getyCoordinate() {
        return yCoordinate;
    }
    public String getzCoordinate() {
        return zCoordinate;
    }
    public String getBarometerReading() {
        return barometerReading;
    }
    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 setBarometerReading(String barometerReading) {
        this.barometerReading = barometerReading;
    }
}
src/udptcp/DellHexBaowen.java
ÎļþÒÑɾ³ý
src/udptcp/HexBaowen.java
ÎļþÒÑɾ³ý
src/udptcp/PacketParser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
package udptcp;
import java.util.ArrayList;
import java.util.List;
// é‡å‘½åä¸ºPacketParser,表示数据包解析器
public class PacketParser {
    // æ·»åŠ åå…­è¿›åˆ¶å­—ç¬¦æ•°ç»„å¸¸é‡
    private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    // ç¼“冲区字节数组
    private byte[] buffer = new byte[4096];
    // å½“前缓冲区有效数据长度
    private int bufferLength = 0;
    // è¿½åŠ æ–°æ•°æ®åˆ°ç¼“å†²åŒº
    public void appendData(byte[] newData, int length) {
        // æ£€æŸ¥ç¼“冲区是否足够
        if (bufferLength + length > buffer.length) {
            // åˆ›å»ºæ–°çš„æ›´å¤§ç¼“冲区
            byte[] newBuffer = new byte[bufferLength + length];
            // å¤åˆ¶åŽŸæœ‰æ•°æ®
            System.arraycopy(buffer, 0, newBuffer, 0, bufferLength);
            buffer = newBuffer;
        }
        // è¿½åŠ æ–°æ•°æ®
        System.arraycopy(newData, 0, buffer, bufferLength, length);
        // æ›´æ–°ç¼“冲区长度
        bufferLength += length;
    }
 // æ–°å¢žæ–¹æ³•:字节数组转十六进制字符串
    public static String bytesToHexString(byte[] bytes) {
        if (bytes == null) return "";
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = HEX_ARRAY[v >>> 4];
            hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }
    // è§£æžç¼“冲区中的所有完整数据包
    public List<DataPacket> parsePackets() {
        List<DataPacket> packets = new ArrayList<>();
        int index = 0;  // å½“前解析位置索引
        // éåŽ†ç¼“å†²åŒºæŸ¥æ‰¾å®Œæ•´æ•°æ®åŒ…
        while (index <= bufferLength - 4) { // ç¡®ä¿æœ‰è¶³å¤Ÿæ•°æ®æ£€æŸ¥åŒ…头
            // æ£€æŸ¥åŒ…头标识 0x55 0xAA
            if (buffer[index] == 0x55 && (buffer[index + 1] & 0xFF) == 0xAA) {
                // èŽ·å–åŒ…ç±»åž‹ï¼ˆç¬¬3字节)
                int packetType = buffer[index + 2] & 0xFF;
                // èŽ·å–æ•°æ®é•¿åº¦ï¼ˆç¬¬4字节)
                int dataLenField = buffer[index + 3] & 0xFF;
                // è®¡ç®—完整包长度(包头+数据+校验)
                int totalPacketLen = 4 + dataLenField + 2;  // å¢žåŠ 2字节校验位
                // æ£€æŸ¥æ˜¯å¦æœ‰è¶³å¤Ÿæ•°æ®æž„成完整包
                if (index + totalPacketLen > bufferLength) {
                    break; // æ•°æ®ä¸è¶³ï¼Œç­‰å¾…更多数据
                }
                // æå–完整数据包
                byte[] packetData = new byte[totalPacketLen];
                System.arraycopy(buffer, index, packetData, 0, totalPacketLen);
                // éªŒè¯æ ¡éªŒå’Œ
                if (verifyChecksum(packetData)) {
                    // è§£æžå•个数据包
                    DataPacket packet = parseSinglePacket(packetType, packetData);
                    if (packet != null) {
                        packets.add(packet); // æ·»åŠ åˆ°ç»“æžœåˆ—è¡¨
                    }
                    index += totalPacketLen; // ç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªåŒ…
                } else {
                    index++; // æ ¡éªŒå¤±è´¥ï¼Œè·³è¿‡å½“前字节
                }
            } else {
                index++; // éžåŒ…头标识,继续查找
            }
        }
        // æ¸…理已处理数据
        if (index > 0) {
            int remaining = bufferLength - index;
            if (remaining > 0) {
                // ç§»åŠ¨å‰©ä½™æ•°æ®åˆ°ç¼“å†²åŒºå¼€å¤´
                System.arraycopy(buffer, index, buffer, 0, remaining);
            }
            bufferLength = remaining; // æ›´æ–°ç¼“冲区长度
        }
        return packets;
    }
    // æ ¡éªŒæ•°æ®åŒ…完整性
    private boolean verifyChecksum(byte[] packet) {
        int len = packet.length;
        if (len < 4) return false; // é•¿åº¦ä¸è¶³
        int sum = 0;
        // è®¡ç®—从第3字节到倒数第3字节的和(跳过包头和校验位)
        for (int i = 2; i < len - 2; i++) {
            sum += packet[i] & 0xFF;
        }
        // å–反得到16位校验和
        sum = ~sum & 0xFFFF;
        // æå–包中的校验和(小端格式)
        int receivedChecksum = ((packet[len - 1] & 0xFF) << 8) | (packet[len - 2] & 0xFF);
        // æ¯”较校验和
        return sum == receivedChecksum;
    }
    // è§£æžå•个数据包
    private DataPacket parseSinglePacket(int packetType, byte[] packet) {
        // åˆ›å»ºæ•°æ®åŒ…对象(包含包类型)
        return new DataPacket(packetType, packet);
    }
    // æ•°æ®åŒ…内部类
    public static class DataPacket {
        private final int packetType;  // åŒ…类型
        private final byte[] packet;//包数据
        public DataPacket(int packetType, byte[] packet) {
            this.packetType = packetType;
            this.packet = packet;
        }
        // èŽ·å–åŒ…ç±»åž‹
        public int getPacketType() {
            return packetType;
        }
        // åŒ…数据
        public byte[] getPacket() {
            return packet;
        }
    }
    // HEX字符串转字节数组
    public static byte[] hexStringToBytes(String hex) {
        // ç§»é™¤ç©ºæ ¼
        hex = hex.replaceAll("\\s", "");
        int len = hex.length();
        // åˆ›å»ºç»“果数组
        byte[] data = new byte[len / 2];
        // æ¯ä¸¤ä¸ªå­—符转换一个字节
        for (int i = 0; i < len; i += 2) {
            // é«˜ä½è½¬æ¢
            int high = Character.digit(hex.charAt(i), 16) << 4;
            // ä½Žä½è½¬æ¢
            int low = Character.digit(hex.charAt(i + 1), 16);
            data[i / 2] = (byte) (high | low);
        }
        return data;
    }
}
src/udptcp/PacketProcessingSystem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package udptcp;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import dell55AAData.Dell55AA01Parser;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PacketProcessingSystem {
    // çº¿ç¨‹å®‰å…¨çš„æŠ¥æ–‡å­˜å‚¨é˜Ÿåˆ—(集合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;
    // æŠ¥æ–‡å­˜å‚¨ç»“æž„
    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;
        }
    }
    // æŽ¥æ”¶ç«¯å­˜å‚¨æŠ¥æ–‡ï¼ˆUDPPortAReceiver中调用)
    public static void storePacket(String ip, int port, String hexData) {
        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(() -> {
            PacketParser bufferManager = new PacketParser();
            while (isRunning.get()) {
                HexPacket packet = packetQueue.poll();
                if (packet == null) {
                    Thread.yield(); // é˜Ÿåˆ—为空时让出CPU
                    continue;
                }
                try {
                    // è½¬æ¢HEX为字节数据
                    byte[] rawData = PacketParser.hexStringToBytes(packet.hexData);
                    // è¿½åŠ åˆ°ç¼“å†²åŒºå¹¶è§£æž
                    bufferManager.appendData(rawData, rawData.length);
                    List<PacketParser.DataPacket> parsedPackets = bufferManager.parsePackets();
                    // å¤„理解析后的数据包
                    for (PacketParser.DataPacket p : parsedPackets) {
                        // æ ¹æ®åŒ…头类型路由到不同解析器
                        switch (p.getPacketType()) {
                            case 0x01:
                                processType01(p);break;
                            case 0x02:
                                processType02(p);break;
                            default:
                                System.err.println("未知包类型: " + p.getPacketType());
                        }
                    }
                } 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();
        }
    }
    // ç¤ºä¾‹è§£æžæ–¹æ³•(需根据实际协议实现)
    private static void processType01(PacketParser.DataPacket packet) {
        String hexData = PacketParser.bytesToHexString(packet.getPacket());
        Dell55AA01Parser.parse(hexData);
    }
    private static void processType02(PacketParser.DataPacket packet) {
        System.out.println("处理55AA02包: " + packet);
        // å®žé™…业务逻辑
    }
    // å…¶ä»–类型处理方法...
}
src/udptcp/TCPDiffDataReceiver.java
ÎļþÒÑɾ³ý
src/udptcp/UDPPortAReceiver.java
@@ -2,8 +2,6 @@
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
@@ -12,41 +10,35 @@
public class UDPPortAReceiver {
    public static final int PORT = 8234;
    @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 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());
                            packetCount.incrementAndGet();
                            // èŽ·å–å½“å‰æ—¶é—´å’Œæ—¶é—´æˆ³
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            String time = sdf.format(new Date());
                            int timestamp = (int)(System.currentTimeMillis() / 1000);
                            // ä¿å­˜åˆ°HexBaowen集合
                         // è°ƒç”¨æ—¶æ·»åŠ æœ¬åœ°ç«¯å£å‚æ•°
                            HexBaowen.intsert(ip, hexData, time, port, LOCAL_PORT, timestamp);
                            PacketProcessingSystem.storePacket(ip, port, hexData);
                           // æŠ¥æ–‡æŸ¥çœ‹çª—口显示数据
                            MessageViewPanel.showData(hexData, ip, port, PORT,"1");
                            
                        } catch (Exception e) {
                            System.err.println("Error processing UDP-A packet: " + e.getMessage());
src/udptcp/UDPPortBReceiver.java
@@ -2,21 +2,20 @@
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import dell_system.MessageViewPanel;
public class UDPPortBReceiver {
    public static final int PORT = 7000;
    @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 int LOCAL_PORT = PORT; // å®šä¹‰æœ¬åœ°ç«¯å£
    // å¯åŠ¨æŽ¥æ”¶å™¨çš„é™æ€æ–¹æ³•
    public static void startReceiver() {
@@ -37,15 +36,8 @@
                            String ip = packet.getAddress().getHostAddress();
                            int port = packet.getPort();
                            String hexData = bytesToHex(packet.getData(), packet.getLength());
                            packetCount.incrementAndGet();
                            // èŽ·å–å½“å‰æ—¶é—´å’Œæ—¶é—´æˆ³
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            String time = sdf.format(new Date());
                            int timestamp = (int)(System.currentTimeMillis() / 1000);
                            // ä¿å­˜åˆ°HexBaowen集合
                         // è°ƒç”¨æ—¶æ·»åŠ æœ¬åœ°ç«¯å£å‚æ•°
                            HexBaowen.intsert(ip, hexData, time, port, LOCAL_PORT, timestamp);
                            PacketProcessingSystem.storePacket(ip, port, hexData);
                            
                        } catch (Exception e) {
                            System.err.println("Error processing UDP-A packet: " + e.getMessage());
@@ -73,7 +65,6 @@
        executor.shutdown();
    }
    
    // å‘送数据到指定设备
 // å‘送数据到指定设备
    public static void sendData(String ip, int port, String data, boolean isHex) {
        try {
src/window/Windows.java
@@ -17,6 +17,7 @@
import dell_map.Dell_Map;
import dell_map.MapViewer;
import dell_targets.Dell_SystemConfiguration;
import targets.Mapdata;
public class Windows extends JFrame {
@@ -82,6 +83,16 @@
        createLanguageMenu();
    }
    // æ–°å¢žæ–¹æ³•:根据系统配置获取当前语言环境
    public Locale getSystemLocale() {
        return "1".equals(Dell_SystemConfiguration.language) ?
               Locale.ENGLISH : Locale.SIMPLIFIED_CHINESE;
    }
    // æ–°å¢žæ–¹æ³•:供其他类获取当前语言环境
    public Locale getCurrentLocale() {
        return this.currentLocale;
    }
    private ResourceBundle loadResourceBundle(Locale locale) {
        String fileName = locale.equals(Locale.ENGLISH) ? 
systemfile/Messages_en.properties
@@ -1,3 +1,17 @@
# New message viewing related resources
MESSAGE_VIEW_ALL_TYPES=All Types
MESSAGE_VIEW_UDP_PORT_A=UDP Port A
MESSAGE_VIEW_UDP_PORT_B=UDP Port B
MESSAGE_VIEW_TCP_PORT=TCP Port
MESSAGE_VIEW_MQTT_PORT=MQTT Port
MESSAGE_VIEW_ALL_DEVICES=All Devices
MESSAGE_VIEW_ALL_PROTOCOLS=All Protocols
MESSAGE_VIEW_SHOW_DATA=Show Data
MESSAGE_VIEW_DATA_SOURCE=Data Source
MESSAGE_VIEW_FILTERED_DATA=Filtered Data
MESSAGE_VIEW_HEX_FORMAT=HEX Format
MESSAGE_VIEW_ASCII_FORMAT=ASCII Format
MESSAGE_VIEW_MIXED_FORMAT=Mixed Format
# New Resource Key-Value Pairs
packet.count.format=Packets Received: %d
label.id=Label ID
systemfile/Messages_zh.properties
@@ -1,3 +1,17 @@
# æ–°å¢žçš„æŠ¥æ–‡æŸ¥çœ‹ç›¸å…³èµ„源
MESSAGE_VIEW_ALL_TYPES=所有类型
MESSAGE_VIEW_UDP_PORT_A=UDP端口A
MESSAGE_VIEW_UDP_PORT_B=UDP端口B
MESSAGE_VIEW_TCP_PORT=TCP端口
MESSAGE_VIEW_MQTT_PORT=MQTT端口
MESSAGE_VIEW_ALL_DEVICES=所有设备
MESSAGE_VIEW_ALL_PROTOCOLS=所有协议
MESSAGE_VIEW_SHOW_DATA=显示数据
MESSAGE_VIEW_DATA_SOURCE=数据来源
MESSAGE_VIEW_FILTERED_DATA=已过滤数据
MESSAGE_VIEW_HEX_FORMAT=HEX格式
MESSAGE_VIEW_ASCII_FORMAT=ASCII格式
MESSAGE_VIEW_MIXED_FORMAT=混合格式
# æ–°å¢žèµ„源键值对
packet.count.format=收到数据:%d条
label.id=标签编号
systemfile/logfile/openlog.txt
@@ -634,3 +634,70 @@
程序关闭: 2025-08-08 23:06:23
工作时长: 0小时 0分钟 41秒
-----------------------------------
程序启动: 2025-08-09 10:43:53
程序关闭: 2025-08-09 15:09:35
工作时长: 4小时 25分钟 41秒
-----------------------------------
程序启动: 2025-08-09 15:09:38
程序关闭: 2025-08-09 15:09:41
工作时长: 0小时 0分钟 2秒
-----------------------------------
程序启动: 2025-08-09 15:21:34
程序启动: 2025-08-09 15:26:45
程序关闭: 2025-08-09 15:26:49
工作时长: 0小时 5分钟 15秒
-----------------------------------
程序启动: 2025-08-09 15:26:51
程序启动: 2025-08-09 15:28:12
程序关闭: 2025-08-09 15:29:23
工作时长: 0小时 1分钟 10秒
-----------------------------------
程序启动: 2025-08-09 15:29:25
程序关闭: 2025-08-09 15:30:53
工作时长: 0小时 1分钟 27秒
-----------------------------------
程序启动: 2025-08-09 15:30:55
程序关闭: 2025-08-09 15:31:19
工作时长: 0小时 0分钟 23秒
-----------------------------------
程序启动: 2025-08-09 15:31:22
程序关闭: 2025-08-09 15:36:19
工作时长: 0小时 4分钟 57秒
-----------------------------------
程序启动: 2025-08-09 15:36:21
程序关闭: 2025-08-09 15:38:36
工作时长: 0小时 2分钟 15秒
-----------------------------------
程序启动: 2025-08-09 15:38:39
程序关闭: 2025-08-09 16:03:25
工作时长: 0小时 24分钟 46秒
-----------------------------------
程序启动: 2025-08-09 16:03:28
程序关闭: 2025-08-09 16:03:42
工作时长: 0小时 0分钟 14秒
-----------------------------------
程序启动: 2025-08-09 16:13:27
程序关闭: 2025-08-09 16:16:14
工作时长: 0小时 2分钟 46秒
-----------------------------------
程序启动: 2025-08-09 16:16:17
程序关闭: 2025-08-09 16:16:37
工作时长: 0小时 0分钟 19秒
-----------------------------------
程序启动: 2025-08-09 16:19:34
程序关闭: 2025-08-09 16:21:03
工作时长: 0小时 1分钟 29秒
-----------------------------------
程序启动: 2025-08-09 16:21:05
程序关闭: 2025-08-09 16:22:09
工作时长: 0小时 1分钟 3秒
-----------------------------------
程序启动: 2025-08-09 16:22:10
程序关闭: 2025-08-09 16:28:22
工作时长: 0小时 6分钟 11秒
-----------------------------------
程序启动: 2025-08-09 16:28:24
程序关闭: 2025-08-09 16:32:37
工作时长: 0小时 4分钟 12秒
-----------------------------------
程序启动: 2025-08-09 16:32:39