panlili2024
2024-09-19 071a8328823a2861f93ce556a4da3e4119cab1a3
HDL_TTLSDK485/src/main/java/com/hdl/sdk/ttl/HDLDeviceManger/Core/HDLSerialPortCore.java
@@ -9,6 +9,7 @@
import com.hdl.sdk.ttl.Config.Configuration;
import com.hdl.sdk.ttl.HDLDeviceManger.Bean.UdpDataBean;
import com.hdl.sdk.ttl.HDLDeviceManger.HDLListener.IMcuOtaListener;
import com.hdl.sdk.ttl.Utils.HDLUtlis.SerialPortSendAndReceiveUtil;
import com.hdl.sdk.ttl.Utils.LogUtils.HDLLog;
import java.io.File;
@@ -25,14 +26,14 @@
 */
public class HDLSerialPortCore {
    //串口设备路径名
    private static String mPathname = "/dev/ttyS2";
    private static String mPathname = "/dev/ttyS4";
    //波特率
    private static int mBaudrate = 115200;
    //    public static SerialPortFinder mSerialPortFinder = new SerialPortFinder();
    private static SerialPort mSerialPort = null;
    private static InputStream mInputStream = null;
    private static OutputStream mOutputStream = null;
    public static SerialPort mSerialPort = null;
    public static InputStream mInputStream = null;
    public static OutputStream mOutputStream = null;
    //    private static HDLReadDatasThread mHDLReadDatasThread = new HDLReadDatasThread();
    //    private static HDLRead485DatasThread mHDLRead485DatasThread = new HDLRead485DatasThread();
@@ -43,7 +44,7 @@
    private static List<Byte> mReceiveDatasList = new ArrayList<Byte>();//接收数据队列
//    private static List<Byte> mReceive485DatasList = new ArrayList<Byte>();//485接收数据队列
    public static Boolean bPassThrough = false; //判断是否透传
    public static Boolean isModule = false; //判断是否带模组
    public static IMcuOtaListener mIMcuOtaListener;
    public static byte[] upgradeFileDatas;      //升级文件数据
@@ -94,7 +95,12 @@
                mInputStream = mSerialPort.getInputStream();
                mOutputStream = mSerialPort.getOutputStream();
                bOpenSuccess = true;
                startHDLThread();
                if (HDLSerialPortCore.getIsModule()) {//带模组,走标准串口
                    startHDLThread();
                } else {//不带模组,走透传
                    SerialPortSendAndReceiveUtil.getInstance().start();
                }
            } catch (IOException e) {
                e.printStackTrace();
                bOpenSuccess = false;
@@ -148,74 +154,11 @@
     * 启动串口 发送和接收线程
     */
    private static void startHDLThread() {
//        mHDLRead485DatasThread = new HDLRead485DatasThread();
        mHDLReadMCUDatasThread = new HDLReadMCUDatasThread();
        mHDLSendDatasThread = new HDLSendDatasThread();
//        mHDLRead485DatasThread.start();
        mHDLReadMCUDatasThread.start();
        mHDLSendDatasThread.start();
    }
//
//    /**
//     * 串口接收线程
//     *
//     * @author 2019年06月26日
//     */
//    private static class HDLReadDatasThread extends Thread {
//
//        @Override
//        public void run() {
//            super.run();
//            HDLLog.I("接收线程 开启");
//
//            while (bOpenSuccess) {
//                int size = 0;
//                try {
//                    if (mInputStream == null) return;
//
//                    byte[] buffer = new byte[64];
//                    size = mInputStream.read(buffer);
//                    for (int i = 0; i < size; i++) {
//                        mReceiveDatasList.add(buffer[i]);
//                    }
//
//                    while (0 < mReceiveDatasList.size()) {
//                        HDLLog.I("arraylist.size():" + mReceiveDatasList.size());
//                        if (mReceiveDatasList.size() < 3) break;//2019-07-02
//                        int len = -1;
//                        int startIndex = 0;
//                        for (startIndex = 0; startIndex < mReceiveDatasList.size(); startIndex++) {
//                            if ((mReceiveDatasList.get(startIndex) & 0xFF) == 0xAA
//                                    && (mReceiveDatasList.get(startIndex + 1) & 0xFF) == 0xAA) {
//                                len = (mReceiveDatasList.get(startIndex + 2) & 0xFF) + 2;//发现len会出现负数增加 & 0xFF 运算
//                                break;
//                            }
//                        }
//                        if (len == -1 || mReceiveDatasList.size() < len) break;
//
//                        HDLLog.I("startIndex:" + startIndex + "   LEN:" + len);
//                        for (int i = 0; i < startIndex; i++) {
//                            if (mReceiveDatasList.size() < 1) break;//2019-07-02
//                            mReceiveDatasList.remove(0);
//                        }
//                        byte[] tempBytes = new byte[len];
//                        for (int i = 0; i < tempBytes.length; i++) {
//                            if (mReceiveDatasList.size() < 1) break;//2019-07-02
//
//                            tempBytes[i] = mReceiveDatasList.get(0);
//                            mReceiveDatasList.remove(0);
//                        }
//                        HandleHDLdata(tempBytes);
//                    }
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    HDLLog.I("error:" + e.getMessage());
//                }
//            }
//            HDLLog.I("接收线程 关闭");
//        }
//    }
    /**
     * 串口接收线程
@@ -244,6 +187,7 @@
                        mReceiveDatasList.add(buffer[i]);
                    }
                    while (0 < mReceiveDatasList.size()) {
//                        HDLLog.I("arraylist.size():" + mReceiveDatasList.size());
                        if (mReceiveDatasList.size() < 3) break;//2019-07-02
@@ -262,7 +206,6 @@
                                break;
                            }
                        }
                        if (len == -1 || mReceiveDatasList.size() < len) break;
//                        HDLLog.I("startIndex:" + startIndex + "   LEN:" + len);
                        for (int i = 0; i < startIndex; i++) {
@@ -288,63 +231,6 @@
            HDLLog.I("接收线程 关闭");
        }
    }
//    /**
//     * 485数据接收线程
//     *
//     * @author 2019年06月26日
//     */
//    private static class HDLRead485DatasThread extends Thread {
//
//        @Override
//        public void run() {
//            super.run();
//            HDLLog.I("485接收线程 开启");
//            while (bOpenSuccess) {
//                int size = 0;
//                try {
//                    Thread.sleep(10);
//                    while (0 < mReceive485DatasList.size()) {
////                        HDLLog.I("485arraylist.size():" + mReceive485DatasList.size());
//                        if (mReceive485DatasList.size() < 3) break;//2019-07-02
//                        if (mReceive485DatasList.size() > 500) { //数据缓存太多错误情况下 清空一次
//                            mReceive485DatasList.clear();
//                            break;//2019-07-24
//                        }
//                        int len = -1;
//                        int startIndex = 0;
//                        for (startIndex = 0; startIndex < mReceive485DatasList.size(); startIndex++) {
//                            if ((mReceive485DatasList.get(startIndex) & 0xFF) == 0xAA
//                                    && (mReceive485DatasList.get(startIndex + 1) & 0xFF) == 0xAA) {
//                                len = (mReceive485DatasList.get(startIndex + 2) & 0xFF) + 2;//发现len会出现负数增加 & 0xFF 运算
//                                break;
//                            }
//                        }
//                        if (len == -1 || mReceive485DatasList.size() < len) break;
//
////                        HDLLog.I("startIndex:" + startIndex + "   LEN:" + len);
//                        for (int i = 0; i < startIndex; i++) {
//                            if (mReceive485DatasList.size() < 1) break;//2019-07-02
//                            mReceive485DatasList.remove(0);
//                        }
//                        byte[] tempBytes = new byte[len];
//                        for (int i = 0; i < tempBytes.length; i++) {
//                            if (mReceive485DatasList.size() < 1) break;//2019-07-02
//
//                            tempBytes[i] = mReceive485DatasList.get(0);
//                            mReceive485DatasList.remove(0);
//                        }
//                        HandleHDLdata(tempBytes);
//                    }
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    HDLLog.I("error:" + e.getMessage());
//                }
//            }
//            HDLLog.I("485接收线程 关闭");
//        }
//    }
    /**
     * 串口发送线程
@@ -387,7 +273,15 @@
        }
    }
//    /**
    public static Boolean getIsModule() {
        return isModule;
    }
    public static void setIsModule(Boolean isModule) {
        HDLSerialPortCore.isModule = isModule;
    }
    //    /**
//     * 发送MUC串口协议数据包
//     * @param mcuDataList
//     * @param bPassThrough 是否为透传
@@ -460,7 +354,7 @@
     *
     * @param receiveBytes
     */
    private synchronized static void HandleHDLdata(byte[] receiveBytes) {
    public synchronized static void HandleHDLdata(byte[] receiveBytes) {
        if (receiveBytes.length < 14) {
            return;
        }
@@ -470,6 +364,10 @@
//            HDLLog.I("checkCRC:检验失败");
            return;
        }
        //操作码
        int command = (receiveBytes[7] & 0xFF) * 256 + (receiveBytes[8] & 0xFF);
        //数据长度
        int addDataLength = (receiveBytes[2] & 0xFF) - 11;
        //附加数据
@@ -477,8 +375,6 @@
        //复制附加数据
        System.arraycopy(receiveBytes, 11, usefulBytes, 0, addDataLength);
        //操作码
        int command = (receiveBytes[7] & 0xFF) * 256 + (receiveBytes[8] & 0xFF);
        //源子网号
        int sourceSubnetID = receiveBytes[3] & 0xFF;
        //源设备号
@@ -512,9 +408,9 @@
     *
     * @param sendDatas
     */
    private static void HandleInsideData(UdpDataBean sendDatas) {
    public static void HandleInsideData(UdpDataBean sendDatas) {
        switch (sendDatas.command) {
            case Configuration.DEVICES_SEARCH_BACK_COMMAND:
            case Configuration.DEVICES_SEARCH_FROM_GATEWAY_BACK_COMMAND:
//                先判断搜索模式,家居搜索则只需要判断两个随机数。酒店搜索则需要判断两个随机数和ip地址
                if (HandleSearch.curSearchMode == HandleSearch.GET_BUS_DEVICES) {
                    if (sendDatas.addBytes[0] == HandleSearch.random1
@@ -523,12 +419,10 @@
                    }
                } else {
                    if (sendDatas.addBytes[0] == HandleSearch.random1
                            && sendDatas.addBytes[1] == HandleSearch.random2
                    ) {
                            && sendDatas.addBytes[1] == HandleSearch.random2) {
                        HDLDeviceManager.handle(sendDatas, sendDatas.command);
                    }
                }
                break;
            /***2020-04-01 新增通用开关**/
@@ -552,7 +446,7 @@
            case Configuration.AIR_HVAC_STATE_BACK_COMMAND:
//            case Configuration.RCU_ROOM_CAST_COMMAND:
//            case Configuration.RCU_CURTAIN_CAST_COMMAND:
            case Configuration.DEVICES_READ_BACK_COMMAND://读取备注命令
            case Configuration.DEVICES_READ_FROM_GATEWAY_BACK_COMMAND://读取备注命令
            case Configuration.DEVICES_MODIFY_BACK_COMMAND://修改基本信息回复
            case Configuration.MODULE_UPDATE_REMARK_BACK_COMMAND://修改模块备注回复
            case Configuration.WARNING_COMMAND:
@@ -574,29 +468,10 @@
            case Configuration.DOOR_MACHINE_MODULE_CTRL_BACK_COMMAND://2023-08-22 新增 门锁
            case Configuration.DOOR_MACHINE_MODULE_STATE_BACK_COMMAND://2023-08-22 新增 门锁
            case Configuration.DOOR_MACHINE_BROADCAST_STATE_BACK_COMMAND://2023-08-25 新增门锁状态和报警广播
            case Configuration.SCENE_SEARCH_FROM_GATEWAY_BACK_COMMAND:
            case Configuration.SCENE_READ_FROM_GATEWAY_BACK_COMMAND:
                HDLDeviceManager.handle(sendDatas, sendDatas.command);
                break;
//            case Configuration.RCU_SEARCH_COMMAND:
////                if (sendDatas.port == Configuration.RCU_SEND_PORT) {
//                    HDLLog.I( "收到搜索RCU命令");
//                    HDLDeviceManager.handle(sendDatas, sendDatas.command);
////                }
//
//                break;
//            case Configuration.RCU_READ_SDK_INFO_COMMAND:
////                if (sendDatas.desSubnetID == Crc.localSubnetID && sendDatas.desDeviceID == Crc.localDeviceID
////                        ) {
////                    HDLLog.I( "E508收到");
////                    HDLDeviceManager.handle(sendDatas, Configuration.RCU_READ);
////                }
////                if (sendDatas.port == Configuration.RCU_SEND_PORT) {
//                    HDLLog.I( "收到读取SDK信息命令");
//                    HDLDeviceManager.handle(sendDatas, sendDatas.command);
////                }
//                break;
            case Configuration.MANUAL_ADD_DEVICE_COMMAND:
                //固定随机数181、250
                if (sendDatas.addBytes[0] == ((byte) 181)