大华摄像头,通过java sdk调用摄像头移动侦测报警监听,一共1百多个摄像头,通过线程池创建线程达到一百多摄像头同时监听报警的功能,但是出现了问题,有几个摄像头有人经过,摄像头报警,但是不通过回调函数返回给我数据,不知道什么原因,是因为线程冲突吗?还是sdk本身线程不够?
static AlarmServiceImpl cbMessage = new AlarmServiceImpl();
private static final ThreadPoolExecutor threadpool = new ThreadPoolExecutor(500, 1001,
15L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
/**
* 登录摄像头
*/
@PostConstruct
public void startTask() {
List<CameraData> list = cameraDataService.selectCameraDataList(cameraData);
init(disConnect, haveReConnect);
for (int i = 0; i < list.size(); i++) {
socketCreate(list.get(i).getIp(), list.get(i).getSerialnumber(), list.get(i).getStatus());
}
netsdk.CLIENT_SetDVRMessCallBack(cbMessage, null);
}
static class Dahua implements Runnable {
static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
// 设备信息
public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
// 登陆句柄
public static NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);
private static boolean bInit = false;
private static boolean bLogopen = false;
String ip = "";
String serialnumber = "";
String status = "";
public Dahua(String ip, String serialnumber, String status) {
this.ip = ip;
this.serialnumber = serialnumber;
this.status = status;
}
public static boolean login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) {
//IntByReference nError = new IntByReference(0);
//入参
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam=new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
pstInParam.nPort=m_nPort;
pstInParam.szIP=m_strIp.getBytes();
pstInParam.szPassword=m_strPassword.getBytes();
pstInParam.szUserName=m_strUser.getBytes();
//出参
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam=new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
pstOutParam.stuDeviceInfo=m_stDeviceInfo;
//m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
m_hLoginHandle=netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
if(m_hLoginHandle.longValue() == 0) {
System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIp, m_nPort, ToolKits.getErrorCodePrint());
} else {
log.info("Login Success [ " + m_strIp + " ]");
}
return m_hLoginHandle.longValue() == 0? false:true;
}
@SneakyThrows
@Override
public void run() {
try {
if (login(ip, 37777, "admin", "qwer")) {
Map<String, NetSDKLib.LLong> map = new HashMap<>();
map.put(ip,m_hLoginHandle);
log.info(ip + ":监听开始:" + netsdk.CLIENT_StartListenEx(m_hLoginHandle));
} else {
throw new Exception("终止!");
}
} catch (Exception e) {
log.info("终止");
}
}
}