package com.netsdk.demo.customize;
|
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.demo.util.EventTaskHandler;
|
import com.netsdk.demo.util.QueueGeneration;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.enumeration.ENUMERROR;
|
import com.netsdk.lib.structure.DEV_EVENT_NONMOTOR_ENTRYING_INFO;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
import java.io.BufferedOutputStream;
|
import java.io.DataOutputStream;
|
import java.io.File;
|
import java.io.FileOutputStream;
|
|
import static com.netsdk.lib.Utils.getOsPrefix;
|
|
/**
|
* className:NonMotorEntryingDemo
|
* description: 前端电梯电动车禁入半球、IVSS708,SDK对接第三方平台,实现报警信息在小区平台上展现
|
* author:251589
|
* createTime:2020/12/21 11:26
|
*
|
* @version v1.0
|
*/
|
public class NonMotorEntryingDemo {
|
static NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE;
|
|
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";
|
}
|
}
|
|
|
// 设备信息
|
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);
|
|
|
/**
|
* 通用服务
|
*/
|
static class SDKGeneralService {
|
|
// 网络断线回调
|
// 调用 CLIENT_Init设置此回调, 当设备断线时会自动调用.
|
public static class DisConnect implements NetSDKLib.fDisConnect {
|
|
private DisConnect() {
|
}
|
|
private static class CallBackHolder {
|
private static final NonMotorEntryingDemo.SDKGeneralService.DisConnect cb = new NonMotorEntryingDemo.SDKGeneralService.DisConnect();
|
}
|
|
public static final NonMotorEntryingDemo.SDKGeneralService.DisConnect getInstance() {
|
return NonMotorEntryingDemo.SDKGeneralService.DisConnect.CallBackHolder.cb;
|
}
|
|
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("Device[%s] Port[%d] Disconnect!\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
// 网络连接恢复回调
|
// 调用 CLIENT_SetAutoReconnect设置此回调, 当设备重连时会自动调用.
|
public static class HaveReConnect implements NetSDKLib.fHaveReConnect {
|
|
private HaveReConnect() {
|
}
|
|
private static class CallBackHolder {
|
private static final com.netsdk.demo.customize.NonMotorEntryingDemo.SDKGeneralService.HaveReConnect cb = new com.netsdk.demo.customize.NonMotorEntryingDemo.SDKGeneralService.HaveReConnect();
|
}
|
|
public static final com.netsdk.demo.customize.NonMotorEntryingDemo.SDKGeneralService.HaveReConnect getInstance() {
|
return com.netsdk.demo.customize.NonMotorEntryingDemo.SDKGeneralService.HaveReConnect.CallBackHolder.cb;
|
}
|
|
public void invoke(NetSDKLib.LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
/**
|
* SDK初始化
|
*/
|
public static void init() {
|
// SDK资源初始化
|
netSdk.CLIENT_Init(com.netsdk.demo.customize.SDSnap.SDKGeneralService.DisConnect.getInstance(), null);
|
|
// 设置断线重连回调,当设备断线后会自动重连并在重连后自动调用HaveReConnect(可选)
|
netSdk.CLIENT_SetAutoReconnect(com.netsdk.demo.customize.SDSnap.SDKGeneralService.HaveReConnect.getInstance(), null);
|
|
// 打开SDK日志(可选)
|
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
|
setLog.bSetFilePath = 1;
|
setLog.bSetPrintStrategy = 1;
|
setLog.nPrintStrategy = 0;
|
String logPath = new File(".").getAbsoluteFile().getParent() + File.separator + "sdk_log" + File.separator + "sdk.log";
|
|
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
|
|
boolean bLogopen = netSdk.CLIENT_LogOpen(setLog);
|
if (!bLogopen)
|
System.err.println("Failed to open NetSDK log !!!");
|
|
netSdk.CLIENT_SetSnapRevCallBack(com.netsdk.demo.customize.SDSnap.SnapCallback.getInstance(), null);
|
}
|
|
/**
|
* SDK——释放资源
|
*/
|
public static void cleanup() {
|
netSdk.CLIENT_Cleanup();
|
}
|
}
|
|
/**
|
* 登录设备
|
*/
|
public boolean login() {
|
int nSpecCap = 0;
|
Pointer pCapParam = null;
|
IntByReference nError = new IntByReference(0);
|
loginHandle = netSdk.CLIENT_LoginEx2(mIp, mPort, mUserName,
|
mPassword, nSpecCap, pCapParam, deviceInfo, nError);
|
|
if (loginHandle.longValue() != 0) {
|
System.out.printf("Login Device[%s] Port[%d] Success!\n", mIp, mPort);
|
} else {
|
System.out.printf("Login Device[%s] Port[%d] Failed. %s\n", mIp, mPort, ToolKits.getErrorCode() + ENUMERROR.getErrorMessage());
|
}
|
|
return loginHandle.longValue() != 0;
|
}
|
|
|
/**
|
* 登出设备
|
*/
|
public void logout() {
|
if (loginHandle.longValue() != 0)
|
netSdk.CLIENT_Logout(loginHandle);
|
}
|
|
public void InitTest() {
|
SDKGeneralService.init(); // SDK初始化
|
if (!login()) // 登陆设备
|
EndTest();
|
}
|
|
|
/**
|
* 智能事件回调
|
*/
|
public static class AnalyzerDataCallBack implements NetSDKLib.fAnalyzerDataCallBack {
|
private static AnalyzerDataCallBack singleInstance;
|
|
public static AnalyzerDataCallBack getSingleInstance() {
|
if (singleInstance == null) {
|
singleInstance = new AnalyzerDataCallBack();
|
}
|
return singleInstance;
|
}
|
|
|
private QueueGeneration eventCBQueueService = new QueueGeneration(); // 保存图片用队列
|
|
public AnalyzerDataCallBack() {
|
eventCBQueueService.init();
|
}
|
|
private final String imageSaveFolder = "pic/"; // 图片保存路径
|
|
|
@Override
|
public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) {
|
File path = new File("./EventPicture/");
|
if (!path.exists())
|
path.mkdir();
|
//public static final int EVENT_IVS_NONMOTOR_ENTRYING = 0x0000030C; // 非机动车进入电梯(对应 DEV_EVENT_NONMOTOR_ENTRYING_INFO)
|
switch (dwAlarmType) {
|
case NetSDKLib.EVENT_IVS_NONMOTOR_ENTRYING: {
|
System.out.println("非机动车进入电梯事件!");
|
DEV_EVENT_NONMOTOR_ENTRYING_INFO info = new DEV_EVENT_NONMOTOR_ENTRYING_INFO();
|
ToolKits.GetPointerData(pAlarmInfo, info);
|
|
////////////////////////////////// 事件主要信息 ///////////////////////////
|
StringBuilder mainInfo = new StringBuilder()
|
.append("事件ID: ").append(info.nEventID).append("\n")
|
.append("过车时间(毫秒时间戳): ").append(info.PTS).append("\n")
|
.append("规则ID: ").append(info.nRuleID).append("\n")
|
.append("智能事件所属大类: ").append(info.emClassType).append("\n");
|
System.out.println("事件主要信息" + mainInfo.toString());
|
//保存全景图
|
if (info.stuSceneImage.nLength > 0) {
|
String strFileName = path + "\\" + System.currentTimeMillis() + "全景图.jpg";
|
ToolKits.savePicture(pBuffer, info.stuSceneImage.nOffSet, info.stuSceneImage.nLength, strFileName);
|
} else {
|
System.out.println("非机动车进入电梯事件无全景图");
|
}
|
break;
|
}
|
default:
|
System.out.println("其他事件-> " + dwAlarmType);
|
break;
|
}
|
return 0;
|
}
|
|
// 处理保存图片
|
private class SavePicHandler implements EventTaskHandler {
|
private static final long serialVersionUID = 1L;
|
private final byte[] imgBuffer;
|
private final int length;
|
private final String savePath;
|
|
public SavePicHandler(Pointer pBuf, int dwBufOffset, int dwBufSize, String sDstFile) {
|
this.imgBuffer = pBuf.getByteArray(dwBufOffset, dwBufSize);
|
this.length = dwBufSize;
|
this.savePath = sDstFile;
|
}
|
|
@Override
|
public void eventCallBackProcess() {
|
System.out.println("保存图片中...路径:" + savePath);
|
File path = new File(imageSaveFolder);
|
if (!path.exists()) path.mkdir();
|
try {
|
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)));
|
out.write(imgBuffer, 0, length);
|
out.close();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
|
private NetSDKLib.fAnalyzerDataCallBack analyzerDataCB = AnalyzerDataCallBack.getSingleInstance();
|
|
/**
|
* 订阅智能事件
|
*/
|
public void attachEventRealLoadPic() {
|
int bNeedPicture = 1;
|
int channel = 0; // 订阅全通道
|
attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, analyzerDataCB, null, null);
|
if (attachHandle.longValue() != 0) {
|
System.out.println("订阅: " + channel + " 通道号成功!");
|
} else {
|
System.out.println("订阅: " + channel + " 通道号失败!" + ToolKits.getErrorCode() + ENUMERROR.getErrorMessage());
|
}
|
}
|
|
/**
|
* 退订智能事件
|
*/
|
public void detachEventRealLoadPic() {
|
if (attachHandle.longValue() != 0) {
|
netSdk.CLIENT_StopLoadPic(attachHandle);
|
}
|
}
|
|
public void EndTest() {
|
detachEventRealLoadPic();
|
logout(); // 登出设备
|
System.out.println("See You...");
|
netSdk.CLIENT_Cleanup();
|
System.exit(0);
|
}
|
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
menu.addItem(new CaseMenu.Item(this, "事件订阅", "attachEventRealLoadPic"));
|
menu.addItem(new CaseMenu.Item(this, "退订事件", "detachEventRealLoadPic"));
|
menu.run();
|
}
|
|
/**
|
* Parameter for login
|
*/
|
////////////////////////////////////////////////////////////////
|
private String mIp = "10.34.3.110";//"172.12.66.45"; //"172.12.66.45"; //"10.11.16.168"; // 172.23.12.179
|
private int mPort = 37777;
|
private String mUserName = "admin";
|
private String mPassword = "admin";
|
|
////////////////////////////////////////////////////////////////
|
public static void main(String[] args) {
|
NonMotorEntryingDemo demo = new NonMotorEntryingDemo();
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
}
|
|
}
|