package com.netsdk.demo.customize;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.NetSDKLib.LLong;
|
import com.netsdk.lib.NetSDKLib.NET_IN_ATTACH_VIDEOSTAT_SUM;
|
import com.netsdk.lib.NetSDKLib.NET_OUT_ATTACH_VIDEOSTAT_SUM;
|
import com.netsdk.lib.NetSDKLib.NET_VIDEOSTAT_SUMMARY;
|
import com.netsdk.lib.enumeration.EM_EVENT_IVS_TYPE;
|
import com.netsdk.lib.enumeration.EM_NEW_QUERY_SYSTEM_INFO;
|
import com.netsdk.lib.structure.*;
|
import com.netsdk.lib.utils.Initialization;
|
import com.sun.jna.Memory;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
import java.io.File;
|
import java.io.UnsupportedEncodingException;
|
import java.util.Objects;
|
import java.util.Scanner;
|
|
/**
|
* @author 291189
|
* @version 1.0
|
* @description 智慧养殖猪温检测
|
* @date 2022/3/31 11:19
|
*/
|
public class CustomSnapInfoDemo extends Initialization {
|
int channel = 0;
|
NetSDKLib.LLong attachHandle = new NetSDKLib.LLong(0);
|
|
public void AttachCustomSnapInfo() {
|
NET_IN_ATTACH_CUSTOM_SNAP_INFO input = new NET_IN_ATTACH_CUSTOM_SNAP_INFO();
|
input.nChannelID = channel;
|
input.cbCustomSnapInfo = AttachCustomSnapInfo.getInstance();
|
Pointer inputPoiner = new Memory(input.size());
|
inputPoiner.clear(input.size());
|
ToolKits.SetStructDataToPointer(input, inputPoiner, 0);
|
|
NET_OUT_ATTACH_CUSTOM_SNAP_INFO outPut = new NET_OUT_ATTACH_CUSTOM_SNAP_INFO();
|
Pointer outPointer = new Memory(outPut.size());
|
outPointer.clear(outPut.size());
|
ToolKits.SetStructDataToPointer(outPut, outPointer, 0);
|
|
attachHandle = netSdk.CLIENT_AttachCustomSnapInfo(loginHandle, inputPoiner, outPointer, 3000);
|
if (attachHandle.longValue() == 0) {
|
System.out.printf("Chn[%d] CLIENT_AttachCustomSnapInfo Failed!LastError = %s\n", channel,
|
ToolKits.getErrorCode());
|
} else {
|
System.out.printf("Chn[%d] CLIENT_AttachCustomSnapInfo Success\n", channel);
|
}
|
|
}
|
|
public void DetachCustomSnapInfo() {
|
|
boolean isSuccess = netSdk.CLIENT_DetachCustomSnapInfo(attachHandle);
|
if (isSuccess) {
|
System.out.println(" CLIENT_AttachCustomSnapInfo Success");
|
} else {
|
System.out.printf("Chn[%d] CLIENT_DetachCustomSnapInfo Failed!LastError = %s\n", channel,
|
ToolKits.getErrorCode());
|
|
}
|
|
}
|
|
private static class AttachCustomSnapInfo implements NetSDKLib.fAttachCustomSnapInfo {
|
private final File picturePath;
|
private static AttachCustomSnapInfo instance;
|
|
private AttachCustomSnapInfo() {
|
picturePath = new File("./AnalyzerPicture/");
|
if (!picturePath.exists()) {
|
picturePath.mkdirs();
|
}
|
}
|
|
public static AttachCustomSnapInfo getInstance() {
|
if (instance == null) {
|
synchronized (AttachCustomSnapInfo.class) {
|
if (instance == null) {
|
instance = new AttachCustomSnapInfo();
|
}
|
}
|
}
|
return instance;
|
}
|
|
@Override
|
public void invoke(NetSDKLib.LLong lAttachHandle, Pointer pstResult, Pointer pBuf, int dwBufSize,
|
Pointer dwUser) {
|
|
System.out.println("lAttachHandle:" + lAttachHandle);
|
// 图片文件订阅回调信息
|
NET_CB_CUSTOM_SNAP_INFO info = new NET_CB_CUSTOM_SNAP_INFO();
|
ToolKits.GetPointerData(pstResult, info);
|
int nChannelID = info.nChannelID;
|
System.out.println("nChannelID:" + nChannelID);
|
|
NET_TIME stuSnapTime = info.stuSnapTime;
|
System.out.println("stuSnapTime:" + stuSnapTime);
|
|
int emCustomSnapType = info.emCustomSnapType;
|
if (emCustomSnapType == 0) {
|
System.out.printf("EM_CUSTOM_SNAP_UNKNOWN");
|
} else if (emCustomSnapType == 1) {
|
|
Pointer pDetailInfo = info.pDetailInfo;
|
// 猪体温信息数组
|
NET_PIG_TEMPERATURE_INFO pigInfo = new NET_PIG_TEMPERATURE_INFO();
|
|
ToolKits.GetPointerData(pDetailInfo, pigInfo);
|
|
int nPigNum = pigInfo.nPigNum;
|
System.out.println("nPigNum:" + nPigNum);
|
NET_PIG_TEMPERATURE_DATA[] stuPigInfo = pigInfo.stuPigInfo;
|
for (int i = 0; i < nPigNum; i++) {
|
NET_PIG_TEMPERATURE_DATA pigData = stuPigInfo[i];
|
System.out.println(pigData.toString());
|
|
}
|
}
|
// 图片
|
if (dwBufSize > 0) {
|
String picture = picturePath + "/" + System.currentTimeMillis() + "pig.jpg";
|
ToolKits.savePicture(pBuf, 0, dwBufSize, picture);
|
}
|
|
}
|
}
|
|
/**
|
* 选择通道
|
*/
|
private int channelId = 0;
|
|
public void setChannelID() {
|
System.out.println("请输入通道,从0开始计数,-1表示全部");
|
Scanner sc = new Scanner(System.in);
|
this.channelId = sc.nextInt();
|
}
|
|
// 智能订阅句柄
|
private LLong m_attachHandle = new NetSDKLib.LLong(0);
|
|
/**
|
* 订阅智能任务
|
*/
|
public void AttachEventRealLoadPic() {
|
// 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回
|
this.DetachEventRealLoadPic();
|
// 需要图片
|
int bNeedPicture = 1;
|
m_attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channelId, NetSDKLib.EVENT_IVS_ALL, bNeedPicture,
|
AnalyzerDataCB.getInstance(), null, null);
|
if (m_attachHandle.longValue() != 0) {
|
System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channelId);
|
} else {
|
System.out.printf("Ch[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channelId,
|
ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 报警事件(智能)回调
|
*/
|
private static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
|
private final File picturePath;
|
private static AnalyzerDataCB instance;
|
|
private AnalyzerDataCB() {
|
picturePath = new File("./AnalyzerPicture/");
|
if (!picturePath.exists()) {
|
picturePath.mkdirs();
|
}
|
}
|
|
public static AnalyzerDataCB getInstance() {
|
if (instance == null) {
|
synchronized (AnalyzerDataCB.class) {
|
if (instance == null) {
|
instance = new AnalyzerDataCB();
|
}
|
}
|
}
|
return instance;
|
}
|
|
public int invoke(LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
|
Pointer dwUser, int nSequence, Pointer reserved) {
|
if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) {
|
return -1;
|
}
|
|
switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) {
|
case EVENT_IVS_HEAT_IMAGING_TEMPER: {// 热成像测温点温度异常报警事件 (对应 DEV_EVENT_HEAT_IMAGING_TEMPER_INFO)
|
DEV_EVENT_HEAT_IMAGING_TEMPER_INFO msg = new DEV_EVENT_HEAT_IMAGING_TEMPER_INFO();
|
ToolKits.GetPointerData(pAlarmInfo, msg);
|
String Picture = picturePath + "\\" + "EVENT_IVS_HEAT_IMAGING_TEMPER" + System.currentTimeMillis()
|
+ ".jpg";
|
ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture);
|
System.out.println("热成像测温点温度异常报警事件-----");
|
try {
|
System.out.println("温度异常点名称:" + new String(msg.szName, encode));
|
System.out.println("报警项编号:" + msg.nAlarmId);
|
System.out.println("报警温度值:" + msg.fTemperatureValue);
|
System.out.println("温度单位:" + msg.emTemperatureUnit);
|
System.out.println("通道号:" + msg.nChannel);
|
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
break;
|
}
|
case EVENT_IVS_HUMAN_ANIMAL_COEXISTENCE: {// 人和动物检测事件 (对应 DEV_EVENT_HUMAN_ANIMAL_COEXISTENCE_INFO)
|
System.out.println("人和动物检测事件 -----");
|
DEV_EVENT_HUMAN_ANIMAL_COEXISTENCE_INFO msg = new DEV_EVENT_HUMAN_ANIMAL_COEXISTENCE_INFO();
|
ToolKits.GetPointerData(pAlarmInfo, msg);
|
String Picture = picturePath + "\\" + "EVENT_IVS_HUMAN_ANIMAL_COEXISTENCE" + System.currentTimeMillis()
|
+ ".jpg";
|
ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture);
|
System.out.println("通道号: " + msg.nChannelID);
|
break;
|
}
|
case EVENT_IVS_ANIMAL_DETECTION: {// 动物检测事件 (对应 DEV_EVENT_ANIMAL_DETECTION_INFO)
|
System.out.println("动物检测事件 -----");
|
DEV_EVENT_ANIMAL_DETECTION_INFO msg = new DEV_EVENT_ANIMAL_DETECTION_INFO();
|
ToolKits.GetPointerData(pAlarmInfo, msg);
|
String Picture = picturePath + "\\" + "EVENT_IVS_ANIMAL_DETECTION" + System.currentTimeMillis()
|
+ ".jpg";
|
ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture);
|
System.out.println("通道号: " + msg.nChannelID);
|
break;
|
}
|
case EVENT_IVS_OBJECT_ABNORMAL: {// 目标异常事件 (对应 DEV_EVENT_OBJECT_ABNORMAL_INFO)
|
System.out.println("目标异常事件 -----");
|
DEV_EVENT_OBJECT_ABNORMAL_INFO msg = new DEV_EVENT_OBJECT_ABNORMAL_INFO();
|
ToolKits.GetPointerData(pAlarmInfo, msg);
|
String Picture = picturePath + "\\" + "EVENT_IVS_OBJECT_ABNORMAL" + System.currentTimeMillis() + ".jpg";
|
ToolKits.savePicture(pBuffer, 0, dwBufSize, Picture);
|
System.out.println("通道号: " + msg.nChannelID);
|
break;
|
}
|
default:
|
System.out.println("其他事件--------------------" + dwAlarmType);
|
break;
|
}
|
return 0;
|
}
|
}
|
|
/**
|
* 停止侦听智能事件
|
*/
|
public void DetachEventRealLoadPic() {
|
if (m_attachHandle.longValue() != 0) {
|
netSdk.CLIENT_StopLoadPic(m_attachHandle);
|
}
|
}
|
|
/** 订阅视频统计 句柄 */
|
private LLong videoStatHandle = new LLong(0);
|
|
/**
|
* 订阅
|
*/
|
public void attachVideoStatSummary() {
|
if (loginHandle.longValue() == 0) {
|
return;
|
}
|
|
NET_IN_ATTACH_VIDEOSTAT_SUM videoStatIn = new NET_IN_ATTACH_VIDEOSTAT_SUM();
|
videoStatIn.nChannel = 0;
|
videoStatIn.cbVideoStatSum = VideoStatSumCallback.getInstance();
|
|
NET_OUT_ATTACH_VIDEOSTAT_SUM videoStatOut = new NET_OUT_ATTACH_VIDEOSTAT_SUM();
|
|
videoStatHandle = netSdk.CLIENT_AttachVideoStatSummary(loginHandle, videoStatIn, videoStatOut, 5000);
|
if (videoStatHandle.longValue() == 0) {
|
System.err.printf("Attach Failed!LastError = %x\n", netSdk.CLIENT_GetLastError());
|
return;
|
}
|
|
System.out.printf("Attach Success!Wait Device Notify Information\n");
|
}
|
|
/**
|
* 退订
|
*/
|
public void detachVideoStatSummary() {
|
if (videoStatHandle.longValue() != 0) {
|
netSdk.CLIENT_DetachVideoStatSummary(videoStatHandle);
|
videoStatHandle.setValue(0);
|
}
|
}
|
|
private static class VideoStatSumCallback implements NetSDKLib.fVideoStatSumCallBack {
|
private static VideoStatSumCallback instance = new VideoStatSumCallback();
|
|
private VideoStatSumCallback() {
|
}
|
|
public static VideoStatSumCallback getInstance() {
|
return instance;
|
}
|
|
public void invoke(LLong lAttachHandle, NET_VIDEOSTAT_SUMMARY stVideoState, int dwBufLen, Pointer dwUser) {
|
/**
|
* 回调函数使用注意(防止卡回调) 1.不能再回调进行耗时操作,建议将数据、图片流、视频流等通过中间件和多线程抛出处理
|
* 2.不能再回调调用netsdk的其他接口
|
*/
|
|
System.out.println("通道号: " + stVideoState.nChannelID);
|
try {
|
System.out.println("规则类型名称: " + new String(stVideoState.szRuleName, encode));
|
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
// 进入小计
|
System.out.println("---------进入小计---------");
|
System.out.println("设备运行后猪只统计总数: " + stVideoState.stuEnteredSubtotal.nTotalPig);// 设备运行后猪只统计总数,重启后从上次总数开始继续累加
|
System.out.println("小时内的总猪只数量: " + stVideoState.stuEnteredSubtotal.nHourPig);
|
System.out.println("当天的总猪只数(自然天): " + stVideoState.stuEnteredSubtotal.nTodayPig);
|
System.out.println("如果不执行clearSectionStat操作,等同于TodayPig猪只数: "
|
+ stVideoState.stuEnteredSubtotal.nTotalPigInTimeSection);
|
// 出去小计
|
System.out.println("---------出去小计---------");
|
System.out.println("设备运行后猪只统计总数: " + stVideoState.stuExitedSubtotal.nTotalPig);// 设备运行后猪只统计总数,重启后从上次总数开始继续累加
|
System.out.println("小时内的总猪只数量: " + stVideoState.stuExitedSubtotal.nHourPig);
|
System.out.println("当天的总猪只数(自然天): " + stVideoState.stuExitedSubtotal.nTodayPig);
|
System.out.println(
|
"如果不执行clearSectionStat操作,等同于TodayPig猪只数: " + stVideoState.stuExitedSubtotal.nTotalPigInTimeSection);
|
|
System.out.println("区域ID: " + stVideoState.nAreaID);
|
System.out.println("区域内猪只数: " + stVideoState.nInsideTotalPig);
|
System.out.println("猪只离开滞留时间信息个数: " + stVideoState.nPigStayStatCount);
|
System.out.println("当天的猪只数: " + stVideoState.nInsideTodayPig);
|
}
|
}
|
|
/**
|
* 获取视频统计摘要信息
|
*/
|
public void getSummary() throws UnsupportedEncodingException {
|
CFG_VIDEOSATA_SUMMARY_INFO info = new CFG_VIDEOSATA_SUMMARY_INFO();
|
String command = EM_NEW_QUERY_SYSTEM_INFO.CFG_CAP_VIDEOSTAT_SUMMARY.getValue();
|
byte[] data = new byte[info.size()];
|
boolean result = netSdk.CLIENT_QueryNewSystemInfo(loginHandle, command, channel, data, data.length,
|
new IntByReference(0), 5000);
|
if (!result) {
|
System.err.println("CLIENT_QueryNewSystemInfo failed:" + ToolKits.getErrorCode());
|
}
|
String str = new String(data);
|
JSONObject obj = JSON.parseObject(str);
|
System.out.println("obj:" + obj);
|
|
info.write();
|
result = config.CLIENT_ParseData(command, data, info.getPointer(), info.size(), null);
|
if (!result) {
|
System.err.println("CLIENT_ParseData failed:" + ToolKits.getErrorCode());
|
}
|
info.read();
|
System.out.println("统计通道号: " + info.nChannelID);
|
System.out.println("规则名称: " + new String(info.szRuleName, encode));
|
System.out.println("统计时间: " + info.stuStatTime.toStringTime());
|
// 进入小计
|
System.out.println("---------进入小计---------");
|
System.out.println("设备运行后猪只统计总数: " + info.nEnteredTotalPig);// 设备运行后猪只统计总数,重启后从上次总数开始继续累加
|
System.out.println("如果不执行clearSectionStat操作,等同于TodayPig猪只数: " + info.nEnteredTotalPigInTimeSection);
|
System.out.println("小时内的总猪只数量: " + info.nEnteredHourPig);
|
System.out.println("当天的总猪只数(自然天): " + info.nEnteredTodayPig);
|
// 出去小计
|
System.out.println("---------出去小计---------");
|
System.out.println("设备运行后猪只统计总数: " + info.nExitedTotalPig);// 设备运行后猪只统计总数,重启后从上次总数开始继续累加
|
System.out.println("如果不执行clearSectionStat操作,等同于TodayPig猪只数: " + info.nExitedTotalPigInTimeSection);
|
System.out.println("小时内的总猪只数量: " + info.nExitedHourPig);
|
System.out.println("当天的总猪只数(自然天): " + info.nExitedTodayPig);
|
|
System.out.println("区域内猪只数: " + info.nInsideTotalPig);
|
System.out.println("猪只离开滞留时间信息个数: " + info.nInsidePigStayStatCount);
|
System.out.println("当天的猪只数: " + info.nInsideTodayPig);
|
}
|
|
public void RunTest() {
|
System.out.println("Run Test");
|
CaseMenu menu = new CaseMenu();
|
// 自定义定时抓图订阅接口 -猪只测温/测温框信息
|
menu.addItem((new CaseMenu.Item(this, "自定义定时抓图订阅接口", "AttachCustomSnapInfo")));// 自定义定时抓图订阅接口(目前智慧养殖猪温检测在用)
|
menu.addItem((new CaseMenu.Item(this, "取消自定义定时抓图订阅接口", "DetachCustomSnapInfo")));// 取消自定义定时抓图订阅接口(目前智慧养殖猪温检测在用)
|
|
// 智能事件订阅 -热成像测温点温度异常报警事件
|
menu.addItem(new CaseMenu.Item(this, "选择通道", "setChannelID"));
|
menu.addItem(new CaseMenu.Item(this, "订阅智能事件", "AttachEventRealLoadPic"));
|
menu.addItem(new CaseMenu.Item(this, "停止订阅智能事件", "DetachEventRealLoadPic"));
|
|
// 支持视频统计摘要信息
|
menu.addItem(new CaseMenu.Item(this, "订阅视频统计摘要信息", "attachVideoStatSummary"));
|
menu.addItem(new CaseMenu.Item(this, "取消订阅视频统计摘要信息", "detachVideoStatSummary"));
|
|
// 获取视频统计摘要信息
|
menu.addItem(new CaseMenu.Item(this, "获取视频统计摘要信息", "getSummary"));
|
menu.run();
|
}
|
|
public static void main(String[] args) {
|
|
CustomSnapInfoDemo customSnapInfoDemo = new CustomSnapInfoDemo();
|
InitTest("172.29.2.127", 37777, "admin", "admin123");
|
customSnapInfoDemo.RunTest();
|
LoginOut();
|
|
}
|
|
}
|