package com.netsdk.demo.event;
|
|
import com.netsdk.demo.customize.FireWarnDemo;
|
import com.netsdk.demo.intelligentTraffic.parkingDemo.ParkingUtils;
|
import com.netsdk.demo.units.TimeUtils;
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.enumeration.ENUMERROR;
|
import com.netsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
|
import com.netsdk.lib.structure.DEV_EVENT_DISTANCE_DETECTION_INFO;
|
import com.sun.jna.Memory;
|
import com.sun.jna.NativeLong;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
import java.io.File;
|
import java.util.Date;
|
|
import static com.netsdk.lib.Utils.getOsPrefix;
|
import static com.netsdk.lib.Utils.getPlatformEncode;
|
|
/**
|
* @Author 251589
|
* @Description: 宁波智慧公交 跌倒事件和异常间距事件
|
* @Date 2020/11/28 9:47
|
*/
|
public class TumbleDistanceDemo {
|
|
static NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE;
|
|
// 设备信息
|
private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
|
|
//登录句柄
|
private NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0);
|
|
// 智能订阅句柄
|
private NetSDKLib.LLong attachHandle = new NetSDKLib.LLong(0);
|
|
/**
|
* 登录设备
|
*/
|
public boolean login() {
|
int nSpecCap = 0;
|
Pointer pCapParam = null;
|
IntByReference nError = new IntByReference(0);
|
loginHandle = netSdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser,
|
m_strPassword, nSpecCap, pCapParam, deviceInfo, nError);
|
|
if (loginHandle.longValue() != 0) {
|
System.out.printf("Login Device[%s] Port[%d] Success!\n", m_strIp, m_nPort);
|
} else {
|
System.out.printf("Login Device[%s] Port[%d] Failed. %s\n", m_strIp, m_nPort, ToolKits.getErrorCode());
|
}
|
|
return loginHandle.longValue() != 0;
|
}
|
|
|
/**
|
* 登出设备
|
*/
|
public void logout() {
|
if (loginHandle.longValue() != 0)
|
netSdk.CLIENT_Logout(loginHandle);
|
}
|
|
public void InitTest() {
|
ParkingUtils.Init(); // SDK初始化
|
if (!login()) // 登陆设备
|
EndTest();
|
}
|
|
public void EndTest() {
|
stopLoadPicture(); // 取消订阅
|
logout(); // 登出设备
|
System.out.println("See You...");
|
netSdk.CLIENT_Cleanup();
|
System.exit(0);
|
}
|
|
/**
|
* 远程抓图(异步)
|
*/
|
public void snapPicture() {
|
// send capture picture instruction to device
|
NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS();
|
stuSnapParams.Channel = 0; // channel
|
stuSnapParams.mode = 0; // capture picture mode
|
stuSnapParams.Quality = 3; // picture quality
|
stuSnapParams.InterSnap = 0;
|
stuSnapParams.CmdSerial = 0;
|
|
IntByReference reserved = new IntByReference(0);
|
if (!netSdk.CLIENT_SnapPictureEx(loginHandle, stuSnapParams, reserved)) {
|
System.err.printf("CLIENT_SnapPictureEx Failed!" + ToolKits.getErrorCode());
|
} else {
|
System.out.println("CLIENT_SnapPictureEx success");
|
}
|
}
|
|
public static class SnapCallback implements NetSDKLib.fSnapRev {
|
private static SnapCallback instance = new SnapCallback();
|
|
private File path;
|
|
private SnapCallback() {
|
path = new File("./Snap/");
|
if (!path.exists()) {
|
path.mkdir();
|
}
|
}
|
|
public static SnapCallback getInstance() {
|
return instance;
|
}
|
|
public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
|
if (EncodeType == 10) { // jpg
|
String fileName = path + File.separator + "AsyncSnapPicture_" + TimeUtils.getTimeStringWithoutSign(new Date()) + ".jpg";
|
//保存图片到本地文件
|
ToolKits.savePicture(pBuf, RevLen, fileName);
|
}
|
}
|
}
|
|
|
/**
|
* 【需求描述】 跌倒事件檢測
|
*/
|
public boolean realLoadPicture() {
|
int bNeedPicture = 1; // 是否需要图片
|
int channel = 0; // 订阅全通道
|
if (deviceInfo.byChanNum == 1)
|
channel = 0;
|
|
// AnalyzerDataCB.getInstance() 回调
|
attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel,
|
NetSDKLib.EVENT_IVS_ALL, bNeedPicture, AnalyzerDataCB.getInstance(), null, null);
|
if (attachHandle.longValue() != 0) {
|
System.out.printf("Channel[%d] RealLoad Picture Succeed!\n", channel);
|
} else {
|
System.err.printf("Channel[%d] RealLoad Picture Failed! errCode == %s\n errMsg == %s\n", channel, ToolKits.getErrorCode(), ENUMERROR.getErrorMessage());
|
}
|
return attachHandle.longValue() != 0;
|
}
|
|
/**
|
* 订阅报警信息
|
*
|
* @return
|
*/
|
public void startListen() {
|
// 设置报警回调函数
|
|
netSdk.CLIENT_SetDVRMessCallBack(ParkingMessageCallBackEx1.getSingleInstance(), null);
|
|
// 订阅报警
|
boolean bRet = netSdk.CLIENT_StartListenEx(loginHandle);
|
if (!bRet) {
|
System.err.printf("订阅报警失败! error:%d\n", netSdk.CLIENT_GetLastError() + ENUMERROR.getErrorMessage());
|
} else {
|
System.out.println("订阅报警成功.");
|
}
|
}
|
|
public static class ParkingMessageCallBackEx1 implements NetSDKLib.fMessCallBackEx1 {
|
|
private static com.netsdk.demo.intelligentTraffic.parkingDemo.ParkingMessageCallBackEx1 singleInstance;
|
|
public static com.netsdk.demo.intelligentTraffic.parkingDemo.ParkingMessageCallBackEx1 getSingleInstance() {
|
if (singleInstance == null) {
|
singleInstance = new com.netsdk.demo.intelligentTraffic.parkingDemo.ParkingMessageCallBackEx1();
|
}
|
return singleInstance;
|
}
|
|
public static String encode;
|
|
static {
|
String osPrefix = getOsPrefix();
|
if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
|
encode = "GBK";
|
} else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
|
encode = "UTF-8";
|
}
|
}
|
|
@Override
|
public boolean invoke(int lCommand, NetSDKLib.LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP, NativeLong nDevicePort, int bAlarmAckFlag, NativeLong nEventID, Pointer dwUser) {
|
switch (lCommand) {
|
case NetSDKLib.NET_ALARM_FIREWARNING_INFO: {
|
dealData(pStuEvent);
|
break;
|
}
|
default:
|
System.out.printf("Get Other Event 0x%x\n", lCommand);
|
break;
|
}
|
|
return true;
|
}
|
|
// 处理事件
|
private static void dealData(Pointer pAlarmInfo) {
|
NetSDKLib.ALARM_FIREWARNING_INFO_DETAIL msg = new NetSDKLib.ALARM_FIREWARNING_INFO_DETAIL();
|
ToolKits.GetPointerData(pAlarmInfo, msg);
|
for (int i = 0; i < msg.stuFireWarningInfo.length; i++) {
|
System.out.println("msg 距离" + msg.stuFireWarningInfo[i].nDistance);
|
System.out.println("msg GPS" + msg.stuFireWarningInfo[i].stuGpsPoint.dwLatidude + "," +msg.stuFireWarningInfo[i].stuGpsPoint.dwLongitude);
|
System.out.println("msg 温度" + msg.stuFireWarningInfo[i].nTemperatureUnit);
|
}
|
|
}
|
|
}
|
|
|
/**
|
* 跌倒事件回调
|
*/
|
public static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
|
// (倒地报警事件)对应数据块描述信息
|
private NetSDKLib.DEV_EVENT_TUMBLE_DETECTION_INFO msg = new NetSDKLib.DEV_EVENT_TUMBLE_DETECTION_INFO();
|
|
private File path;
|
|
private AnalyzerDataCB() {
|
|
path = new File("./Snap/");
|
if (!path.exists())
|
path.mkdir();
|
}
|
|
private static class CallBackHolder {
|
private static AnalyzerDataCB instance = new AnalyzerDataCB();
|
}
|
|
public static AnalyzerDataCB getInstance() {
|
return AnalyzerDataCB.CallBackHolder.instance;
|
}
|
|
// 回调
|
public int invoke(NetSDKLib.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 (dwAlarmType) {
|
case NetSDKLib.EVENT_IVS_TUMBLE_DETECTION: { // 跌倒事件
|
dealData4TumbleDetection(pAlarmInfo);
|
break;
|
}
|
case NetSDKLib.EVENT_IVS_DISTANCE_DETECTION: { // 异常距离检测事件
|
dealData4DistanceDetection(pAlarmInfo);
|
break;
|
}
|
default:
|
System.out.printf("其他事件: 0x%x\n" , dwAlarmType);
|
break;
|
}
|
return 0;
|
}
|
// 处理事件
|
private void dealData4TumbleDetection(Pointer pAlarmInfo) {
|
ToolKits.GetPointerData(pAlarmInfo, msg);
|
System.out.println("跌倒 -> 事件ID:" + msg.nEventID);
|
System.out.println("跌倒 -> 事件动作: " + msg.nAction);
|
System.out.println("跌倒 -> 目标ID: " + msg.nObjectID);
|
System.out.println("跌倒 -> 智能事件所属大类: " + msg.emClassType);
|
System.out.println("跌倒 -> 事件发生的时间: " + msg.UTC);
|
}
|
// 异常间距事件对应的数据块描述信息
|
private void dealData4DistanceDetection(Pointer pAlarmInfo) {
|
DEV_EVENT_DISTANCE_DETECTION_INFO distanceDetectionInfo = new DEV_EVENT_DISTANCE_DETECTION_INFO();
|
ToolKits.GetPointerData(pAlarmInfo, distanceDetectionInfo);
|
NetSDKLib.DH_MSG_OBJECT object = new NetSDKLib.DH_MSG_OBJECT();
|
ToolKits.GetPointerData(distanceDetectionInfo.stuObject.getPointer(), object);
|
System.out.println("异常间距 -> 事件ID:" + distanceDetectionInfo.nEventID);
|
System.out.println("异常间距 -> 事件动作: " + distanceDetectionInfo.nAction);
|
System.out.println("异常间距 -> 检测区域顶点数: " + distanceDetectionInfo.nDetectRegionNum);
|
System.out.println("异常间距 -> 事件发生的时间: " + distanceDetectionInfo.UTC);
|
}
|
}
|
|
/**
|
* 停止智能订阅
|
*/
|
public void stopLoadPicture() {
|
if (attachHandle.longValue() != 0) {
|
netSdk.CLIENT_StopLoadPic(attachHandle);
|
attachHandle.setValue(0);
|
System.out.println("Had Stop RealLoad Picture!");
|
}
|
}
|
|
/**
|
* 云台配置
|
*/
|
public void cfgPTZ() {
|
NetSDKLib.CFG_PTZ_INFO stuPTZ = new NetSDKLib.CFG_PTZ_INFO();
|
if (!ToolKits.GetDevConfig(loginHandle, 0, NetSDKLib.CFG_CMD_PTZ, stuPTZ)) {
|
System.err.println("Get PTZ Failed!" + ToolKits.getErrorCode());
|
return;
|
}
|
|
System.out.printf("Enable: %d PresetId:%d FreeSec:%d \n", stuPTZ.bEnable,
|
stuPTZ.stuPresetHoming.nPtzPresetId, stuPTZ.stuPresetHoming.nFreeSec);
|
|
stuPTZ.bEnable = 1; // 使能
|
stuPTZ.stuPresetHoming.nFreeSec = 36; // 归位时间,单位为秒
|
if (!ToolKits.SetDevConfig(loginHandle, 0, NetSDKLib.CFG_CMD_PTZ, stuPTZ)) {
|
System.err.println("Set PTZ Failed!" + ToolKits.getErrorCode());
|
} else {
|
System.err.println("Set PTZ Success!");
|
}
|
}
|
|
// 选中目标进行抓拍
|
public void snapPictureByAnalyseObject() {
|
NetSDKLib.NET_IN_SNAP_BY_ANALYSE_OBJECT stuIn = new NetSDKLib.NET_IN_SNAP_BY_ANALYSE_OBJECT();
|
|
stuIn.nChannelID = 0; // 通道号
|
stuIn.nSnapObjectNum = 1; // 抓拍物体个数
|
// 抓拍物体信息 (点坐标归一化到[0, 8192]坐标)
|
// 实际使用时通过如下计算: 8192.0 * 相对坐标/显示宽(高) 其中左右通过显示的宽度计算,上下通过显示的高度计算
|
// 如 (int)(8192.0*80/120)——浮点计算是为了使结果更精确
|
// stuIn.stuSnapObjects[0].stuBoundingBox.left = 0;
|
// stuIn.stuSnapObjects[0].stuBoundingBox.top = 0;
|
// stuIn.stuSnapObjects[0].stuBoundingBox.right = 8192;
|
// stuIn.stuSnapObjects[0].stuBoundingBox.bottom = 8192;
|
stuIn.stuSnapObjects[0].stuBoundingBox.left = 4154;
|
stuIn.stuSnapObjects[0].stuBoundingBox.top = 3172;
|
stuIn.stuSnapObjects[0].stuBoundingBox.right = 5160;
|
stuIn.stuSnapObjects[0].stuBoundingBox.bottom = 4380;
|
|
NetSDKLib.NET_OUT_SNAP_BY_ANALYSE_OBJECT stuOut = new NetSDKLib.NET_OUT_SNAP_BY_ANALYSE_OBJECT();
|
if (!netSdk.CLIENT_SnapPictureByAnalyseObject(loginHandle, stuIn, stuOut, 5000)) {
|
System.err.println("Snap Picture By Analyse Object Failed!" + ToolKits.getErrorCode());
|
} else {
|
System.err.println("Snap Picture By Analyse Object Success!");
|
}
|
}
|
|
/**
|
* 场景抓拍设置
|
*/
|
public void snapShotWithRulecfg() {
|
int nMaxRuleNum = 10; // 可根据实际修改
|
NetSDKLib.NET_SCENE_SNAP_SHOT_WITH_RULE2_INFO[] stuRule = new NetSDKLib.NET_SCENE_SNAP_SHOT_WITH_RULE2_INFO[nMaxRuleNum];
|
for (int i = 0; i < nMaxRuleNum; ++i) {
|
stuRule[i] = new NetSDKLib.NET_SCENE_SNAP_SHOT_WITH_RULE2_INFO();
|
}
|
|
int emCfgOpType = NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_SCENE_SNAP_SHOT_WITH_RULE2; // 场景抓拍设置
|
int nChannelID = 0;
|
NetSDKLib.NET_CFG_SCENE_SNAP_SHOT_WITH_RULE2_INFO stuCfg = new NetSDKLib.NET_CFG_SCENE_SNAP_SHOT_WITH_RULE2_INFO();
|
stuCfg.nMaxRuleNum = nMaxRuleNum;
|
stuCfg.pstuSceneSnapShotWithRule = new Memory(nMaxRuleNum * stuRule[0].size());
|
stuCfg.pstuSceneSnapShotWithRule.clear(nMaxRuleNum * stuRule[0].size());
|
ToolKits.SetStructArrToPointerData(stuRule, stuCfg.pstuSceneSnapShotWithRule);
|
|
// 获取
|
stuCfg.write();
|
if (!netSdk.CLIENT_GetConfig(loginHandle, emCfgOpType, nChannelID,
|
stuCfg.getPointer(), stuCfg.size(), 4000, null)) {
|
System.err.println("获取场景抓拍配置失败!" + ToolKits.getErrorCode());
|
return;
|
}
|
|
stuCfg.read();
|
ToolKits.GetPointerDataToStructArr(stuCfg.pstuSceneSnapShotWithRule, stuRule);
|
|
System.out.printf("stuRule[0]--PresetID:%d RuleNum:%d RuleType:%x SingleInterval:%d\n",
|
stuRule[0].nPresetID, stuRule[0].nRetSnapShotRuleNum,
|
stuRule[0].stuSnapShotWithRule[0].dwRuleType, stuRule[0].stuSnapShotWithRule[0].nSingleInterval[1]);
|
|
// 设置,在获取的基础上设置
|
IntByReference restart = new IntByReference(0);
|
stuRule[0].stuSnapShotWithRule[0].nSingleInterval[1] = 15; // 抓图时间间隔
|
ToolKits.SetStructArrToPointerData(stuRule, stuCfg.pstuSceneSnapShotWithRule);
|
stuCfg.write();
|
if (!netSdk.CLIENT_SetConfig(loginHandle, emCfgOpType, nChannelID,
|
stuCfg.getPointer(), stuCfg.size(), 4000, restart, null)) {
|
System.err.println("设置场景抓拍配置失败!" + ToolKits.getErrorCode() + " \n errMsg: " + ENUMERROR.getErrorMessage());
|
} else {
|
System.err.println("设置场景抓拍配置成功!");
|
}
|
}
|
|
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
menu.addItem(new CaseMenu.Item(this, "远程抓图", "snapPicture"));
|
menu.addItem(new CaseMenu.Item(this, "智能订阅", "realLoadPicture"));
|
menu.addItem(new CaseMenu.Item(this, "停止智能订阅", "stopLoadPicture"));
|
menu.run();
|
}
|
|
/**
|
* Parameter for login
|
*/
|
////////////////////////////////////////////////////////////////
|
private String m_strIp = "172.25.100.21";// "172.32.101.59"; //"10.11.16.168";
|
private int m_nPort = 37777;
|
private String m_strUser = "admin";
|
private String m_strPassword = "admin123";
|
|
////////////////////////////////////////////////////////////////
|
public static void main(String[] args) {
|
TumbleDistanceDemo demo = new TumbleDistanceDemo();
|
demo.InitTest();
|
System.out.println("Run Test");
|
demo.RunTest();
|
demo.EndTest();
|
}
|
}
|