| | |
| | | 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; |
| | |
| | | */ |
| | | 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(); |
| | |
| | | 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; //升级文件数据 |
| | | |
| | |
| | | mInputStream = mSerialPort.getInputStream(); |
| | | mOutputStream = mSerialPort.getOutputStream(); |
| | | bOpenSuccess = true; |
| | | startHDLThread(); |
| | | |
| | | if (HDLSerialPortCore.getIsModule()) {//带模组,走标准串口 |
| | | startHDLThread(); |
| | | } else {//不带模组,走透传 |
| | | SerialPortSendAndReceiveUtil.getInstance().start(); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | bOpenSuccess = false; |
| | |
| | | * 启动串口 发送和接收线程 |
| | | */ |
| | | 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("接收线程 关闭"); |
| | | // } |
| | | // } |
| | | |
| | | /** |
| | | * 串口接收线程 |
| | |
| | | mReceiveDatasList.add(buffer[i]); |
| | | } |
| | | |
| | | |
| | | while (0 < mReceiveDatasList.size()) { |
| | | // HDLLog.I("arraylist.size():" + mReceiveDatasList.size()); |
| | | if (mReceiveDatasList.size() < 3) break;//2019-07-02 |
| | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (len == -1 || mReceiveDatasList.size() < len) break; |
| | | // HDLLog.I("startIndex:" + startIndex + " LEN:" + len); |
| | | for (int i = 0; i < startIndex; i++) { |
| | |
| | | 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接收线程 关闭"); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | /** |
| | | * 串口发送线程 |
| | |
| | | } |
| | | } |
| | | |
| | | // /** |
| | | public static Boolean getIsModule() { |
| | | return isModule; |
| | | } |
| | | |
| | | public static void setIsModule(Boolean isModule) { |
| | | HDLSerialPortCore.isModule = isModule; |
| | | } |
| | | |
| | | // /** |
| | | // * 发送MUC串口协议数据包 |
| | | // * @param mcuDataList |
| | | // * @param bPassThrough 是否为透传 |
| | |
| | | * |
| | | * @param receiveBytes |
| | | */ |
| | | private synchronized static void HandleHDLdata(byte[] receiveBytes) { |
| | | public synchronized static void HandleHDLdata(byte[] receiveBytes) { |
| | | if (receiveBytes.length < 14) { |
| | | return; |
| | | } |
| | |
| | | // HDLLog.I("checkCRC:检验失败"); |
| | | return; |
| | | } |
| | | |
| | | //操作码 |
| | | int command = (receiveBytes[7] & 0xFF) * 256 + (receiveBytes[8] & 0xFF); |
| | | |
| | | //数据长度 |
| | | int addDataLength = (receiveBytes[2] & 0xFF) - 11; |
| | | //附加数据 |
| | |
| | | //复制附加数据 |
| | | System.arraycopy(receiveBytes, 11, usefulBytes, 0, addDataLength); |
| | | |
| | | //操作码 |
| | | int command = (receiveBytes[7] & 0xFF) * 256 + (receiveBytes[8] & 0xFF); |
| | | //源子网号 |
| | | int sourceSubnetID = receiveBytes[3] & 0xFF; |
| | | //源设备号 |
| | |
| | | * |
| | | * @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 |
| | |
| | | } |
| | | } 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 新增通用开关**/ |
| | |
| | | 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: |
| | |
| | | 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) |