package com.basic.security.utils.socket.indoor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.SystemClock; import android.text.TextUtils; import android.widget.ImageView; import com.basic.security.activity.MainActivity; import com.basic.security.base.BaseApplication; import com.basic.security.manager.RemoteOutdoorManager; import com.basic.security.manager.SettingManager; import com.basic.security.model.GuestMessage; import com.basic.security.model.ModelAdapter; import com.basic.security.model.RemoteCameraMessage; import com.basic.security.utils.Constants; import com.basic.security.utils.FragmentUtil; import com.basic.security.utils.SocketUtil; import com.basic.security.utils.socket.BitmapListener; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.net.NoRouteToHostException; import java.util.HashMap; import java.util.List; import java.util.Map; public class IndoorGuestSocketClient extends Thread { public String serverIp; public ImageView cameraBitmap; public int guestListCameraType; public ModelAdapter outdoor; public long lastUpdateTime; public IndoorGuestSocketClient(String serverIp, ImageView cameraBitmap, int guestListCameraType) { this.serverIp = serverIp; this.cameraBitmap = cameraBitmap; this.guestListCameraType = guestListCameraType; } public void run() { lastUpdateTime = System.currentTimeMillis(); boolean reConnectSocket; SocketUtil socketUtil = new SocketUtil(); while (true) { // System1.out.println("GuestSocketClient.run 1"); try { lastUpdateTime = System.currentTimeMillis(); reConnectSocket = false; try { String outdoorServerIp = ""; List outdoorDeviceIpList = RemoteOutdoorManager.getOutdoorDeviceIp(); // System1.out.println("IndoorGuestSocketClient.run outdoorDeviceIpList="+outdoorDeviceIpList); if (outdoorDeviceIpList.size() > 0) { outdoorServerIp = outdoorDeviceIpList.get(0); } if (TextUtils.isEmpty(outdoorServerIp)) { SystemClock.sleep(1000); continue; } serverIp = outdoorServerIp; // System1.out.println("IndoorGuestSocketClient.run serverIp="+serverIp); } catch (Exception e) { System1.out.println("GuestSocketClient.run 1 " + e.getMessage()); SystemClock.sleep(1000); continue; } socketUtil.openSocket(serverIp, Constants.guestServerPort); while (!reConnectSocket) { lastUpdateTime = System.currentTimeMillis(); if (socketUtil.readBitmapHeader()) { socketUtil.setBitmapListener(new BitmapListener() { public void onBitmap(Bitmap image) { try { MainActivity activity = BaseApplication.getApplication().activity; activity.runOnUiThread(() -> { try { // System1.out.println("IndoorGuestSocketClient.onBitmap "); activity.fragment_camera.camera2.setImageBitmap(image); // FragmentUtil.guestModeFragment().camera1.setImageBitmap(image); } catch (Exception e) { e.printStackTrace(); } }); } catch (Exception e) { e.printStackTrace(); } } public void detectFace(Map faceListMap, byte[] nv21Array, int width, int height, Bitmap image, byte[] featureArray) { try { MainActivity activity = BaseApplication.getApplication().activity; if (activity.currentFragment == activity.fragment_guest_mode) { String facePositionsJson = (String) faceListMap.get(GuestMessage.facePositions); Type listType = new TypeToken>>() { }.getType(); List> faces = new Gson().fromJson(facePositionsJson, listType); // System1.out.println("IndoorGuestSocketClient.detectFace " + faces + " " + guestListCameraType + " facePositionsJson="+facePositionsJson); FragmentUtil.guestModeFragment().addGuestList(faces, guestListCameraType, image, featureArray); } } catch (Exception e) { e.printStackTrace(); } } }); while (!Thread.currentThread().isInterrupted() && !reConnectSocket) { // System1.out.println("GuestSocketClient.run 6"); lastUpdateTime = System.currentTimeMillis(); Map requestMap = new HashMap<>(); requestMap.put(RemoteCameraMessage.requestFrame, BaseApplication.getApplication().activity.requestFrame()); requestMap.put(RemoteCameraMessage.transferVideo, SettingManager.getTransferVideo()); socketUtil.writeMap(requestMap); Map map = socketUtil.readMap(); if (Constants.TRUE.equals(map.get(RemoteCameraMessage.hasFrameData))) { String facePositions = (String) map.get(GuestMessage.facePositions); int featureLength = Integer.parseInt((String) map.get(GuestMessage.featureLength)); int frameJpgLength = Integer.parseInt((String) map.get(GuestMessage.frameJpgLength)); boolean hasFaces = false; if (facePositions != null && !"".equals(facePositions)) { hasFaces = true; } byte[] featureArray = null; if (featureLength > 0) { featureArray = new byte[featureLength]; socketUtil.readFullByteArray(featureArray); } String frameJpgOrYuv = (String) map.get(GuestMessage.frameJpgOrYuv); if (GuestMessage.JPG.equals(frameJpgOrYuv)) { if (frameJpgLength > 0) { socketUtil.readFullByteArray(socketUtil.imageBuff, frameJpgLength); Bitmap frameBitmap = BitmapFactory.decodeByteArray(socketUtil.imageBuff, 0, frameJpgLength); if (frameBitmap != null) { if (!hasFaces) { socketUtil.cameraDataListener.onBitmap(frameBitmap); } socketUtil.cameraDataListener.detectFace(map, null, frameBitmap.getWidth(), frameBitmap.getHeight(), frameBitmap, featureArray); } } } else { socketUtil.readFullByteArray(socketUtil.imageBuff); socketUtil.mBufferManager.fillBuffer1(map, socketUtil.imageBuff, socketUtil.imageBuff.length, hasFaces); } } if (Constants.TRUE.equals(SettingManager.getTransferVideo())) { SystemClock.sleep(40); } else { SystemClock.sleep(500); } } } else { SystemClock.sleep(2000); } } } catch (Exception e) { if (e instanceof NoRouteToHostException) { } else { System1.out.println("GuestSocketClient.run 3 " + e.getMessage()); } SystemClock.sleep(3000); } finally { socketUtil.close(); } } } }