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<String> 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<String, Object> 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<List<Map<String, String>>>() {
|
}.getType();
|
List<Map<String, String>> 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<String, String> requestMap = new HashMap<>();
|
requestMap.put(RemoteCameraMessage.requestFrame, BaseApplication.getApplication().activity.requestFrame());
|
requestMap.put(RemoteCameraMessage.transferVideo, SettingManager.getTransferVideo());
|
socketUtil.writeMap(requestMap);
|
Map<String, Object> 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();
|
}
|
}
|
}
|
}
|