package com.netsdk.demo.intelligentTraffic.parkingDemo;
|
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.enumeration.EM_PARKINGSPACE_STATE;
|
import com.netsdk.lib.structure.*;
|
import com.sun.jna.ptr.IntByReference;
|
|
import java.io.UnsupportedEncodingException;
|
import java.util.Scanner;
|
import java.util.UUID;
|
|
import static com.netsdk.lib.Utils.getOsPrefix;
|
|
/**
|
* @author 47040
|
* @update 2020/11/19
|
* 1)事件抓图(SnapByEvent)
|
* 2)设置停车位状态(setParkStatus)
|
* 3)修改停车记录(modifyParkingInfo)
|
* @since Created in 2020/7/20 16:28
|
*/
|
public class ParkingImageEventDemo {
|
|
// The constant net sdk
|
public static final NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
|
|
// The constant config sdk.
|
public static NetSDKLib configsdk = NetSDKLib.CONFIG_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 m_hLoginHandle = new NetSDKLib.LLong(0); // 登录句柄
|
|
/**
|
* login with high level 高安全级别登陆
|
*/
|
public void loginWithHighLevel() {
|
|
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam =
|
new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() {{
|
szIP = m_strIpAddr.getBytes();
|
nPort = m_nPort;
|
szUserName = m_strUser.getBytes();
|
szPassword = m_strPassword.getBytes();
|
}}; // 输入结构体参数
|
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam =
|
new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); // 输结构体参数
|
|
// 写入sdk
|
m_hLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam);
|
|
if (m_hLoginHandle.longValue() == 0) {
|
System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIpAddr, m_nPort,
|
netsdk.CLIENT_GetLastError());
|
} else {
|
deviceInfo = pstOutParam.stuDeviceInfo; // 获取设备信息
|
System.out.println("Login Success");
|
System.out.println("Device Address:" + m_strIpAddr);
|
System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道");
|
}
|
}
|
|
/**
|
* logout 退出
|
*/
|
public void logOut() {
|
if (m_hLoginHandle.longValue() != 0) {
|
netsdk.CLIENT_Logout(m_hLoginHandle);
|
System.out.println("LogOut Success");
|
}
|
}
|
|
//////////////////////////////////////// 订阅事件/退订 ///////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
private NetSDKLib.LLong m_hAttachHandle = new NetSDKLib.LLong(0); // 订阅相关
|
|
private NetSDKLib.fAnalyzerDataCallBack analyzerDataCB = ParkingAnalyzerDataCallBack.getSingleInstance();
|
|
private int channel = 0;
|
|
public void setChannelID() {
|
System.out.println("请输入订阅通道,-1 表示全部");
|
Scanner sc = new Scanner(System.in);
|
this.channel = sc.nextInt();
|
}
|
|
public void AttachEventRealLoadPic() {
|
|
this.DetachEventRealLoadPic(); // 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回
|
|
int bNeedPicture = 1; // 需要图片
|
|
m_hAttachHandle = netsdk.CLIENT_RealLoadPictureEx(m_hLoginHandle, channel, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, analyzerDataCB, null, null);
|
if (m_hAttachHandle.longValue() != 0) {
|
System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel);
|
} else {
|
System.out.printf("Ch[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel, ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 停止侦听智能事件
|
*/
|
public void DetachEventRealLoadPic() {
|
if (m_hAttachHandle.longValue() != 0) {
|
netsdk.CLIENT_StopLoadPic(m_hAttachHandle);
|
}
|
}
|
|
/////////////////////////////////////// RPC 接口 ////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
/**
|
* 获取停车超时配置
|
*/
|
public void TestParkingTimeoutGetConfig() {
|
|
NetSDKLib.NET_CFG_PARKING_TIMEOUT_DETECT timeoutDetectConfig = new NetSDKLib.NET_CFG_PARKING_TIMEOUT_DETECT();
|
boolean ret = ParkingUtils.ParkingTimeoutGetConfig(m_hLoginHandle, timeoutDetectConfig);
|
if (!ret) return;
|
StringBuilder builder = new StringBuilder()
|
.append("<<-----Parking Timeout Config----->>").append("\n")
|
.append("bEnable: ").append(timeoutDetectConfig.bEnable).append("\n")
|
.append("nParkingTime: ").append(timeoutDetectConfig.nParkingTime);
|
System.out.println(builder.toString());
|
}
|
|
/**
|
* 设置停车超时配置
|
*/
|
public void TestParkingTimeoutSetConfig() {
|
|
NetSDKLib.NET_CFG_PARKING_TIMEOUT_DETECT timeoutDetectConfig = new NetSDKLib.NET_CFG_PARKING_TIMEOUT_DETECT();
|
timeoutDetectConfig.bEnable = 1;
|
timeoutDetectConfig.nParkingTime = 302400;
|
ParkingUtils.ParkingTimeoutSetConfig(m_hLoginHandle, timeoutDetectConfig);
|
}
|
|
|
/**
|
* 手动抓图 (ParkingSnapshot)
|
*/
|
public void TestParkingSnapshot() {
|
|
NetSDKLib.NET_IN_SNAP_MNG_SHOT stuInBuf = new NetSDKLib.NET_IN_SNAP_MNG_SHOT();
|
stuInBuf.nChannel = channel;
|
stuInBuf.nTime = 1; // 连拍次数, 0表示停止抓拍,正数表示连续抓拍的张数
|
|
ParkingUtils.ParkingSnapshot(m_hLoginHandle, stuInBuf);
|
}
|
|
/**
|
* 手动抓图 通用二代协议
|
*/
|
public void TestParkingSnapshotCommon() {
|
|
NetSDKLib.MANUAL_SNAP_PARAMETER snapParameter = new NetSDKLib.MANUAL_SNAP_PARAMETER();
|
snapParameter.nChannel = channel;
|
String sUuid = UUID.randomUUID().toString();
|
byte[] bUuid = sUuid.getBytes();
|
System.arraycopy(bUuid, 0, snapParameter.bySequence, 0, bUuid.length);
|
int emType = NetSDKLib.CtrlType.CTRLTYPE_MANUAL_SNAP;
|
snapParameter.write();
|
boolean ret = netsdk.CLIENT_ControlDevice(m_hLoginHandle, emType, snapParameter.getPointer(), 3000);
|
if (!ret) {
|
System.err.println("手动抓图失败! " + ToolKits.getErrorCode());
|
return;
|
}
|
System.out.println("手动抓图命令下发成功!");
|
}
|
|
|
/**
|
* 下发车辆清理接口, 清除的车辆为 P1 的 “一位多车信息”中车辆(车位号,车牌号)
|
*/
|
public void TestRemoveParkingCarInfo() throws UnsupportedEncodingException {
|
NetSDKLib.NET_IN_REMOVE_PARKING_CAR_INFO stuInBuf = new NetSDKLib.NET_IN_REMOVE_PARKING_CAR_INFO();
|
NetSDKLib.DEV_OCCUPIED_WARNING_INFO stuParkingCarInfo = stuInBuf.stuParkingCarInfo;
|
|
byte[] szParkingNo = "P1".getBytes();
|
System.arraycopy(szParkingNo, 0, stuParkingCarInfo.szParkingNo, 0, szParkingNo.length);
|
|
// 设备会对以下的数据作严格校验,如果不存在会返回校验错误,另外务必注意编码格式 encode
|
|
stuParkingCarInfo.nPlateNumber = 3;
|
|
byte[] iSzPlatNumber1 = "皖SLV662".getBytes(encode);
|
System.arraycopy(iSzPlatNumber1, 0, stuParkingCarInfo.szPlateNumber[0].plateNumber, 0, iSzPlatNumber1.length);
|
byte[] iSzPlatNumber2 = "浙A826RW".getBytes(encode);
|
System.arraycopy(iSzPlatNumber2, 0, stuParkingCarInfo.szPlateNumber[1].plateNumber, 0, iSzPlatNumber2.length);
|
byte[] iSzPlatNumber3 = "沪C0M959".getBytes(encode);
|
System.arraycopy(iSzPlatNumber3, 0, stuParkingCarInfo.szPlateNumber[2].plateNumber, 0, iSzPlatNumber3.length);
|
|
ParkingUtils.RemoveParkingCarInfo(m_hLoginHandle, stuInBuf);
|
}
|
|
/**
|
* 指定事件抓图
|
*/
|
public void TestSnapPictureByEvent() {
|
|
NET_IN_SNAP_BY_EVENT stuParamIn = new NET_IN_SNAP_BY_EVENT();
|
stuParamIn.nChannel = channel; // Todo 通道号
|
stuParamIn.dwEventID = NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACE_MANUALSNAP; // 指定"路侧停车位手动抓图"事件
|
byte[] serialNo = UUID.randomUUID().toString().getBytes(); // Todo 自定义序列号,用于匹配事件
|
System.arraycopy(serialNo, 0, stuParamIn.szSerialNo, 0, serialNo.length);
|
|
NET_OUT_SNAP_BY_EVENT stuParamOut = new NET_OUT_SNAP_BY_EVENT();
|
|
stuParamIn.write();
|
stuParamOut.write();
|
boolean ret = netsdk.CLIENT_SnapPictureByEvent(m_hLoginHandle, stuParamIn.getPointer(), stuParamOut.getPointer(), 3000);
|
if (!ret) {
|
System.err.println("指定事件抓图指令下发失败: " + ToolKits.getErrorCode());
|
return;
|
}
|
System.out.println("指定事件抓图指令下发成功。");
|
}
|
|
/**
|
* 设置停车位状态
|
*/
|
public void TestSetParkingStatus() throws UnsupportedEncodingException {
|
|
// 入参
|
NET_IN_SET_PARKINGSPACE_STATE_INFO stuParamIn = new NET_IN_SET_PARKINGSPACE_STATE_INFO();
|
stuParamIn.nChannel = channel; // Todo 通道号
|
byte[] plateNumber = "浙A826RW".getBytes(encode); // Todo 车牌号
|
System.arraycopy(plateNumber, 0, stuParamIn.szPlateNumber, 0, plateNumber.length);
|
byte[] parkingNo = "A0001".getBytes(); // Todo 车位号
|
System.arraycopy(parkingNo, 0, stuParamIn.szParkingNo, 0, parkingNo.length);
|
stuParamIn.emState = EM_PARKINGSPACE_STATE.EM_PARKINGSPACE_STATE_PARKING.getValue(); // Todo 车位状态(是否有车)
|
stuParamIn.bUnNeedPic = 1; // Todo 是否需要图片 0 不需要 1 需要
|
// 出参
|
NET_OUT_SET_PARKINGSPACE_STATE_INFO stuParamOut = new NET_OUT_SET_PARKINGSPACE_STATE_INFO();
|
|
stuParamIn.write();
|
stuParamOut.write();
|
boolean ret = netsdk.CLIENT_SetParkingSpaceState(m_hLoginHandle, stuParamIn.getPointer(), stuParamOut.getPointer(), 3000);
|
if (!ret) {
|
System.err.println("设置停车位失败: " + ToolKits.getErrorCode());
|
return;
|
}
|
System.out.println("设置停车位成功。");
|
}
|
|
/**
|
* 修改停车记录
|
*/
|
public void TestModifyParkingRecord() throws UnsupportedEncodingException {
|
|
// 入参
|
NET_IN_MODIFY_PARKINGRECORD_INFO stuParamIn = new NET_IN_MODIFY_PARKINGRECORD_INFO();
|
//->旧的记录
|
stuParamIn.stuOld.nChannel = channel; // Todo 旧通道号
|
byte[] oldPlateNumber = "浙A826RW".getBytes(encode); // Todo 旧车牌号
|
System.arraycopy(oldPlateNumber, 0, stuParamIn.stuOld.szPlateNumber, 0, oldPlateNumber.length);
|
byte[] oldParkingNo = "A0001".getBytes(); // Todo 旧车位号
|
System.arraycopy(oldParkingNo, 0, stuParamIn.stuOld.szParkingNo, 0, oldParkingNo.length);
|
//->新的记录
|
stuParamIn.stuNew.nChannel = channel; // Todo 新通道号
|
byte[] newPlateNumber = "沪C0M959".getBytes(encode); // Todo 新车牌号
|
System.arraycopy(newPlateNumber, 0, stuParamIn.stuNew.szPlateNumber, 0, newPlateNumber.length);
|
byte[] newParkingNo = "A0002".getBytes(); // Todo 新车位号
|
System.arraycopy(newParkingNo, 0, stuParamIn.stuNew.szParkingNo, 0, newParkingNo.length);
|
|
// 出参
|
NET_OUT_MODIFY_PARKINGRECORD_INFO stuParamOut = new NET_OUT_MODIFY_PARKINGRECORD_INFO();
|
|
stuParamIn.write();
|
stuParamOut.write();
|
boolean ret = netsdk.CLIENT_ModifyParkingRecord(m_hLoginHandle, stuParamIn.getPointer(), stuParamOut.getPointer(), 3000);
|
if (!ret) {
|
System.err.println("修改停车记录失败: " + ToolKits.getErrorCode());
|
return;
|
}
|
System.out.println("修改停车记录成功。");
|
}
|
|
// 相机状态侦听句柄
|
private NetSDKLib.LLong m_hCameraStateHandle = new NetSDKLib.LLong(0); // 订阅相关
|
|
// 订阅侦听相机状态
|
public void AttachCameraState() {
|
|
this.DetachCameraState(); // 先退订
|
|
NET_IN_CAMERASTATE stuIn = new NET_IN_CAMERASTATE();
|
stuIn.nChannels = 1;
|
stuIn.pChannels = new IntByReference(-1).getPointer(); // 查全部
|
stuIn.cbCamera = ParkingCameraStateCallBack.getSingleInstance(); // 注册回调
|
|
NET_OUT_CAMERASTATE stuOut = new NET_OUT_CAMERASTATE();
|
|
stuIn.write();
|
stuOut.write();
|
m_hCameraStateHandle = netsdk.CLIENT_AttachCameraState(m_hLoginHandle, stuIn.getPointer(), stuOut.getPointer(), 3000);
|
if (m_hCameraStateHandle.longValue() != 0) {
|
System.out.printf("Chn[%d] CLIENT_AttachCameraState Success\n", -1);
|
} else {
|
System.out.printf("Ch[%d] CLIENT_AttachCameraState Failed!LastError = %s\n", -1, ToolKits.getErrorCode());
|
}
|
}
|
|
// 停止订阅侦听相机状态
|
public void DetachCameraState() {
|
if (m_hCameraStateHandle.longValue() != 0) {
|
netsdk.CLIENT_DetachCameraState(m_hCameraStateHandle);
|
}
|
}
|
|
|
|
/////////////////////////////////////// 简易控制台 ///////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
// 初始化测试
|
public void InitTest() {
|
|
ParkingUtils.Init(); // 初始化SDK库
|
this.loginWithHighLevel(); // 高安全登录
|
}
|
|
// 加载测试内容
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
menu.addItem(new CaseMenu.Item(this, "订阅任务", "AttachEventRealLoadPic"));
|
menu.addItem(new CaseMenu.Item(this, "退订任务", "DetachEventRealLoadPic"));
|
menu.addItem(new CaseMenu.Item(this, "选择通道", "setChannelID"));
|
menu.addItem(new CaseMenu.Item(this, "手动抓图(TrafficManualSnap)", "TestParkingSnapshot"));
|
menu.addItem(new CaseMenu.Item(this, "手动抓图(通用 Snapshot 二代协议)", "TestParkingSnapshotCommon"));
|
menu.addItem(new CaseMenu.Item(this, "获取停车超时配置", "TestParkingTimeoutGetConfig"));
|
menu.addItem(new CaseMenu.Item(this, "设置停车超时配置", "TestParkingTimeoutSetConfig"));
|
menu.addItem(new CaseMenu.Item(this, "下发车辆清理接口", "TestRemoveParkingCarInfo"));
|
|
//////////////////////////////////////////// 舟曲新增 ///////////////////////////////////////////////
|
|
menu.addItem(new CaseMenu.Item(this, "事件抓图(SnapByEvent)", "TestSnapPictureByEvent"));
|
menu.addItem(new CaseMenu.Item(this, "设置停车位状态(setParkStatus)", "TestSetParkingStatus"));
|
menu.addItem(new CaseMenu.Item(this, "修改停车记录(modifyParkingInfo)", "TestModifyParkingRecord"));
|
|
//////////////////////////////////////////// 摄像头状态主动回调 //////////////////////////////////////
|
|
menu.addItem(new CaseMenu.Item(this, "摄像头状态订阅(AttachCameraState)", "AttachCameraState"));
|
menu.addItem(new CaseMenu.Item(this, "摄像头状态退订(DetachCameraState)", "DetachCameraState"));
|
|
|
menu.run();
|
}
|
|
// 结束测试
|
public void EndTest() {
|
System.out.println("End Test");
|
this.logOut(); // 退出
|
System.out.println("See You...");
|
|
ParkingUtils.cleanAndExit(); // 清理资源并退出
|
}
|
|
/////////////// 配置登陆地址,端口,用户名,密码 ////////////////////////
|
// private String m_strIpAddr = "172.24.9.9"; // 盒子
|
// private String m_strIpAddr = "172.24.3.56"; // 盒子
|
private String m_strIpAddr = "10.80.9.45"; // 盒子
|
// private String m_strIpAddr = "10.80.9.162"; // 相机
|
// private String m_strIpAddr = "172.27.1.102"; // 相机
|
// private String m_strIpAddr = "10.34.3.63"; // 模拟器
|
|
private int m_nPort = 37777;
|
private String m_strUser = "admin";
|
// private String m_strPassword = "admin123";
|
// private String m_strPassword = "admin123B";
|
private String m_strPassword = "2020";
|
// private String m_strPassword = "admin";
|
//////////////////////////////////////////////////////////////////////
|
|
public static void main(String[] args) {
|
ParkingImageEventDemo demo = new ParkingImageEventDemo();
|
|
if (args.length == 4) {
|
demo.m_strIpAddr = args[0];
|
demo.m_nPort = Integer.parseInt(args[1]);
|
demo.m_strUser = args[2];
|
demo.m_strPassword = args[3];
|
}
|
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
}
|
|
}
|