Browse Source

현관 안면인식 문열림 요청 처리.

jslee(madeinlab) 3 years ago
parent
commit
faf3a4207b

+ 1 - 0
WallPadMain/build.gradle

@@ -92,5 +92,6 @@ dependencies {
     implementation files('libs/WallPadSupport.jar')
     implementation 'com.github.bumptech.glide:glide:4.9.0'
     implementation 'com.google.code.gson:gson:2.8.5'
+    implementation files('libs/EasyModbusJava.jar')
 //    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'
 }

BIN
WallPadMain/libs/EasyModbusJava.jar


+ 73 - 0
WallPadMain/src/main/java/kr/co/icontrols/wallpadmain/util/iMapServer.java

@@ -23,6 +23,7 @@ import android.os.Message;
 import android.os.Messenger;
 import android.os.PowerManager;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.provider.Settings;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -111,6 +112,8 @@ import javax.net.ssl.SSLServerSocket;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import de.re.easymodbus.exceptions.ModbusException;
+import de.re.easymodbus.modbusclient.ModbusClient;
 import kr.co.icontrols.gledeviceinterface.jni;
 import kr.co.icontrols.hdcftp.HDCFTPManager;
 import kr.co.icontrols.sslapi.SSLClient;
@@ -3425,6 +3428,11 @@ public class iMapServer extends Service {
                             Common.SendAppFinishReqBR(getApplicationContext());
                         }
                         //~add KSJ
+                        //add 2022.03.02 front_open msg 추가 (현관에서 문열림 요청)
+                        else if (cmd.equals("front_open")) {
+                            retXML = ProcFrontOpen();
+                        }
+                        //~add
                         else if (cmd.equalsIgnoreCase("remote_get_home_devices")) {
                             retXML = iCMDProcDevList(doc);
                         } else if (cmd.equalsIgnoreCase("remote_access_gas")) {
@@ -12583,6 +12591,71 @@ public class iMapServer extends Service {
         }
     }
 
+    /**
+     * 현관 열림 명령을 내린다.
+     *
+     * @return (String) - > success : 성공, fail : 실패
+     */
+    private String Device_DoorOpen(final int address) {
+        Log.i(TAG, "[Device_DoorOpen] - Start");
+        final ModbusClient modbusClient = new ModbusClient("10.0.215.2", 502);
+        modbusClient.setConnectionTimeout(5000);
+        try {
+            new Thread() {
+                public void run() {
+                    try {
+                        modbusClient.Connect();
+                        modbusClient.WriteSingleCoil(address, true);
+                        Thread.sleep(600);
+                        modbusClient.WriteSingleCoil(address, false);
+                        modbusClient.Disconnect();
+                    } catch (IOException | ModbusException | InterruptedException e) {
+                        e.printStackTrace();
+                        try {
+                            modbusClient.Disconnect();
+                        } catch (IOException ioException) {
+                            ioException.printStackTrace();
+                        }
+                    }
+
+                }
+            }.start();
+
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return "fail";
+        } catch (Exception e) {
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return "fail";
+        }
+
+        Log.i(TAG, "[Device_DoorOpen] - OK");
+        return "ok";
+    }
+
+    /**
+     * 현관 문열림 요청에 대한 응답
+     * @return String 타입의 응답 메시지 생성
+     **/
+    private long mLastClickTime = 0;
+    private final long MIN_CLICK_INTERVAL = 3000;
+    public String ProcFrontOpen() {
+        String oepn_result;
+        long currentClickTime = SystemClock.uptimeMillis();
+        long elapsedTime = currentClickTime - mLastClickTime;
+        mLastClickTime = currentClickTime;
+        // 연속으로 문열림 요청이 들어오는 경우를 방지하기 위한 처리. 3초안에 문열림 요청이 다시 들어오면 무시하고, fail 처리함.
+        if (elapsedTime < MIN_CLICK_INTERVAL) {
+            mLastClickTime = 0;
+            oepn_result = "fail";
+        }else{
+            oepn_result = Device_DoorOpen(19);
+        }
+        String retXML = XMLHeader + "<service type=\"reply\" name=\"front_open\" result=\"" + oepn_result + "\">\r\n    <message>\"null\"</message>\r\n</service>\r\n</imap>\r\n";
+        return retXML;
+    }
+
     // 메인 서버 소켓 클래스
     public class iMapSverReload extends Thread {
         ServerSocket svr;