张世豪
5 小时以前 a6077217e25f5804027194a5c2848e773eda1abd
src/chuankou/Sendmsg.java
@@ -2,6 +2,15 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.SwingWorker;
import chushihua.lunxun;
import dialog.Charulog;
import dialog.Dingshidialog;
import dialog.Errlog;
import publicway.OpenDoor;
import xitongshezhi.SystemDebugDialog;
/**
 * 串口消息发送工具类
 * 提供高性能的串口消息发送功能,适合高频调用
@@ -16,6 +25,78 @@
    
    // 日期格式化
    private static final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss.SSS");
    /**发卡服务器控制打开某个柜门调用指令
     * @param int slotId柜门编号1-60
     * @param int type 1是服务器发卡,2是管理员发卡*/
    public static boolean opendoorzhiling(int slotId,int type) {
       lunxun.setSendChaxunzhiling(false);//暂停查询指令
       // 调用OpenDoor生成开门指令
       String command = OpenDoor.openOneDoor(slotId, type);
       boolean sendResult = Sendmsg.sendMessage(command);
       String mes=command+";type"+type+"控制打开"+slotId+"柜门";
       Charulog.logOperation(mes);
       if (lunxun.DEBUG_ENABLED) {
            SystemDebugDialog.appendAsciiData(mes);
        }
       lunxun.setSendChaxunzhiling(true);//开始查询指令
      return sendResult;
    }
    /**
     * 打开全部卡槽的公用静态方法
     * @param type 操作类型:1-服务器发卡,2-管理员发卡
     */
    public static void openAllSlots(int type) {
       lunxun.setSendChaxunzhiling(false);//暂停查询指令
        // 使用SwingWorker在后台执行,避免阻塞UI
        SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
            @Override
            protected Void doInBackground() throws Exception {
                // 遍历所有卡槽(1-60)
                for (int slotId = 1; slotId <= 60; slotId++) {
                    try {
                        // 生成开门指令
                        String command = OpenDoor.openOneDoor(slotId, type);
                        // 发送串口指令
                        boolean sent = Sendmsg.sendMessage(command);
                        if (!sent) {
                            Errlog.logOperation("发送指令到卡槽 " + slotId + " 失败");
                        }
                        // 间隔100ms
                        Thread.sleep(100);
                    } catch (Exception e) {
                        Errlog.logOperation("处理卡槽 " + slotId + " 时发生错误: " + e.getMessage());
                        e.printStackTrace();
                    }
                }
                return null;
            }
            @Override
            protected void done() {
                // 可选:完成后可以添加回调处理
                System.out.println("全部卡槽开门指令发送完成");
                String types="管理员";
                if(type==1) {
                   types="服务器指令";
                }
                String message=types+"已将全部卡槽已经打开请取卡";
                Dingshidialog.showTimedDialog(null,5,message);
                Charulog.logOperation(message);
            }
        };
        worker.execute();
        lunxun.setSendChaxunzhiling(true);//开始查询指令
    }
    
    /**
     * 设置串口服务实例
@@ -39,12 +120,12 @@
     */
    public static boolean sendMessage(String message) {
        if (!isPortOpen || serialService == null) {
            System.err.println("[" + getCurrentTime() + "] 串口未打开,无法发送数据");
            Errlog.logOperation("[" + getCurrentTime() + "] 串口未打开,无法发送数据");
            return false;
        }
        
        if (message == null || message.trim().isEmpty()) {
            System.err.println("[" + getCurrentTime() + "] 发送数据为空");
            Errlog.logOperation("[" + getCurrentTime() + "] 发送数据为空");
            return false;
        }
        
@@ -56,7 +137,7 @@
            try {
                byte[] data = hexStringToByteArray(text);
                if (data == null) {
                    System.err.println("[" + getCurrentTime() + "] HEX转换失败,数据: " + text);
                    Errlog.logOperation("[" + getCurrentTime() + "] HEX转换失败,数据: " + text);
                    return false;
                }
                
@@ -70,7 +151,7 @@
                } else {
                    retryCount++;
                    if (retryCount <= MAX_RETRY) {
                        System.err.println("[" + getCurrentTime() + "] 发送失败,正在重试 (" + retryCount + "/" + MAX_RETRY + ")");
                        Errlog.logOperation("[" + getCurrentTime() + "] 发送失败,正在重试 (" + retryCount + "/" + MAX_RETRY + ")");
                        try {
                            Thread.sleep(50); // 重试前等待
                        } catch (InterruptedException e) {
@@ -78,16 +159,16 @@
                            break;
                        }
                    } else {
                        System.err.println("[" + getCurrentTime() + "] 串口发送失败,指令: " + text.toUpperCase());
                        System.err.println("[" + getCurrentTime() + "] 串口状态 - 打开: " + isPortOpen + ", 服务: " + (serialService != null));
                        Errlog.logOperation("[" + getCurrentTime() + "] 串口发送失败,指令: " + text.toUpperCase());
                        Errlog.logOperation("[" + getCurrentTime() + "] 串口状态 - 打开: " + isPortOpen + ", 服务: " + (serialService != null));
                        if (serialService != null) {
                            System.err.println("[" + getCurrentTime() + "] 串口服务状态 - 是否打开: " + serialService.isOpen());
                            Errlog.logOperation("[" + getCurrentTime() + "] 串口服务状态 - 是否打开: " + serialService.isOpen());
                        }
                        return false;
                    }
                }
            } catch (Exception e) {
                System.err.println("[" + getCurrentTime() + "] 发送异常,指令: " + text.toUpperCase());
                Errlog.logOperation("[" + getCurrentTime() + "] 发送异常,指令: " + text.toUpperCase());
                e.printStackTrace();
                return false;
            }
@@ -103,7 +184,7 @@
    public static boolean isPortOpen() {
        boolean open = isPortOpen && serialService != null;
        if (!open && DEBUG_MODE) {
            System.err.println("[" + getCurrentTime() + "] 串口状态检查: 未打开");
            Errlog.logOperation("[" + getCurrentTime() + "] 串口状态检查: 未打开");
        }
        return open;
    }