ElectLock_Monitor/src/com/dev/lock/comm/Lock_SocketClient_Thread.java
@@ -7,6 +7,7 @@
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Date;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -16,6 +17,7 @@
import com.base.Crc16;
import com.config.AppConfig;
import com.dev.lock.data.ElectLock_Array;
import com.dev.lock.data.ElectLock_AuthIdcard;
import com.dev.lock.data.ElectLock_ComBase;
import com.dev.lock.data.ElectLock_Inf;
import com.dev.lock.data.ElectLock_State;
@@ -34,7 +36,7 @@
   private ElectLock_State mLock_param;
   
   private String client_ip;         //客户端IP地址
   private int client_id;            //客户端ID
   private int client_id;            //客户端ID-锁具ID
   
   private MyModBusRtu mRtu_Tx;      //发送数据
   private MyModBusRtu mRtu_Rx;      //返回数据
@@ -46,6 +48,8 @@
   private ByteBuffer bytebuffer_for_socket_RX = ByteBuffer.allocate(15000);
   
   private boolean S_thread_run_flag = true;
   private int plat_model;
   
   public Lock_SocketClient_Thread(MysqlConnPool pool,ElectLock_Array GB_Lock_Array ,AppConfig config,Socket tmp_socket) {
      this.pool = pool;
@@ -68,6 +72,7 @@
      int runCount = 0;
      try {
         if(S_thread_run_flag) {
            mLock_State.setLock_online(1);
            Lock_Task_SQL.insertLock_Rt_Table(pool, client_id, mLock_State);
         }
         while(S_thread_run_flag) {
@@ -81,33 +86,36 @@
                  mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_YC, ElectLock_ComBase.LOCK_CLEAR_AUTH_ADDR, ElectLock_ComBase.RegCount_Sigle);
                  if(SocketComm(mRtu_Tx, ComBase.mkUInt16Buffer(ElectLock_ComBase.Control_Value))) {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_ClearIdCard_Ack);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_ClearIdCard, true);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_ClearIdCard, true,0,mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  } else {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_Fail);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_ClearIdCard, false);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_ClearIdCard, false,0,mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  }
               }else if(mLock_param.getOp_cmd() == ElectLock_ComBase.CMD_REMOTE_OPEN_Lock) {
                  mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_YC, ElectLock_ComBase.LOCK_REMOTE_OPEN_ADDR, ElectLock_ComBase.RegCount_Sigle);
                  if(SocketComm(mRtu_Tx, ComBase.mkUInt16Buffer(ElectLock_ComBase.Control_Value))) {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_REMOTE_OPEN_Lock_Ack);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_OPEN_Lock, true);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_OPEN_Lock, true,0,mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  } else {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_Fail);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_OPEN_Lock, false);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_OPEN_Lock, false,0,mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                     //远程开锁失败时,记录一笔开锁失败告警
                     Lock_Task_SQL.insertRemoteOpenFailAlarm(pool, client_id);
                  }
               }else if(mLock_param.getOp_cmd() == ElectLock_ComBase.CMD_REMOTE_ReStart) {
                  mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_YC, ElectLock_ComBase.LOCK_RESTART_ADDR, ElectLock_ComBase.RegCount_Sigle);
                  if(SocketComm(mRtu_Tx, ComBase.mkUInt16Buffer(ElectLock_ComBase.Control_Value))) {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_REMOTE_ReStart_Ack);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_ReStart, true);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_ReStart, true,0,mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  } else {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_Fail);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_ReStart, false);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_REMOTE_ReStart, false,0,mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  }
               }else if(mLock_param.getOp_cmd() == ElectLock_ComBase.CMD_SetLockAddr) {
@@ -115,11 +123,11 @@
                  if(SocketComm(mRtu_Tx, ComBase.mkUInt16Buffer(mLock_param.getLock_addr_set()))) {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_SetLockAddr_Ack);
                     
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_SetLockAddr, true);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_SetLockAddr, true,mLock_param.getLock_addr_set(),mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  } else {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_Fail);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_SetLockAddr, false);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_SetLockAddr, false,mLock_param.getLock_addr_set(),mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  }
               }else if(mLock_param.getOp_cmd() == ElectLock_ComBase.CMD_AddIdCard) {
@@ -128,11 +136,11 @@
                  System.out.println("mLock_param.getId_card_set():"+mLock_param.getId_card_set());
                  if(SocketComm(mRtu_Tx, ComBase.mkInt32Buffer(mLock_param.getId_card_set()))) {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_AddIdCard_Ack);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_AddIdCard, true,mLock_param.getId_card_set());
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_AddIdCard, true,mLock_param.getId_card_set(),mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  } else {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_Fail);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_AddIdCard, false,mLock_param.getId_card_set());
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_AddIdCard, false,mLock_param.getId_card_set(),mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  }
               }else if(mLock_param.getOp_cmd() == ElectLock_ComBase.CMD_RemoveIdCard) {
@@ -140,11 +148,11 @@
                  mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_MULTY, ElectLock_ComBase.LOCK_Clear_ID_AUTH_ADDR, ElectLock_ComBase.RegCount_Double);
                  if(SocketComm(mRtu_Tx, ComBase.mkInt32Buffer(mLock_param.getId_card_set()))) {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_RemoveIdCard_Ack);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_RemoveIdCard, true,mLock_param.getId_card_set());
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_RemoveIdCard, true,mLock_param.getId_card_set(),mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  } else {
                     mLock_param.setOp_cmd(ElectLock_ComBase.CMD_Fail);
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_RemoveIdCard, false,mLock_param.getId_card_set());
                     tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_RemoveIdCard, false,mLock_param.getId_card_set(),mLock_param.getCtl_uname());
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                  }
               }
@@ -159,8 +167,83 @@
               mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_READ_INPUT, ElectLock_ComBase.LOCK_REAL_ADDR, ElectLock_State.Reg_Count_Real);
               if(SocketComm(mRtu_Tx, ByteBuffer.allocate(0))) {
                  Lock_Task_SQL.updateLock_Rt_Table(pool,client_id,mLock_State);
                  Lock_Task_SQL.updateLock_Inf_Table(pool,ele_lock,mLock_State);
                  //更新锁具状态
                  ele_lock.lockRecordState.setLockState(mLock_State);
                  if(mLock_State.isIDOpen()) {
                     String ctl_uname = Lock_Task_SQL.queryKeyInfByKeyNumberTable(pool,mLock_State.getLast_unlock_id());
                     ElectLock_Ctl_Log tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_IDCardOpen, true,mLock_State.getLast_unlock_id(),ctl_uname);
                     Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                     mLock_State.setIDOpen(false);
                     tmp_log = null;
                  }
                  plat_model =  Lock_Task_SQL.querySystemLockMode(pool);
                  if(plat_model != ElectLock_ComBase.CMD_Fail) {
                     if(plat_model != mLock_State.getWorkmodel()) {
                        logger.info("LockID:"+client_id + " Start change Model :");
                        mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_STD, ElectLock_ComBase.LOCK_SET_Model_ADDR, ElectLock_ComBase.RegCount_Sigle);
                        if(SocketComm(mRtu_Tx, ComBase.mkUInt16Buffer(plat_model))) {
                           //远程设置锁具在离线模式后最多重启设备3次
                           for(int k = 0 ;k < 3;k++) {
                              mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_YC, ElectLock_ComBase.LOCK_RESTART_ADDR, ElectLock_ComBase.RegCount_Sigle);
                              if(SocketComm(mRtu_Tx, ComBase.mkUInt16Buffer(ElectLock_ComBase.Control_Value))) {
                                 //重启锁具成功
                                 break;
                              }
                           }
                           Thread.sleep(1000);
                        }
                     }
                  }
               }
            }
            List<ElectLock_AuthIdcard> batch_auth = Lock_Task_SQL.queryAuth_Idcard_Table(pool,client_id);
            if(batch_auth.size() > 0) {
               logger.info("开始批量授权ID卡,ID数量:" + batch_auth.size());
               for(int k = 0; k < batch_auth.size() ; k++) {
                  ElectLock_AuthIdcard tmp_auth = batch_auth.get(k);
                  ElectLock_Ctl_Log tmp_log = null;
                  try {
                     int keyNumber = Integer.parseInt(tmp_auth.key_number.trim());
                     if(tmp_auth.state == ElectLock_AuthIdcard.AuthType_ReMove) {
                        //取消ID卡授权
                        mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_MULTY, ElectLock_ComBase.LOCK_Clear_ID_AUTH_ADDR, ElectLock_ComBase.RegCount_Double);
                        if(SocketComm(mRtu_Tx, ComBase.mkInt32Buffer(keyNumber))) {
                           tmp_auth.auth_result = ElectLock_ComBase.Auth_Success;
                           tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_RemoveIdCard, true,keyNumber,tmp_auth.ctl_uname);
                           Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                        } else {
                           tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_RemoveIdCard, false,keyNumber,tmp_auth.ctl_uname);
                           Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                        }
                     }else if(tmp_auth.state == ElectLock_AuthIdcard.AuthType_Add) {
                        //添加授权
                        mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_WRITE_MULTY, ElectLock_ComBase.LOCK_Add_ID_AUTH_ADDR, ElectLock_ComBase.RegCount_Double);
                        if(SocketComm(mRtu_Tx, ComBase.mkInt32Buffer(keyNumber))) {
                           tmp_auth.auth_result = ElectLock_ComBase.Auth_Success;
                           tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_AddIdCard, true,keyNumber,tmp_auth.ctl_uname);
                           Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                        } else {
                           tmp_log = new ElectLock_Ctl_Log(client_id, ElectLock_ComBase.CtlType_AddIdCard, false,keyNumber,tmp_auth.ctl_uname);
                           Lock_Task_SQL.insertLock_Ctl_Log_Table(pool, tmp_log);
                        }
                     }
                  } catch (Exception e) {
                     tmp_auth.auth_result = ElectLock_ComBase.Auth_Fail;
                  } finally {
                     tmp_log = null;
                  }
                  Lock_Task_SQL.moveAuth_Idcard_Table(pool, tmp_auth);
               }
            }
            batch_auth = null;
            
            runCount ++;
            if(runCount > 99999900) {
@@ -171,7 +254,9 @@
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         logger.info("设备断开连接:DevIp:" + client_ip + " DevId:" + client_id);
         logger.info("设备断开连接:DevIp:" + client_ip + " DevId:" + mLock_State.getLockDevId());
         mLock_State.setLock_online(0);
         Lock_Task_SQL.updateLock_Inf_Table(pool,ele_lock,mLock_State);
      }
      if(null != tmp_socket) {
@@ -219,7 +304,7 @@
                  if(tmp_lock.getLock_ip().equals(client_ip)) {
                     ele_lock = tmp_lock;
                     mLock_State = ele_lock.lockState;
                     client_id = ele_lock.getId();
                     client_id = ele_lock.getLock_id();
                     mLock_State.setClient_ip(client_ip);
                     isCheckOk = true;
                  }
@@ -228,16 +313,16 @@
               //通过ID号识别锁具
               mRtu_Tx.mkBusRtu(MyModBusRtu.CMD_TYPE_READ_INPUT, ElectLock_ComBase.LOCK_REAL_ADDR, ElectLock_State.Reg_Count_Real);
               if(SocketComm(mRtu_Tx, ByteBuffer.allocate(0))){
                  System.out.println("mLock_State.getLock_addr():"+mLock_State.getLock_addr());
                  //System.err.println(mLock_State);
                  //System.out.println("mLock_State.getLockDevId():"+mLock_State.getLockDevId());
                  
                  for(int m = 0; m < GB_Lock_Array.getIteamCount();m++) {
                     ElectLock_Inf tmp_lock = GB_Lock_Array.getIteam(m);
                     if(tmp_lock.getId() == mLock_State.getLock_addr()) {
                     if(tmp_lock.getLock_id() == mLock_State.getLockDevId()) {
                        
                        ele_lock = tmp_lock;
                        mLock_State = ele_lock.lockState;
                        client_id = ele_lock.getId();
                        client_id = ele_lock.getLock_id();
                        mLock_State.setClient_ip(client_ip);
                        isCheckOk = true;
                     }
@@ -306,7 +391,7 @@
                Date d1 = new Date();
                int rx_read_time_out = 0;
                //int rx_len = 0;
                System.out.println("数据长度" + plain_tx_t.length + "\t发送数据:" + ComFn.bytesToHexString(plain_tx_t, plain_tx_t.length));
                logger.debug("数据长度" + plain_tx_t.length + "\t发送数据:" + ComFn.bytesToHexString(plain_tx_t, plain_tx_t.length));
                out.write(plain_tx_t);
                out.flush();
               
@@ -353,7 +438,7 @@
                bytebuffer_for_socket_RX.get(cipher_buf);
                
                
                System.out.println("数据长度"+cipher_buf.length+"\t返回数据:"+ ComFn.bytesToHexString(cipher_buf, cipher_buf.length));
                logger.debug("数据长度"+cipher_buf.length+"\t返回数据:"+ ComFn.bytesToHexString(cipher_buf, cipher_buf.length));
                //Log.e(TAG, "SocketComm: "+ComFn.bytesToHexString(plain_buf, plain_buf.length));
                if(cipher_buf.length > MyModBusRtu.BYTE_LEN && true == getDataFromCommBuf(cipher_buf,rtu)) {
                   res_t = true; 
@@ -425,7 +510,15 @@
               isSuccess = true;
               logger.info("LockId:" + client_id + " LockIp:"+client_ip + " 设置锁具地址:" + mLock_param.getLock_addr_set() + "成功");
            }
         }else if(ElectLock_ComBase.LOCK_SET_Model_ADDR == mRtu_Rx.reg_addr) {
            //设置锁具工作模式
            if(plat_model == mRtu_Rx.result) {
               isSuccess = true;
               logger.info("LockId:" + client_id + " LockIp:"+client_ip + " 设置锁具模式:" + plat_model + "成功");
            }
         }
      }else if(MyModBusRtu.CMD_TYPE_WRITE_MULTY == mRtu_Rx.Cmd) {
         if(ElectLock_ComBase.LOCK_Add_ID_AUTH_ADDR == mRtu_Rx.reg_addr) {
            //添加授权ID卡