package com.netsdk.demo.intelligentTraffic;
|
|
import static com.netsdk.lib.Utils.getOsPrefix;
|
|
import com.netsdk.demo.customize.PrintStruct;
|
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.NetSDKLib.CFG_TIME_SCHEDULE;
|
import com.netsdk.lib.NetSDKLib.CFG_TIME_SECTION;
|
import com.netsdk.lib.NetSDKLib.LLong;
|
import com.netsdk.lib.NetSDKLib.NET_CFG_TIME_SCHEDULE;
|
import com.netsdk.lib.NetSDKLib.NET_CFG_TRAFFICSTROBE_INFO;
|
import com.netsdk.lib.NetSDKLib.NET_EM_CFG_TRAFFICSTROBE_CTRTYPE;
|
import com.netsdk.lib.NetSDKLib.NET_POINT;
|
import com.netsdk.lib.NetSDKLib.NET_TSECT;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.enumeration.EM_RELAY_STATE_TYPE;
|
import com.netsdk.lib.enumeration.EM_TRAFFICSTROBE_STATUS;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_DEVICE_WORK_STATE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_GROUND_SENSE_IN_STATE_TYPE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_RADAR_COIL_MATCH_STATE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_RADAR_DETECT_CAR_STATE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_STROBE_ACTION_REASON_TYPE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_STROBE_FAULT_CODE_TYPE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_STROBE_IN_STATE_TYPE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_STROBE_RAIL_STATE_TYPE;
|
import com.netsdk.lib.enumeration.EM_TRAFFIC_SNAP_STROBE_RUN_STATE;
|
import com.netsdk.lib.enumeration.ENUMERROR;
|
import com.netsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
|
import com.netsdk.lib.structure.ALARM_TRAFFICSTROBESTATE_INFO;
|
import com.netsdk.lib.structure.NET_IN_TRAFFIC_SNAP_RADAR_INFO;
|
import com.netsdk.lib.structure.NET_IN_TRAFFIC_SNAP_STROBE_INFO;
|
import com.netsdk.lib.structure.NET_OUT_TRAFFIC_SNAP_RADAR_INFO;
|
import com.netsdk.lib.structure.NET_OUT_TRAFFIC_SNAP_STROBE_INFO;
|
import com.sun.jna.NativeLong;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
/**
|
* @author 251823
|
* @description 智能交通:道闸 雷达
|
* @date 2020/12/14
|
*/
|
public class TrafficStrobeDemo {
|
static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE;
|
static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE;
|
|
private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
|
private static LLong loginHandle = new LLong(0);
|
|
private static class DisconnectCallback implements NetSDKLib.fDisConnect {
|
private static DisconnectCallback instance = new DisconnectCallback();
|
|
private DisconnectCallback() {
|
}
|
|
public static DisconnectCallback getInstance() {
|
return instance;
|
}
|
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("Device[%s:%d] Disconnect!\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect {
|
private static HaveReconnectCallback instance = new HaveReconnectCallback();
|
|
private HaveReconnectCallback() {
|
}
|
|
public static HaveReconnectCallback getInstance() {
|
return instance;
|
}
|
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("Device[%s:%d] HaveReconnected!\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
public void EndTest() {
|
System.out.println("End Test");
|
if (loginHandle.longValue() != 0) {
|
netsdkApi.CLIENT_Logout(loginHandle);
|
}
|
System.out.println("See You...");
|
|
netsdkApi.CLIENT_Cleanup();
|
System.exit(0);
|
}
|
|
public void InitTest() {
|
// 初始化SDK库
|
netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null);
|
|
// 设置断线自动重练功能
|
netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null);
|
|
// 向设备登入
|
int nSpecCap = 0;
|
IntByReference nError = new IntByReference(0);
|
loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password, nSpecCap, null, deviceInfo, nError);
|
|
if (loginHandle.longValue() == 0) {
|
System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port,
|
netsdkApi.CLIENT_GetLastError());
|
EndTest();
|
return;
|
}
|
|
System.out.printf("Login Device [%s:%d] Success. \n", address, port);
|
}
|
|
// 编码格式
|
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";
|
}
|
}
|
|
/**
|
* 订阅报警信息
|
*
|
*/
|
public void startListen() {
|
// 设置报警回调函数
|
netsdkApi.CLIENT_SetDVRMessCallBack(fAlarmAccessDataCB.getInstance(), null);
|
|
// 订阅报警
|
boolean bRet = netsdkApi.CLIENT_StartListenEx(loginHandle);
|
if (!bRet) {
|
System.err.println("订阅报警失败! LastError = 0x%x\n" + netsdkApi.CLIENT_GetLastError());
|
} else {
|
System.out.println("订阅报警成功.");
|
}
|
}
|
|
/**
|
* 报警事件回调
|
*/
|
private static class fAlarmAccessDataCB implements NetSDKLib.fMessCallBack {
|
private fAlarmAccessDataCB() {
|
}
|
|
private static class fAlarmDataCBHolder {
|
private static fAlarmAccessDataCB instance = new fAlarmAccessDataCB();
|
}
|
|
public static fAlarmAccessDataCB getInstance() {
|
return fAlarmDataCBHolder.instance;
|
}
|
|
public boolean invoke(int lCommand, LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP,
|
NativeLong nDevicePort, Pointer dwUser) {
|
switch (lCommand) {
|
case NetSDKLib.NET_ALARM_TRAFFICSTROBESTATE: // 道闸栏状态事件(对应结构体 ALARM_TRAFFICSTROBESTATE_INFO)
|
{
|
ALARM_TRAFFICSTROBESTATE_INFO msg = new ALARM_TRAFFICSTROBESTATE_INFO();
|
ToolKits.GetPointerData(pStuEvent, msg);
|
System.out.println("事件动作:" + msg.bEventAction);
|
System.out.println("事件发生时间:" + msg.stuTime.toString());
|
System.out.println("视频通道号:" + msg.nChannelID);
|
System.out.println("道闸栏状态:" + EM_TRAFFICSTROBE_STATUS.getNoteByValue(msg.emStatus));
|
System.out.println("道闸开关闸原因:"
|
+ EM_TRAFFIC_SNAP_STROBE_ACTION_REASON_TYPE.getNoteByValue(msg.emStrobeActionReason));
|
break;
|
}
|
}
|
return true;
|
}
|
}
|
|
/**
|
* 取消订阅报警信息
|
*
|
* @return
|
*/
|
public void stopListen() {
|
// 停止订阅报警
|
boolean bRet = netsdkApi.CLIENT_StopListen(loginHandle);
|
if (bRet) {
|
System.out.println("取消订阅报警信息.");
|
}
|
}
|
|
/**
|
* 获取智能交通雷达信息
|
*/
|
public void queryTrafficSnapRadarInfo() {
|
// 入参
|
NET_IN_TRAFFIC_SNAP_RADAR_INFO pInBuf = new NET_IN_TRAFFIC_SNAP_RADAR_INFO();
|
pInBuf.nChannel = 0;
|
pInBuf.write();
|
|
// 出参
|
NET_OUT_TRAFFIC_SNAP_RADAR_INFO pOutBuf = new NET_OUT_TRAFFIC_SNAP_RADAR_INFO();
|
pOutBuf.write();
|
|
boolean flg = netsdkApi.CLIENT_QueryDevInfo(loginHandle, NetSDKLib.NET_QUERY_TRAFFIC_SNAP_RADAR,
|
pInBuf.getPointer(), pOutBuf.getPointer(), null, 3000);
|
if (flg) {
|
pOutBuf.read();
|
System.out.println("设备编号:" + new String(pOutBuf.szSerialNo));
|
System.out.println("生产商:" + new String(pOutBuf.szVendor));
|
System.out.println("设备型号:" + new String(pOutBuf.szDevType));
|
System.out.println("工作状态:" + EM_TRAFFIC_SNAP_DEVICE_WORK_STATE.getNoteByValue(pOutBuf.emWorkState));
|
System.out.println("线圈匹配状态:" + EM_TRAFFIC_SNAP_RADAR_COIL_MATCH_STATE.getNoteByValue(pOutBuf.emCoilMatch));
|
System.out.println("实际返回虚警点个数:" + pOutBuf.nRetFakeAlarmPointNum);
|
// 虚警坐标点信息
|
NET_POINT[] stuFakeAlarmPointInfo = pOutBuf.stuFakeAlarmPointInfo;
|
System.out.println("虚警坐标点信息:---------开始---------");
|
for (int i = 0; i < pOutBuf.nRetFakeAlarmPointNum; i++) {
|
System.out.println("坐标点" + i + ":" + stuFakeAlarmPointInfo[i].toString());
|
}
|
System.out.println("虚警坐标点信息:---------结束---------");
|
System.out.println("实际返回虚警点个数:" + pOutBuf.nRelayWorkCount);
|
System.out.println(
|
"检测汽车状态:" + EM_TRAFFIC_SNAP_RADAR_DETECT_CAR_STATE.getNoteByValue(pOutBuf.emDetectCarState));
|
System.out.println("串口号(连接相机的端口号):" + pOutBuf.nCommPort);
|
} else {
|
System.out.println("获取智能交通雷达信息失敗:" + ENUMERROR.getErrorMessage());
|
}
|
|
}
|
|
/**
|
* 获取智能交通道闸信息
|
*/
|
public void queryTrafficSnapStrobeInfo() {
|
// 入参
|
NET_IN_TRAFFIC_SNAP_STROBE_INFO pInBuf = new NET_IN_TRAFFIC_SNAP_STROBE_INFO();
|
pInBuf.nChannel = 0;
|
pInBuf.write();
|
|
// 出参
|
NET_OUT_TRAFFIC_SNAP_STROBE_INFO pOutBuf = new NET_OUT_TRAFFIC_SNAP_STROBE_INFO();
|
pOutBuf.write();
|
|
boolean flg = netsdkApi.CLIENT_QueryDevInfo(loginHandle, NetSDKLib.NET_QUERY_TRAFFIC_SNAP_STROBE,
|
pInBuf.getPointer(), pOutBuf.getPointer(), null, 3000);
|
if (flg) {
|
pOutBuf.read();
|
System.out.println("设备编号:" + new String(pOutBuf.szSerialNo));
|
System.out.println("生产商:" + new String(pOutBuf.szVendor));
|
System.out.println("设备型号:" + new String(pOutBuf.szDevType));
|
System.out.println("工作状态:" + EM_TRAFFIC_SNAP_DEVICE_WORK_STATE.getNoteByValue(pOutBuf.emWorkState));
|
System.out.println("故障代码:" + EM_TRAFFIC_SNAP_STROBE_FAULT_CODE_TYPE.getNoteByValue(pOutBuf.emFaultCode));
|
System.out.println("出厂后开闸运行次数:" + pOutBuf.nOpenStrobeCount);
|
System.out.println("运行状态:" + EM_TRAFFIC_SNAP_STROBE_RUN_STATE.getNoteByValue(pOutBuf.emRunState));
|
System.out.println("道闸开关闸原因:"
|
+ EM_TRAFFIC_SNAP_STROBE_ACTION_REASON_TYPE.getNoteByValue(pOutBuf.emStrobeActionReason));
|
System.out.println("强继电器状态:" + EM_RELAY_STATE_TYPE.getNoteByValue(pOutBuf.emHeavyCurrentRelayState));
|
System.out.println("信号继电器1:" + EM_RELAY_STATE_TYPE.getNoteByValue(pOutBuf.emSignalRelay1State));
|
System.out.println("信号继电器2:" + EM_RELAY_STATE_TYPE.getNoteByValue(pOutBuf.emSignalRelay2State));
|
System.out.println("地感输入信号:"
|
+ EM_TRAFFIC_SNAP_GROUND_SENSE_IN_STATE_TYPE.getNoteByValue(pOutBuf.emGroundSenseInState));
|
System.out.println(
|
"开闸输入状态:" + EM_TRAFFIC_SNAP_STROBE_IN_STATE_TYPE.getNoteByValue(pOutBuf.emStrobeInPutState));
|
System.out.println("栏杆状态:" + EM_TRAFFIC_SNAP_STROBE_RAIL_STATE_TYPE.getNoteByValue(pOutBuf.emRailState));
|
System.out.println("串口号(连接相机的端口号):" + pOutBuf.nCommPort);
|
} else {
|
System.out.println("获取智能交通道闸信息失败:" + ENUMERROR.getErrorMessage());
|
}
|
}
|
|
/**
|
* 设置道闸配置
|
*/
|
public void setTrafficStrobeInfo() {
|
// 入参
|
NET_CFG_TRAFFICSTROBE_INFO trafficStrobeInfo = new NET_CFG_TRAFFICSTROBE_INFO();
|
int emCfgOpType = NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_TRAFFICSTROBE;
|
int nChannelID = 0;
|
trafficStrobeInfo.bEnable = 1;
|
trafficStrobeInfo.nCtrlTypeCount = 2;
|
trafficStrobeInfo.emCtrlType[0] = NET_EM_CFG_TRAFFICSTROBE_CTRTYPE.NET_EM_CFG_CTRTYPE_TRAFFICTRUSTLIST;
|
trafficStrobeInfo.emCtrlType[1] = NET_EM_CFG_TRAFFICSTROBE_CTRTYPE.NET_EM_CFG_CTRTYPE_ALLSNAPCAR;
|
trafficStrobeInfo.stuStationaryOpen.bEnable = 1;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.bEnableHoliday = 1;
|
|
CFG_TIME_SECTION[] stuTimeSection = trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay;
|
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].dwRecordMask = 1;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].nBeginHour = 6;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].nBeginMin = 30;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].nBeginSec = 0;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].nEndHour = 23;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].nEndMin = 0;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[0].nEndSec = 0;
|
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].dwRecordMask = 1;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].nBeginHour = 5;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].nBeginMin = 30;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].nBeginSec = 0;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].nEndHour = 23;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].nEndMin = 0;
|
trafficStrobeInfo.stuStationaryOpen.stTimeShecule.stuTimeSectionWeekDay[1].nEndSec = 4;
|
|
|
trafficStrobeInfo.write();
|
|
if (netsdkApi.CLIENT_SetConfig(loginHandle, emCfgOpType, nChannelID, trafficStrobeInfo.getPointer(),
|
trafficStrobeInfo.size(), 4000, null, null)) {
|
System.out.println("SetConfig Succeed!");
|
} else {
|
System.err.println("SetConfig Failed!" + ToolKits.getErrorCode() + "|" + ENUMERROR.getErrorMessage());
|
}
|
}
|
|
/**
|
* 获取道闸配置
|
*/
|
public void getTrafficStrobeInfo() {
|
// 入参
|
NET_CFG_TRAFFICSTROBE_INFO trafficStrobeInfo = new NET_CFG_TRAFFICSTROBE_INFO();
|
int emCfgOpType = NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_TRAFFICSTROBE;
|
int nChannelID = 0;
|
trafficStrobeInfo.write();
|
if (netsdkApi.CLIENT_GetConfig(loginHandle, emCfgOpType, nChannelID, trafficStrobeInfo.getPointer(),
|
trafficStrobeInfo.size(), 4000, null)) {
|
trafficStrobeInfo.read();
|
System.out.println("使能:" + trafficStrobeInfo.bEnable);
|
System.out.println("道闸控制方式个数:" + trafficStrobeInfo.nCtrlTypeCount);
|
for (int i = 0; i < trafficStrobeInfo.nCtrlTypeCount; i++) {
|
System.out.println("道闸控制方式" + i + ":" + trafficStrobeInfo.emCtrlType[i]);
|
}
|
System.out.println("所有车开闸种类个数:" + trafficStrobeInfo.nAllSnapCarCount);
|
for (int i = 0; i < trafficStrobeInfo.nAllSnapCarCount; i++) {
|
System.out.println("所有车开闸种类" + i + ":" + trafficStrobeInfo.emAllSnapCar[i]);
|
}
|
System.out.println("负责命令开闸的平台IP:" + new String(trafficStrobeInfo.szOrderIP));
|
System.out.println("平台IP与设备断开连接后,设备采用的开闸方式:" + trafficStrobeInfo.emCtrlTypeOnDisconnect);
|
|
// 道闸常开配置
|
System.out.println("道闸常开配置-使能:" + trafficStrobeInfo.stuStationaryOpen.bEnable);
|
// 常开模式执行时间段
|
CFG_TIME_SCHEDULE stTimeShecule = trafficStrobeInfo.stuStationaryOpen.stTimeShecule;
|
System.out.println("是否支持节假日配置,默认为不支持:" + stTimeShecule.bEnableHoliday);
|
CFG_TIME_SECTION[] times = stTimeShecule.stuTimeSectionWeekDay;
|
for (int i = 0; i < times.length; i++) {
|
System.out.println("时间段" + i + ":" + times[i].startTime() + "--" + times[i].endTime());
|
}
|
|
} else {
|
System.err.println("GetConfig Failed!" + ToolKits.getErrorCode() + "|" + ENUMERROR.getErrorMessage());
|
}
|
}
|
|
/******************************** 测试控制台 ***************************************/
|
|
// 配置登陆地址,端口,用户名,密码
|
String address = "172.24.31.180"; // 172.24.1.229 172.24.31.180
|
int port = 37777;
|
String username = "admin";
|
String password = "admin123";
|
|
public static void main(String[] args) {
|
TrafficStrobeDemo demo = new TrafficStrobeDemo();
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
|
}
|
|
/**
|
* 加载测试内容
|
*/
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
menu.addItem(new CaseMenu.Item(this, "获取智能交通雷达信息", "queryTrafficSnapRadarInfo"));
|
menu.addItem(new CaseMenu.Item(this, "获取智能交通道闸信息", "queryTrafficSnapStrobeInfo"));
|
menu.addItem(new CaseMenu.Item(this, "设置道闸配置", "setTrafficStrobeInfo"));
|
menu.addItem(new CaseMenu.Item(this, "获取道闸配置", "getTrafficStrobeInfo"));
|
menu.addItem(new CaseMenu.Item(this, "订阅报警信息", "startListen"));
|
menu.addItem(new CaseMenu.Item(this, "取消订阅报警信息", "stopListen"));
|
menu.run();
|
}
|
|
/******************************** 结束 ***************************************/
|
}
|