clear cached

camera_merge
qiushui 4 years ago
parent e2fe790dfe
commit feb44c711e

@ -0,0 +1,621 @@

【总述】
1. Java库路径 src\main\java\com\netsdk\lib
NetSDKLib.java Java库
ToolKits.java 封装小工具文件
Utils.java 判断运行平台,指定加载库的路径文件
SDK所有回调都是子线程不要在回调里刷新UI以及做一些耗时操作。建议回调函数对象写成全局静态防止被系统回收。
2. 动态库路径:
libs\win64 win64的动态库
run_win32.bat win32运行脚本运行的jar包对应jdk 1.6此脚本指定了jdk
run_win64.bat win64运行脚本运行的jar包对应jdk 1.8此脚本指定了jdk
3. 中英文配置文件res\
4. demo路径
考勤机src\main\java\com\netsdk\demo\frame\Attendance
主动注册src\main\java\com\netsdk\demo\frame\AutoRegister
人脸识别src\main\java\com\netsdk\demo\frame\FaceRecognition
人脸开门(人脸闸机)src\main\java\com\netsdk\demo\frame\Gate
报警监听src\main\java\com\netsdk\demo\frame\AlarmListen.java
抓图src\main\java\com\netsdk\demo\frame\CapturePicture.java
设备控制src\main\java\com\netsdk\demo\frame\DeviceControl.java
设备搜索和初始化src\main\java\com\netsdk\demo\frame\DeviceSearchAndInit.java
下载录像src\main\java\com\netsdk\demo\frame\DownLoadRecord.java
云台src\main\java\com\netsdk\demo\frame\PTZControl.java
实时预览src\main\java\com\netsdk\demo\frame\RealPlay.java
对讲src\main\java\com\netsdk\demo\frame\Talk.java
智能交通src\main\java\com\netsdk\demo\frame\TrafficEvent.java
热成像src\main\java\com\netsdk\demo\frame\ThermalCamera.java
VTO:src\main\java\com\netsdk\demo\VTO
点阵屏配置:src\main\java\com\netsdk\demo\frame\FaceRecognition\matrixScreen.java
以上是功能的界面实现接口实现路径src\main\java\com\netsdk\demo\module\
5. 运行jar包target\
6. 开发工具Ecplise
7. 错误码对应文件src\main\java\com\netsdk\common\ErrorCode.java
8. package.bat pom.xml 打包脚本
9. jna.jar 的版本5.4.0
///////////////////////////////////////////////////////////////////
【设备搜索和初始化】
1. 功能概要:
设备搜索和设备初始化功能。
2. Demo中涉及到的NetSDK接口如下
1设备组播和广播搜索
开始搜索接口CLIENT_StartSearchDevices
停止搜索接口CLIENT_StopSearchDevices
2设备IP单播搜索
开始搜索接口CLIENT_SearchDevicesByIPs
停止搜索接口CLIENT_StopSearchDevices
3. 注意事项:
CLIENT_SearchDevicesByIPs 接口每次最多搜索256个
4. 相关接口:
CLIENT_Init 初始化NetSDK
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
fSearchDevicesCB 设备搜索回调
///////////////////////////////////////////////////////////////////
【主动注册】
1. 功能概要:
主动注册主要用于批量登录设备。
此Demo里集合了 实时预览,对讲、抓图功能。
2. Demo中涉及到的NetSDK接口如下
1主动注册功能
开启服务接口CLIENT_ListenServer
停止服务接口CLIENT_StopListenServer
2主动注册登录/登出功能
登录接口CLIENT_LoginWithHighLevelSecurity
登出接口CLIENT_Logout
3实时预览功能
开始预览接口CLIENT_RealPlayEx
停止预览接口CLIENT_StopRealPlayEx
4抓图功能
设置抓图回调接口CLIENT_SetSnapRevCallBack
远程抓图接口CLIENT_SnapPictureEx
5对讲功能
设置模式接口CLIENT_SetDeviceMode
开始对讲接口CLIENT_StartTalkEx
停止对讲接口CLIENT_StopTalkEx
PC端录音接口CLIENT_RecordStart
结束PC端录音接口CLIENT_RecordStop
将收到的本地PC端检测到的声卡数据发送给设备端接口CLIENT_TalkSendData
将收到的设备端发送过来的语音数据传给SDK解码播放接口CLIENT_AudioDecEx
6配置设备主动注册信息
[1]IP登录/登出设备功能
登录接口CLIENT_LoginWithHighLevelSecurity
登出接口CLIENT_Logout
[2]注册信息配置功能
获取设备的主动注册信息CLIENT_GetNewDevConfig CLIENT_ParseData 对应命令NetSDKLib.CFG_CMD_DVRIP
设置设备的主动注册信息CLIENT_PacketData CLIENT_SetNewDevConfig 对应命令NetSDKLib.CFG_CMD_DVRIP
3. 注意事项:
1在通过开启服务收到设备上报的设备信息后需要登录设备。
此处的主动注册登录设备跟通用的IP登录设备的区别是入参需要填设备ID、登录方式tcpSpecCap不同
2配置设备的主动注册信息可以通过本Demo设置也可以通过Web设置。
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
fServiceCallBack 启动服务的回调,用于接收设备注册上来的设备信息
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【人脸识别】
1. 功能概要:
人脸设备功能主要用于IVSS、IPC-FR、IPC-FD(只支持人脸检测事件)
包含功能1人脸库的增、删、改查
2人员的增、删、改、查
3按人脸库布控、撤控
4人脸识别和人脸检测事件
5实时预览
2. Demo中涉及到的NetSDK接口如下
1人脸库功能
查询人脸库接口CLIENT_FindGroupInfo
添加人脸库接口CLIENT_OperateFaceRecognitionGroup 对应枚举 EM_OPERATE_FACERECONGNITION_GROUP_TYPE.NET_FACERECONGNITION_GROUP_ADD
修改人脸库接口CLIENT_OperateFaceRecognitionGroup 对应枚举 EM_OPERATE_FACERECONGNITION_GROUP_TYPE.NET_FACERECONGNITION_GROUP_MODIFY
删除人脸库接口CLIENT_OperateFaceRecognitionGroup 对应枚举 EM_OPERATE_FACERECONGNITION_GROUP_TYPE.NET_FACERECONGNITION_GROUP_DELETE
2人员功能
查询人员信息接口CLIENT_StartFindFaceRecognition CLIENT_DoFindFaceRecognition CLIENT_StopFindFaceRecognition
添加人员信息接口CLIENT_OperateFaceRecognitionDB 对应枚举 EM_OPERATE_FACERECONGNITIONDB_TYPE.NET_FACERECONGNITIONDB_ADD
修改人员信息接口CLIENT_OperateFaceRecognitionDB 对应枚举 EM_OPERATE_FACERECONGNITIONDB_TYPE.NET_FACERECONGNITIONDB_MODIFY
删除人员信息接口CLIENT_OperateFaceRecognitionDB 对应枚举 EM_OPERATE_FACERECONGNITIONDB_TYPE.NET_FACERECONGNITIONDB_DELETE
查询到的人员图片是一个地址可以用下载接口下载CLIENT_DownloadRemoteFile
3布控和撤控功能
按人脸库布控接口CLIENT_FaceRecognitionPutDisposition
按人脸库撤控接口CLIENT_FaceRecognitionDelDisposition
4人脸识别和人脸检测事件功能
智能订阅接口CLIENT_RealLoadPictureEx
停止订阅接口CLIENT_StopLoadPic
人脸识别事件NetSDKLib.EVENT_IVS_FACERECOGNITION
人脸检测事件NetSDKLib.EVENT_IVS_FACEDETECT
5实时预览功能
显示规则框接口CLIENT_RenderPrivateData
开始预览接口CLIENT_RealPlayEx
停止预览接口CLIENT_StopRealPlayEx
3. 注意事项:
1人脸图片只支持JPG格式
IPC支持的图片最大为128KB
IVSS支持的图片最大为256KB
2IPC-FD不支持人脸识别事件只支持人脸检测事件
3IPC最大支持的人脸库个数为5
IVSS最大支持的人脸库个数为20
4人员信息的查询
[1]先调用CLIENT_StartFindFaceRecognition获取查询句柄
[2]在[1]的基础上,根据偏移量循环查询, 每次查询的最大个数为20
[3]调用CLIENT_StopFindFaceRecognition关闭查询
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
fAnalyzerDataCallBack 订阅回调,接收人脸识别和人脸检测事件
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【人脸开门】主要适配设备为ASI设备
1. 功能概要:
主要功能有:门禁事件
卡的增、删、改、查、清空
人脸的增、删、改、清空(人脸查询到的是MD5不是图片地址和图片信息所以人脸查询的实现没意义不提供)
2. Demo中涉及到的NetSDK接口如下
1门禁事件
开始订阅接口CLIENT_RealLoadPictureEx
取消订阅接口CLIENT_StopLoadPic
门禁事件NetSDKLib.EVENT_IVS_ACCESS_CTL
2卡和人脸操作
添加卡信息CLIENT_ControlDevice 接口里的对应命令CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERT 入参里的记录集类型EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD
修改卡信息CLIENT_ControlDevice 接口里的对应命令CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATE 入参里的记录集类型EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD
删除卡信息CLIENT_ControlDevice 接口里的对应命令CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE 入参里的记录集类型EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD
清空卡信息CLIENT_ControlDevice 接口里的对应命令CtrlType.CTRLTYPE_CTRL_RECORDSET_CLEAR 入参里的记录集类型EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD
查询卡信息:[1]调用CLIENT_FindRecord获取查询句柄 [2]调用CLIENT_FindNextRecord循环查询 [3]查询结束调用CLIENT_FindRecordClose关闭查询
添加人脸CLIENT_FaceInfoOpreate 接口里的对应命令EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_ADD
修改人脸CLIENT_FaceInfoOpreate 接口里的对应命令EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_UPDATE
删除人脸CLIENT_FaceInfoOpreate 接口里的对应命令EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_REMOVE
清空人脸CLIENT_FaceInfoOpreate 接口里的对应命令EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_CLEAR
3. 注意事项:
查询卡信息是根据每次查询的个数循环查询(不像人脸识别里,是根据偏移量)
4. 相关接口:
CLIENT_Init 初始化NetSDK
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
fAnalyzerDataCallBack 订阅回调,接收门禁事件
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【双通道预览】
1. 功能概要:
主要功能有:双通道实时预览
2. Demo中涉及到的NetSDK接口如下
1实时预览功能
开始预览接口CLIENT_RealPlayEx
停止预览接口CLIENT_StopRealPlayEx
3. 注意事项:
4. 相关接口:
CLIENT_Init 初始化NetSDK
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【云台控制】
1. 功能概要:
主要功能有:实时预览、远程抓图、八个方向控制、变倍、变焦、光圈
2. Demo中涉及到的NetSDK接口如下
1实时预览功能
开始预览接口CLIENT_RealPlayEx
停止预览接口CLIENT_StopRealPlayEx
2远程抓图
设置抓图回调接口CLIENT_SetSnapRevCallBack
下发抓图命令接口CLIENT_SnapPictureEx
3八个方向控制、变倍、变焦、光圈
CLIENT_DHPTZControlEx 接口一样对应的命令不一样具体参考DemoDemo里写的很详细
3. 注意事项:
4. 相关接口:
CLIENT_Init 初始化NetSDK
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
fSnapRev 抓图回调,用于接收图片信息
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【下载录像】
1. 功能概要:
主要功能有:按时间下载录像、按文件下载录像、设置下载录像的码流类型、查询录像
2. Demo中涉及到的NetSDK接口如下
1设置下载录像的码流类型
接口CLIENT_SetDeviceMode 对应命令EM_USEDEV_MODE.NET_RECORD_STREAM_TYPE
2按时间下载
开始下载接口CLIENT_DownloadByTimeEx
停止下载接口CLIENT_StopDownload
3按文件下载
查询录像接口CLIENT_QueryRecordFile
开始下载接口CLIENT_DownloadByTimeEx
停止下载接口CLIENT_StopDownload
3. 注意事项:
1下载录像格式为dav
2按文件下载是先查询录像文件再调用按时间下载接口下载录像
4. 相关接口:
CLIENT_Init 初始化NetSDK
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
fTimeDownLoadPosCallBack 下载回调,用于接收下载录像的进度
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【智能交通】
1. 功能概要:
主要功能有:实时预览、手动抓拍、出入口开闸、智能订阅交通事件
2. Demo中涉及到的NetSDK接口如下
1实时预览功能
开始预览接口CLIENT_RealPlayEx
停止预览接口CLIENT_StopRealPlayEx
2手动抓拍
CLIENT_ControlDeviceEx 对应命令CtrlType.CTRLTYPE_MANUAL_SNAP
3出入口开闸
CLIENT_ControlDeviceEx 对应命令CtrlType.CTRLTYPE_CTRL_OPEN_STROBE
4订阅交通事件
开始订阅接口CLIENT_RealLoadPictureEx
停止订阅接口CLIENT_StopLoadPic
3. 注意事项:
调用手动抓拍接口,会触发手动抓拍事件
4. 相关接口:
CLIENT_Init 初始化NetSDK
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
fAnalyzerDataCallBack 订阅回调,用于接收智能交通的各种事件
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【语音对讲功能】
1. 功能概要:
主要功能有:直连对讲、转发模式对讲
2. Demo中涉及到的NetSDK接口如下
1 设置设备对讲模式CLIENT_SetDeviceMode
对讲前需要设置若干对讲方式:
设置语音对讲编码格式对应命令NetSDKLib.EM_USEDEV_MODE.NET_TALK_ENCODE_TYPE
设置语音对讲喊话参数对应命令NetSDKLib.EM_USEDEV_MODE.NET_TALK_SPEAK_PARAM
设置对讲是否为转发模式对应命令NetSDKLib.EM_USEDEV_MODE.NET_TALK_TRANSFER_MODE
转发模式时设置转发通道对应命令NetSDKLib.EM_USEDEV_MODE.NET_TALK_TALK_CHANNEL
2 向设备发送用户的音频数据CLIENT_TalkSendData
3 对设备发来的音频数据解码CLIENT_AudioDecEx
4 向设备发起语音对讲请求CLIENT_StartTalkEx
对讲回调实现pfAudioDataCallBack接口
回调中byAudioFlag为0调CLIENT_TalkSendData为1调CLIENT_AudioDecEx处理音频数据
5 开始PC端录音CLIENT_RecordStart
6 结束PC端录音CLIENT_RecordStop
7 停止语音对讲CLIENT_StopTalkEx
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【设备控制功能】
1. 功能概要:
主要功能有:设置重启、获取设备当前时间、设置设备时间
2. Demo中涉及到的NetSDK接口如下
1 设备控制CLIENT_ControlDevice
控制类型参数emType为CtrlType.CTRLTYPE_CTRL_REBOOT时下发重启设备命令
2 设置设备当前时间CLIENT_SetupDeviceTime
3 查询设备当前时间CLIENT_QueryDeviceTime
3. 注意事项:
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【抓图功能】
1. 功能概要:
主要功能有:实时预览、抓图(包含本地抓图、远程抓图和定时抓图)
2. Demo中涉及到的NetSDK接口如下
1 实时预览功能
开始预览接口CLIENT_RealPlayEx
停止预览接口CLIENT_StopRealPlayEx
2 抓图功能
本地抓图CLIENT_CapturePictureEx
设置抓图回调CLIENT_SetSnapRevCallBack
回调实现fSnapRev接口
远程抓图、定时抓图、停止定时抓图CLIENT_SnapPictureEx
抓图模式:-1:表示停止抓图, 0表示请求一帧远程抓图, 1表示定时发送请求
3. 注意事项:
本地抓图需要先实时预览
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【报警监听功能】
1. 功能概要:
主要功能有:外部报警、移动侦测、视频遮挡、视频丢失、硬盘满、硬盘坏的报警上报
2. Demo中涉及到的NetSDK接口如下
1 设置报警回调CLIENT_SetDVRMessCallBack
回调实现fMessCallBack接口
2 向设备订阅报警CLIENT_StartListenEx
3 停止订阅报警CLIENT_StopListen
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【考勤机功能】
1. 功能概要:
主要功能有:门禁事件信息展示
人员记录集的新增/删除/更新/获取/查询
通过用户ID对指纹记录集的新增/删除/获取
通过指纹ID指纹记录集获取/删除
指纹采集功能
2. Demo中涉及到的NetSDK接口如下
1 实时上传智能分析数据CLIENT_RealLoadPictureEx
回调实现fAnalyzerDataCallBack接口
2 停止上传智能分析数据CLIENT_StopLoadPic
3 考勤新增加用户CLIENT_Attendance_AddUser
4 考勤获取单个用户信息CLIENT_Attendance_GetUser
5 考勤修改用户信息CLIENT_Attendance_ModifyUser
6 考勤删除用户CLIENT_Attendance_DelUser
7 检索考勤用户信息CLIENT_Attendance_FindUser
8 通过用户ID插入指纹数据CLIENT_Attendance_InsertFingerByUserID
9 通过用户ID查找该用户下的所有指纹数据CLIENT_Attendance_GetFingerByUserID
10删除单个用户下所有指纹数据CLIENT_Attendance_RemoveFingerByUserID
11通过指纹ID获取指纹数据CLIENT_Attendance_GetFingerRecord
12通过指纹ID删除指纹数据CLIENT_Attendance_RemoveFingerRecord
13设备控制CLIENT_ControlDeviceEx
控制类型参数emType为CtrlType.CTRLTYPE_CTRL_CAPTURE_FINGER_PRINT时下发指纹采集命令
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【热成像功能】
1. 功能概要:
主要功能有:测温点参数查询、测温项参数查询、热成像温度查询、温度分布数据获取和保存
2. Demo中涉及到的NetSDK接口如下
1) 查询测温点的参数值: CLIENT_QueryDevInfo
对应枚举NetSDKLib.EM_QUERY_DEV_INFO.RADIOMETRY_POINT_TEMPER
2) 查询测温项的参数值: CLIENT_QueryDevInfo
对应枚举NetSDKLib.EM_QUERY_DEV_INFO.RADIOMETRY_TEMPER
3) 查询热成像温度枚举值为NetSDKLib.EM_FIND.RADIOMETRY:
开始查询CLIENT_StartFind
继续查询CLIENT_DoFind
结束查询CLIENT_StopFind
4) 温度分布数据获取
订阅CLIENT_RadiometryAttach
通知开始获取热图数据CLIENT_RadiometryFetch
热图数据解压与转换CLIENT_RadiometryDataParse
取消订阅CLIENT_RadiometryDetach
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【点阵屏下发功能】
1. 功能概要:点阵屏信息下发
2. Demo中涉及到的NetSDK接口如下
1下发点阵屏信息接口CLIENT_ControlDevice
对应枚举CTRLTYPE_CTRL_SET_PARK_INFO
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【VTO功能】
1. 功能概要:
主要功能有:卡操作,开门关门,语音通话,拉流,指纹采集,事件上报
2. Demo中涉及到的NetSDK接口如下
1查询
CLIENT_FindRecordClose //结束查询
CLIENT_FindRecord//开始查询记录
CLIENT_FindNextRecord//查询记录
CLIENT_QueryDevState//获取指纹信息
2)卡操作
CLIENT_ControlDevice//卡信息操作
CLIENT_FaceInfoOpreate//人脸操作
3)开门关门
CLIENT_ControlDeviceEx//开关门
4)语音通话
CLIENT_SetDeviceMode// 设置语音对讲编码格式
CLIENT_SetDeviceMode// 设置语音对讲喊话参数,设置语音对讲是否为转发模式
CLIENT_StartTalkEx//开始语音通话
CLIENT_StopTalkEx//停止通话
5)拉流
CLIENT_RealPlayEx//实时预览
CLIENT_StopRealPlayEx//停止预览
6)采集指纹
CLIENT_SetDVRMessCallBack//设置回调函数
CLIENT_StartListenEx//订阅报警信息,通过指纹事件获取指纹数据
7)事件上报
CLIENT_StartListenEx//订阅普通报警事件
CLIENT_RealloadPicEx//订阅智能报警事件
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出
///////////////////////////////////////////////////////////////////
【客流量统计功能】
1. 功能概要:
主要功能有:客流量统计
2. Demo中涉及到的NetSDK接口如下
1客流量统计订阅CLIENT_AttachVideoStatSummary
2取消客流量统计订阅CLIENT_DetachVideoStatSummary
3设备控制接口CLIENT_ControlDevice
对应的枚举值CtrlType.CTRLTYPE_CTRL_CLEAR_SECTION_STAT
4) 客流量统计接口回调: fVideoStatSumCallBack
3. 注意事项:
SDK所有回调都是子线程JNA是弱引用建议回调函数对象写成全局静态防止被系统回收
4. 相关接口:
CLIENT_Init 初始化NetSDK并且设置断线回调fDisConnect当设备断线后回调里会收到信息
CLIENT_SetNetworkParam 设置登录网络环境
CLIENT_SetAutoReconnect 设置重连回调fHaveReConnect当设备断线后会向设备发送心跳包自动连接设备当重连成功后回调里会收到信息
CLIENT_Cleanup 释放NetSDK缓存
CLIENT_LogOpen 打开日志
CLIENT_LogClose 关闭日志
CLIENT_LoginWithHighLevelSecurity 登录
CLIENT_Logout 登出

@ -0,0 +1,81 @@
#!/bin/bash
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export JRE_HOME=/${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=duoji.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh ums.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep ${APP_NAME}|grep -v grep|awk '{print $2}'`
#如果不存在返回1存在返回0
if [[ -z "${pid}" ]]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [[ $? -eq 0 ]]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -jar -Xms256m -Xmx256m /home/work/lia/duoji/${APP_NAME} --spring.profiles.active=prod >duoji.out 2>&1 &
# nohup java -jar ${APP_NAME}
fi
}
#停止方法
stop(){
is_exist
if [[ $? -eq "0" ]]; then
kill -9 ${pid}
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [[ $? -eq "0" ]]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,706 @@
#ifndef IVS_DRAWER_H
#define IVS_DRAWER_H
#include <time.h>
#ifdef _WIN32
#define IVSDRAWER_API
#define CALLMETHOD __stdcall
#else
#define IVSDRAWER_API
#define CALLMETHOD
#endif
#ifdef _WIN32
#include <windows.h>
#define IVS_BOOL BOOL
#define IVS_WND_REF HWND
#define IVS_DC_REF HDC
#define IVS_COLOR COLORREF
#define IVS_RECT RECT
typedef POINT IVSPOINT;
#else
#define IVS_BOOL int
#define IVS_WND_REF void*
#define IVS_DC_REF void*
typedef struct __IVS_MAC_WND
{
int nWidth;
int nHeight;
}IVS_WND;
typedef struct __IVS_COLOR
{
float cgred;
float cggreen;
float cgblue;
}IVS_COLOR;
typedef struct __IVSPOINT
{
float x;
float y;
}IVSPOINT;
typedef struct __IVS_RECT
{
float left;
float bottom;
float right;
float top;
}IVS_RECT;
#endif
#ifdef _WIN32
#define INT64 __int64
#else
#define DWORD unsigned int
#define INT64 long long
#endif
typedef enum
{
SHOW_NONE = 0,
SHOW_RULE = (1 << 0),
SHOW_ALARM = (1 << 1),
SHOW_TRACK = (1 << 2),
SHOW_ALL = (SHOW_RULE | SHOW_ALARM | SHOW_TRACK),
}SHOW_TYPE;
typedef enum
{
DRAW_JSON = 0,
DRAW_TRACK,
DRAW_ALARM,
DRAW_RULE,
DRAW_ALARMRULE,
DRAW_ALARMEX,
DRAW_TRACKEX,
DRAW_MOVE_CHECK,
DRAW_TEST = 9,
DRAW_WEB_RULE = 11,
DRAW_WEB_ALARM,
DRAW_FLOW_INFO,
DRAW_TRACKEX2,
DRAW_WUXI235_TRACKEX2,
DRAW_TRACKEXA1,
DRAW_TRACKEX2_TYPE_HUMAN,
DRAW_TRACKEX2_TYPE_VEHICLE,
DRAW_TRACKEX2_TYPE_NONMOTOR,
DRAW_TRACKEX2_TYPE_SHOPPRESENCE,
DRAW_TRACKEX2_TYPE_FLOWBUSINESS,
DRAW_INTELFLOW,
DRAW_SMARTMOTION,
DRAW_END,
}DRAW_TYPE;
typedef enum
{
IVS_LINGER = 0,
IVS_TRACKTAIL, // 轨迹尾巴
IVS_GET_OBJECT,
IVS_DISABLE_VIDEO_TIME, // 禁止视频浓缩的时间,默认开启
IVS_DISABLE_VIDEO_OBJECT,
IVS_TRACK_OBJECT = 6,
IVS_SET_PEN_HEIGHT,
IVS_TRACK_OBJECT_EX = 8,
}IVS_CMD_TYPE;
typedef enum
{
DRAW_PEN_DEFAULT = -1,
DRAW_PEN_SOLID = 0,
DRAW_PEN_DASH,
DRAW_PEN_DOT,
DRAW_PEN_DASHDOT,
DRAW_PEN_DASHDOTDOT,
DRAW_PEN_NULL,
DRAW_PEN_INSIDEFRAME,
DRAW_PEN_USERSTYLE,
DRAW_PEN_ALTERNATE,
}DRAW_PEN_STYLE;
#define IVS_MAX_ACTION_NUM 4
#define IVS_MAX_EVENT_NUM 64
#define IVS_MAX_POLYLINE_NUM 32
#define IVS_MAX_OBJECT_NUM 64
#define IVS_NAME_NUM 128
// 二维空间点
typedef struct
{
short nx;
short ny;
} DH_IVS_SPOINT, *LPDH_IVS_SPOINT;
// 物体对应图片文件信息
typedef struct
{
DWORD dwOffSet; // 文件在二进制数据块中的偏移位置, 单位:字节
DWORD dwFileLenth; // 文件大小, 单位:字节
WORD wWidth; // 图片宽度, 单位:像素
WORD wHeight; // 图片高度, 单位:像素
char* pszFilePath; // 鉴于历史原因,该成员只在事件上报时有效
// 文件路径
// 用户使用该字段时需要自行申请空间进行拷贝保存
BYTE bIsDetected; // 图片是否算法检测出来的检测过的提交识别服务器时,
// 则不需要再时检测定位抠图,1:检测过的,0:没有检测过
BYTE bReserved[3]; // 预留字节数
int nFilePathLen; // 文件路径长度 既pszFilePath 用户申请的大小
DH_IVS_SPOINT stuPoint; // 小图左上角在大图的位置,使用绝对坐标系
}DH_IVS_PIC_INFO;
typedef struct tagDH_IVS_TIME_EX
{
DWORD dwYear; // 年
DWORD dwMonth; // 月
DWORD dwDay; // 日
DWORD dwHour; // 时
DWORD dwMinute; // 分
DWORD dwSecond; // 秒
DWORD dwMillisecond; // 毫秒
DWORD dwUTC; // utc时间(获取时0表示无效非0有效 下发无效)
DWORD dwReserved[1]; // 预留字段
} DH_IVS_TIME_EX,*LPDH_IVS_TIME_EX;
// 区域各边距按整长8192的比例
typedef struct
{
long left;
long top;
long right;
long bottom;
} DH_IVS_LRECT, *LPDH_IVS_LRECT;
#pragma pack(push)
#pragma pack(4)
// 视频分析物体信息结构体
typedef struct
{
int nObjectID; // 物体ID,每个ID表示一个唯一的物体
char szObjectType[128]; // 物体类型
int nConfidence; // 置信度(0~255),值越大表示置信度越高
int nAction; // 物体动作:1:Appear 2:Move 3:Stay 4:Remove 5:Disappear 6:Split 7:Merge 8:Rename
DH_IVS_LRECT BoundingBox; // 包围盒
DH_IVS_SPOINT Center; // 物体型心
int nPolygonNum; // 多边形顶点个数
DH_IVS_SPOINT Contour[16]; // 较精确的轮廓多边形
DWORD rgbaMainColor; // 表示车牌、车身等物体主要颜色;按字节表示,分别为红、绿、蓝和透明度,例如:RGB值为(0,255,0),透明度为0时, 其值为0x00ff0000.
char szText[128]; // 物体上相关的带0结束符文本,比如车牌,集装箱号等等
char szObjectSubType[62]; // 物体子类别,根据不同的物体类型,可以取以下子类型:
WORD wColorLogoIndex; // 车标索引
WORD wSubBrand; // 车辆子品牌 需要通过映射表得到真正的子品牌 映射表详见开发手册
BYTE byReserved1;
bool bPicEnble; // 是否有物体对应图片文件信息
DH_IVS_PIC_INFO stPicInfo; // 物体对应图片信息
bool bShotFrame; // 是否是抓拍张的识别结果
bool bColor; // 物体颜色(rgbaMainColor)是否可用
BYTE byReserved2;
BYTE byTimeType; // 时间表示类型,详见EM_TIME_TYPE说明
DH_IVS_TIME_EX stuCurrentTime; // 针对视频浓缩,当前时间戳(物体抓拍或识别时,会将此识别智能帧附在一个视频帧或jpeg图片中,此帧所在原始视频中的出现时间)
DH_IVS_TIME_EX stuStartTime; // 开始时间戳(物体开始出现时)
DH_IVS_TIME_EX stuEndTime; // 结束时间戳(物体最后出现时)
DH_IVS_LRECT stuOriginalBoundingBox; // 包围盒(绝对坐标)
DH_IVS_LRECT stuSignBoundingBox; // 车标坐标包围盒
DWORD dwCurrentSequence; // 当前帧序号(抓下这个物体时的帧)
DWORD dwBeginSequence; // 开始帧序号(物体开始出现时的帧序号)
DWORD dwEndSequence; // 结束帧序号(物体消逝时的帧序号)
INT64 nBeginFileOffset; // 开始时文件偏移, 单位: 字节(物体开始出现时,视频帧在原始视频文件中相对于文件起始处的偏移)
INT64 nEndFileOffset; // 结束时文件偏移, 单位: 字节(物体消逝时,视频帧在原始视频文件中相对于文件起始处的偏移)
BYTE byColorSimilar[8]; // 物体颜色相似度,取值范围0-100,数组下标值代表某种颜色,详见EM_COLOR_TYPE
BYTE byUpperBodyColorSimilar[8]; // 上半身物体颜色相似度(物体类型为人时有效)
BYTE byLowerBodyColorSimilar[8]; // 下半身物体颜色相似度(物体类型为人时有效)
int nRelativeID; // 相关物体ID
char szSubText[20]; // "ObjectType"为"Vehicle"或者"Logo"时,表示车标下的某一车系,比如奥迪A6L,由于车系较多,SDK实现时透传此字段,设备如实填写。
WORD wBrandYear; // 车辆品牌年款 需要通过映射表得到真正的年款 映射表详见开发手册
} DH_IVS_OBJECT_INFO;
#pragma pack(pop)
typedef struct IVS_CONFIG_EVENT
{
char szEventName[IVS_NAME_NUM]; // 事件名称,详见"事件类型列表"
char szRuleName[IVS_NAME_NUM]; // 规则名称,不同规则不能重名
DH_IVS_OBJECT_INFO stuObject;
char Context[28];
int alarmAction; // 与NetSDK定义一致
int alarmType;
}IVS_CONFIG_EVENT_INFO;
typedef struct IVS_CONFIG_EVENTEX
{
char szEventName[IVS_NAME_NUM]; // 事件名称,详见"事件类型列表"
char szRuleName[IVS_NAME_NUM]; // 规则名称,不同规则不能重名
char Context[28];
int alarmAction; // 与NetSDK定义一致
int alarmType;
int nObjectNum;
DH_IVS_OBJECT_INFO stuObject[IVS_MAX_OBJECT_NUM]; // 检测到的物体
int nContext; // 该字段未用,作为大类字段
void* pContext;
}IVS_CONFIG_EVENT_INFOEX;
typedef struct
{
int nEventsNum; // 视频分析规则数
IVS_CONFIG_EVENT_INFO stuEventInfo[IVS_MAX_EVENT_NUM]; // 事件信息
}IVS_CFG_ANALYSEVENTS_INFO;
typedef struct
{
int nEventsNum; // 视频分析规则数
IVS_CONFIG_EVENT_INFOEX stuEventInfo[IVS_MAX_EVENT_NUM]; // 事件信息
}IVS_CFG_ANALYSEVENTS_INFOEX;
typedef struct
{
int nX; // 8192坐标系
int nY;
}IVS_CFG_POLYLINE;
typedef struct __IVS_WEB_RULE
{
int size;
int nRuleType;
int nRuleEnable;
int ndirect1;
int ndirect2;
int nPoint1;
int nPoint2;
unsigned char bActionType[4];
DH_IVS_OBJECT_INFO objectMsg;
char szRuleName[IVS_NAME_NUM];
IVS_CFG_POLYLINE stuDetectLine1[IVS_MAX_POLYLINE_NUM]; //Line
IVS_CFG_POLYLINE stuDetectLine2[IVS_MAX_POLYLINE_NUM]; //Region
int nRuleID;
IVS_CFG_POLYLINE stuDirectionLine[2]; //Direction
char szRevered[236];
}IVS_WEB_RULE;
typedef struct __IVS_WEB_RULE_ARRAY
{
int size;
int nCount;
IVS_WEB_RULE* pRule;
}IVS_WEB_RULE_ARRAY;
typedef struct
{
int objectid;
struct tm startTime;
struct tm endTime;
INT64 nBeginFileOffset; // 开始时文件偏移字节数(物体开始出现时,视频帧在原始视频文件中相对于文件起始处的偏移)
INT64 nEndFileOffset; // 结束时文件偏移字节数(物体消逝时,视频帧在原始视频文件中相对于文件起始处的偏移)
int classid;
}IVSOBJECT;
typedef struct
{
IVS_BOOL trackex2objtype; // 是否显示物体类型0:否1:显示,默认不显示
IVS_BOOL trackex2attribute88; // 是否显示0x88属性包0:否1:显示,默认显示
IVS_BOOL trackex2objid; // 是否显示物体ID0:否1:显示,默认不显示
IVS_BOOL trackex2humanage; // 是否显示具体年龄0:显示年龄段1:显示年龄,默认显示年龄段
}TrackEx2Configure;
typedef union
{
IVSOBJECT object;
IVSPOINT xPt;
char szReverd[128];
}ObjectContex;
typedef struct _DH_IVS_POINT
{
/*************************************************
**
** X,YXSize,YSize
** (X-XSize, Y-YSize, X+XSize, Y+YSize)
**************************************************/
short x;
short y;
short xSize;
short ySize;
}DH_IVS_POINT;
typedef struct _RuleColor
{
int ruletype;
IVS_COLOR crColor;
}RuleColor;
#ifdef __cplusplus
extern "C" {
#endif
/**
* IVSDraw()IvsDrawerjson
*/
IVSDRAWER_API int CALLMETHOD DRAW_Startup();
/**
* 退IVSDraw
*/
IVSDRAWER_API void CALLMETHOD DRAW_Cleanup();
/**
*
*
* @param[in] nPort
* @return BOOLTRUEFALSE
*/
IVSDRAWER_API BOOL CALLMETHOD DRAW_Open(int nPort);
/**
*
*
* @param[in] nPort
*/
IVSDRAWER_API void CALLMETHOD DRAW_Close(int nPort);
/**
*
*
* @param[in] nPort
* @param[in] nType DRAW_TYPEDRAW_TRACK,DRAW_ALARM,DRAW_RULE
* @return BOOLTRUEFALSE
*/
IVSDRAWER_API BOOL CALLMETHOD DRAW_Reset(int nPort, int nType);
/**
* jason
*
* @param[in] nPort
* @param[in] pJsonData
* @param[in] nDataLen
* @param[in] nPort
* @param[in] nFrameSeq
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputJsonData(int nPort, unsigned char* pJsonData, int nDataLen, int nFrameSeq);
/**
*
*
* @param[in] nPort
* @param[in] nRuleColor
* @param[in] nRuleNum
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetRuleColor(int nPort,RuleColor* nRuleColor, int nRuleNum);
/**
* jason
*
* @param[in] nPort
* @param[in] nType
* @param[in] pRuleData
* @param[in] nframe
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputRuleData(int nPort, int nType, unsigned char* pRuleData, int nframe);
/**
* 0xF1()0x05()
*
* @param[in] nPort
* @param[in] nType
* @param[in] pTrackData
* @param[in] nDataLen
* @param[in] nFrameSeq
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputTrackData(int nPort, int nType, unsigned char* pTrackData, int nDataLen,int nFrameSeq);
/**
* 0xF1()0x0E()NVR
*
* @param[in] nPort
* @param[in] nType nType=7nType=19NVR
* @param[in] pTrackData
* @param[in] nDataLen
* @param[in] nFrameSeq
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputTrackDataEx2(int nPort, int nType, unsigned char* pTrackData, int nDataLen,int nFrameSeq);
/**
* jason
*
* @param[in] nPort
* @param[in] nType
* @param[in] pAlarmData
* @param[in] nDataLen
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputAlarmData(int nPort, int nType, unsigned char* pAlarmData, int nDataLen);
/**
* jasonDRAW_InputAlarmData
*
* @param[in] nPort
* @param[in] nType
* @param[in] pAlarmData
* @param[in] nDataLen
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputAlarmDataEx(int nPort, int nType, unsigned char* pAlarmData, int nDataLen);
/**
*
*
* @param[in] nPort
* @param[in] nType
* @param[in] pData
* @param[in] nDataLen
* @param[in] nFrameSeq
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_InputMoveCheckData(int nPort, int nType, unsigned char* pData, int nDataLen, int nFrameSeq);
/**
* \n
*
* @param[in] nPort
* @param[in] pTextData
* @param[in] nTextNumPos pTextData
* @return int0-1
*/
typedef struct
{
const char* pText; // 显示的字符串
IVSPOINT hPos; // 显示位置
int nFontsize; // 字体大小
int nRed; // 字体颜色
int nGreen; // 字体颜色
int nBlue; // 字体颜色
int nAlignMode; // 对齐方式0左对齐1居中对齐2右对齐
}TextData;
IVSDRAWER_API int CALLMETHOD DRAW_InputTextData(int nPort, TextData* pTextData, int nTextNumPos);
/**
*
*
* @param[in] nPort
* @param[in] hDC
* @param[in] hWnd
* @param[in] nFrameSeq
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_Draw(int nPort, IVS_DC_REF hDC, IVS_WND_REF hWnd, int nFrameSeq);
/**
*
*
* @param[in] nPort
* @param[in] nType DRAW_TYPE
* @param[in] nLifeCount
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetLifeCount(int nPort, int nType, int nLifeCount);
/**
* 使
*
* @param[in] nPort
* @param[in] type DRAW_TYPE
* @param[in] bEnable 使
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetEnable(int nPort, int nType, IVS_BOOL bEnable);
/**
*
*
* @param[in] nPort
* @param[in] nType
* @param[in] nPenStyle (线or线)DRAW_PEN_STYLE
* @param[in] nWidth
* @param[in] crColor
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetPen(int nPort, int nType, int nPenStyle, int nWidth, IVS_COLOR crColor);
/**
*
*
* @param[in] nPort
* @param[in] nCmdType IVS_CMD_TYPE
* @param[in] pContext nCmdTypeIVS_TRACK_OBJECT/IVS_TRACK_OBJECT_EXIVS_GET_OBJECTObjectContex
* int
* @param[in] nContextSize pContext
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_Ioctl(int nPort, int nCmdType, void* pContext, int nContextSize);
/**
*
*
* @param[in] nPort
* @param[in] nFrameSeq
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_Refresh(int nPort, int nFrameSeq);
/**
* (255)0
*
* @param[in] nPort
*/
IVSDRAWER_API void CALLMETHOD DRAW_Idle(int nPort);
/**
*
*
* @param[in] nPort
* @param[in] nReserved
*/
IVSDRAWER_API void CALLMETHOD DRAW_Clean(int nPort, int nReserved);
/**
*
*
* @param[in] nPort
* @param[in] nTime
* @param[in] nObjectId ID
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetTime(int nPort, int nTime, int nObjectId);
/**
* rulealarmtrack
*
* @param[in] nPort
* @param[in] nShowType SHOW_TYPE使
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetShowType(int nPort, int nShowType);
/**
* track
*
* @param[in] nPort
* @param[in] pCallBack
* @param[in] pUserData
*/
typedef void (CALLMETHOD* OnDrawOneTrack)(int nClassID, int nObjID, DH_IVS_POINT* pPoints, int nPointNum, void* pUserData);
IVSDRAWER_API void CALLMETHOD DRAW_SetDrawOneTrackCallback(int nPort, OnDrawOneTrack pCallBack, void* pUserData);
/**
*
*
* @param[in] nPort
* @param[in] pTranslateCBFunc
* @param[in] pUserData
*/
typedef int (CALLMETHOD* fTranslateCallback)(unsigned char* strSrc,int nSrsLen, unsigned char* strDst, int* nDstLen, void* pUserData);
IVSDRAWER_API void CALLMETHOD DRAW_SetTranslateCallback(int nPort, fTranslateCallback pTranslateCBFunc, void* pUserData);
/**
* track
*
* @param[in] nPort
* @param[in] pRuleName
* @param[in] bEnable
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetRuleTrackAlarm(int nPort, const char* pRuleName, bool bEnable);
/**
* track
*
* @param[in] nPort
* @param[in] nType: 0track1track
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetShowTrackType(int nPort, int nType);
/**
*
*
* @param[in] nPort
* @param[in] nFrameSeq
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetFrameNum(int nPort, int nFrameSeq);
/**
* {ID, ID},
*
* @param[in] nPort
* @param[in] nClassId ID
* @param[in] nObjectId ID
* @param[in] crColor
* @param[in] bSpecialShape 1:, 0:
* @param[in] bSpecialSingle 1: 0
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetTrackObjectColor(int nPort, int nClassId, int nObjectId, IVS_COLOR crColor, bool bSpecialShape, bool bSpecialSingle);
/**
* bSpecialShape
*
* @param[in] nPort
* @param[in] bSpecialShape 1:, 0:
* @return int0-1
*/
IVSDRAWER_API int CALLMETHOD DRAW_SetTrackEX2Sharp(int nPort, bool bSpecialShape);
/**
* trackex2config
*
* @param[in] nPort
* @param[in] trackex2config
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetTrackEx2Config(int nPort, TrackEx2Configure trackex2config);
/**
* bEnable
*
* @param[in] nPort
* @param[in] bEnable
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetRuleNameConfig(int nPort, bool bEnable);
/**
*
*
* @param[in] nPort
* @param[in] nClearType IVS_CMD_TYPE
*/
IVSDRAWER_API void CALLMETHOD DRAW_ClearIVSConfigData(int nPort, int nClearType);
/**
* IVS
*
* @param[in] nPort
* @param[in] rectRegion
* @param[in] bEnable 使
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetIVSDisplayRegion(int nPort, IVS_RECT *rectRegion, bool bEnable);
/**
* NACLIOS
*
* @param[in] nPort
* @param[in] nX X
* @param[in] nY Y
* @param[in] nWidth
* @param[in] nHeight
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetDrawSurfaceParam(int nPort, int nX, int nY, int nWidth, int nHeight);
/**
* MAC
* Retina
* @param[in] nPort
* @param[in] scale
*/
IVSDRAWER_API void CALLMETHOD DRAW_SetDisplayScale(int nPort, float scale);
/**
*
*/
IVSDRAWER_API int CALLMETHOD DRAW_GetLastError(int nPort);
IVSDRAWER_API int CALLMETHOD DRAW_InputJpegData(int nPort, int nType, unsigned char* pJpegData, int nDataLen, int nFrameSeq);
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,28 @@
#ifndef AVGLOBAL_H
#define AVGLOBAL_H
typedef int AV_int32;
typedef unsigned int AV_uint32;
#ifndef __OBJC__
typedef int AV_BOOL;
#else
typedef BOOL AV_BOOL;
#endif
typedef void* AV_HANDLE;
typedef unsigned char AV_BYTE;
typedef float AV_float;
#ifdef WIN32
typedef __int64 AV_int64;
typedef unsigned __int64 AV_uint64;
#else
typedef long long AV_int64;
typedef unsigned long long AV_uint64;
#endif
#endif

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

@ -0,0 +1,21 @@
# 返回的分页数据 请用pagehelp的PageInfo
# 引入redis
## 需要在yml文件中配置prefix指定前缀
```yaml
zhehe:
common:
redis:
prefix:
```
# 引入md5加密
## 需配置secretSalt
```yaml
zhehe:
common:
md5:
secretSalt:
```

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhehekeji</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.9.RELEASE</spring-boot.version>
<fastjson.version>1.2.47</fastjson.version>
<qrcode.version>2.1</qrcode.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<product.center.api>1.0.0</product.center.api>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>${qrcode.version}</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>${qrcode.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>base-assembly</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--指定编译的jdk版本-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://47.99.98.250:28888/repository/maven-public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

@ -0,0 +1,25 @@
package com.zhehekeji.common;
import com.zhehekeji.common.properities.Md5Properity;
import com.zhehekeji.common.properities.RedisProperity;
import com.zhehekeji.common.util.MD5Util;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Description
* @Author wangyiming1031@aliyun.com
* @Date 2019/10/28 15:39
**/
@Configuration
@EnableConfigurationProperties({RedisProperity.class, Md5Properity.class})
public class CommonConfigure {
//todo 把result的version放进来
@Bean
public MD5Util md5Util(Md5Properity md5Properity){
return new MD5Util(md5Properity);
}
}

@ -0,0 +1,32 @@
package com.zhehekeji.common.constant;
public abstract class CommonConstant {
public static final Integer RESULT_ERROR_CODE = 500;
public static final String RESULT_ADD_OK_MSG = "新增成功";
public static final String RESULT_ADD_ERROR_MSG = "新增失败";
public static final String RESULT_DELETE_OK_MSG = "删除成功";
public static final String RESULT_DELETE_ERROR_MSG = "删除失败";
public static final String RESULT_EDIT_OK_MSG = "修改成功";
public static final String RESULT_EDIT_ERROR_MSG = "修改失败";
public static final String RESULT_OK_MSG = "操作成功";
public static final String RESULT_ERROR_MSG = "生成失败";
public static final String MODULE_URL = "/module";
public static final String PROJECT_URL = "/project";
public static final String ACCOUNT_URL = "/account";
public static final String ROLE_URL = "/role";
public static final String DEPARTMENT_URL = "/department";
}

@ -0,0 +1,17 @@
package com.zhehekeji.common.properities;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("zhehe.common.md5")
public class Md5Properity {
private String secretSalt = "zheHeKeJi";
public String getSecretSalt() {
return secretSalt;
}
public void setSecretSalt(String secretSalt) {
this.secretSalt = secretSalt;
}
}

@ -0,0 +1,16 @@
package com.zhehekeji.common.properities;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("zhehe.common")
@Getter
@Setter
public class Properity {
private String version;
private String successMsg = "SUCCESS";
}

@ -0,0 +1,15 @@
package com.zhehekeji.common.properities;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("zhehe.common.redis")
@Data
public class RedisProperity {
/**
* redis
*/
private String prefix;
}

@ -0,0 +1,154 @@
package com.zhehekeji.common.util;
import com.zhehekeji.core.util.Assert;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
@Slf4j
public class HttpUtil {
private static final CloseableHttpClient httpClient;
static {
httpClient = HttpClients.createDefault();
}
private static RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)
.setConnectionRequestTimeout(1000).setSocketTimeout(6000).build();
/**
* get
*
* @return
*/
public static String doGet(String url) throws IOException {
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(requestConfig);
return response(httpGet);
}
public static String token(String url,String token) throws IOException {
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("token",token);
httpGet.setConfig(requestConfig);
return response(httpGet);
}
/**
* post( name1=value1&name2=value2 )
*
* @param url
* @param params
* @return
*/
public static String doPost(String url, String params) throws IOException {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Accept", "*/*");
httpPost.setHeader("Accept-Charset", "UTF-8");
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
StringEntity entity = new StringEntity(params, "UTF-8");
httpPost.setEntity(entity);
httpPost.setConfig(requestConfig);
return response(httpPost);
}
/**
* POSTmap
*
* @param url
* @param map
* @return
*/
public static String doMapPost(String url, Map<String, Object> map) throws IOException {
String params = buildParam(map);
return doPost(url, params);
}
/**
* postjson
*
* @param url
* @param params
* @return
*/
public static String doJsonPost(String url, String params) throws IOException {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-Type", "application/json");
StringEntity entity = new StringEntity(params, "UTF-8");
httpPost.setEntity(entity);
httpPost.setConfig(requestConfig);
return response(httpPost);
}
private static String response(HttpUriRequest request) throws IOException {
CloseableHttpResponse response = null;
try {
response = httpClient.execute(request);
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
String jsonString = EntityUtils.toString(responseEntity, "UTF-8");
/** 消耗掉entity对象 **/
EntityUtils.consume(responseEntity);
return jsonString;
}
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* mapURL
*
* @param params
* @return
*/
public static String buildParam(Map<String, Object> params) {
if (params.isEmpty()) {
return "";
}
StringBuilder param = new StringBuilder();
Iterator<String> keyIter = params.keySet().iterator();
try {
while (keyIter.hasNext()) {
String key = keyIter.next();
Object o = params.get(key);
if (o == null) {
param.append(key + "=&");
} else {
param.append(key + "=" + URLEncoder.encode(String.valueOf(o), "UTF-8") + "&");
}
}
if (param.length() != 0) {
param.deleteCharAt(param.length() - 1);
}
} catch (Exception ex) {
log.error("map对象转换为URL异常{}", ex);
Assert.isTrue(false, "map对象转换为URL异常");
}
return param.toString();
}
}

@ -0,0 +1,54 @@
package com.zhehekeji.common.util;
import com.zhehekeji.common.properities.Md5Properity;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
private String salt;
public MD5Util(Md5Properity md5Properity){
this.salt = md5Properity.getSecretSalt();
}
private String getMD5(String content) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(content.getBytes());
return getHashString(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* md5
* @param content
* @return
*/
public String getMD5WithSalt(String content) {
return getMD5(getMD5(content) + salt);
}
private String getHashString(MessageDigest digest) {
StringBuilder builder = new StringBuilder();
for (byte b : digest.digest()) {
builder.append(Integer.toHexString((b >> 4) & 0xf));
builder.append(Integer.toHexString(b & 0xf));
}
return builder.toString();
}
/**
*
* @param password
* @param md5
* @return
*/
public Boolean checkPassword(String password,String md5){
return md5.equals(getMD5WithSalt(password));
}
}

@ -0,0 +1,47 @@
package com.zhehekeji.common.util;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Slf4j
public class PathUtil {
public static String createFileName(String fileType) {
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd/HH"));
return time + "/" + UUID.randomUUID() + "."+fileType;
}
/**
*
* @param url
*/
public static void checkDirc(String url){
File file = new File(url);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
}
public static File getFile(String url){
File file = new File(url);
//如果文件不存在,则新建一个
if(!file.exists()){
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
log.error("创建文件出错:{}",e);
}
}
return file;
}
}

@ -0,0 +1,72 @@
package com.zhehekeji.common.util;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.zhehekeji.core.util.Assert;
import org.apache.commons.codec.binary.Base64;
import org.springframework.util.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Hashtable;
/**
* Util
*/
public class QrUtil {
private static String BASE64 = "data:image/jpg;base64,";
public static BufferedImage createCode(String content, BarcodeFormat format,Integer width,Integer height) throws WriterException {
Assert.isTrue(!StringUtils.isEmpty(content),"二维码生成要素为空");
Hashtable<EncodeHintType, String> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, format , width, height, hints);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
}
/**
* web
* @param os OutputStream
* @param extension jpg jpeg
* @param content
* @param format QR_CODE :
* com.google.zxing.BarcodeFormat
* @param width
* @param height
* @throws IOException
* @throws WriterException
*/
public static void outPut2Web(OutputStream os, String extension, String content, BarcodeFormat format, Integer width, Integer height) throws IOException, WriterException {
BufferedImage image = createCode(content,format,width,height);
ImageIO.write(image, extension, os);
}
/**
* base64
* @param content
* @param format QR_CODE :
* @param width
* @param height
* @param extension jpg/jpeg
* @return
* @throws WriterException
* @throws IOException
*/
public static String image2Base64(String content, BarcodeFormat format,Integer width,Integer height,String extension) throws WriterException, IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BufferedImage image = createCode(content,format,width,height);
ImageIO.write(image, extension, outputStream);
String base = Base64.encodeBase64String(outputStream.toByteArray());
return BASE64 + base;
}
}

@ -0,0 +1,33 @@
package com.zhehekeji.common.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static <T> T getBean(String id, Class<T> type) {
return applicationContext.getBean(id, type);
}
public static <T> T getBean(Class<T> type) {
return applicationContext.getBean(type);
}
public static <T> Map<String, T> getBeansOfType(Class<T> type) {
return applicationContext.getBeansOfType(type);
}
}

@ -0,0 +1,45 @@
package com.zhehekeji.common.util;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
/**
*
*/
public class Tools {
/**
* uuid-
*
* @return
*/
public static String UUID() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
/**
* url
* @param sourceUrl
* @param parameters
* @return
*/
public static String joinParameters(String sourceUrl, Map<String, String> parameters) {
StringBuffer sb = new StringBuffer(sourceUrl)
.append("?");
String andChar = "&";
parameters.entrySet().forEach(entry -> {
sb.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append(andChar);
});
if (sb.indexOf(andChar) > 0) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
}

@ -0,0 +1,28 @@
package com.zhehekeji.common.util;
import com.zhehekeji.core.util.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;
@Component
public class ValidatorUtil {
@Autowired
private Validator validator;
public <T> void validate(T object, Class<?>... groups) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, groups);
if (!constraintViolations.isEmpty()) {
StringBuilder msg = new StringBuilder();
for (ConstraintViolation<T> violation : constraintViolations) {
msg.append(violation.getMessage()).append(";");
}
Assert.isTrue(Boolean.FALSE, msg != null ? msg.toString() : "");
}
}
}

@ -0,0 +1,45 @@
{
"groups": [
{
"name": "zhehe.common",
"type": "com.zhehekeji.common.properities.Properity",
"sourceType": "com.zhehekeji.common.properities.Properity"
},
{
"name": "zhehe.common.md5",
"type": "com.zhehekeji.common.properities.Md5Properity",
"sourceType": "com.zhehekeji.common.properities.Md5Properity"
},
{
"name": "zhehe.common.redis",
"type": "com.zhehekeji.common.properities.RedisProperity",
"sourceType": "com.zhehekeji.common.properities.RedisProperity"
}
],
"properties": [
{
"name": "zhehe.common.md5.secret-salt",
"type": "java.lang.String",
"sourceType": "com.zhehekeji.common.properities.Md5Properity",
"defaultValue": "zheHeKeJi"
},
{
"name": "zhehe.common.redis.prefix",
"type": "java.lang.String",
"description": "redis前缀",
"sourceType": "com.zhehekeji.common.properities.RedisProperity"
},
{
"name": "zhehe.common.success-msg",
"type": "java.lang.String",
"sourceType": "com.zhehekeji.common.properities.Properity",
"defaultValue": "SUCCESS"
},
{
"name": "zhehe.common.version",
"type": "java.lang.String",
"sourceType": "com.zhehekeji.common.properities.Properity"
}
],
"hints": []
}

@ -0,0 +1,5 @@
#Generated by Maven
#Wed Nov 17 10:41:00 CST 2021
version=1.0.0
groupId=com.zhehekeji
artifactId=common

@ -0,0 +1,13 @@
com\zhehekeji\common\properities\Properity.class
com\zhehekeji\common\util\QrUtil.class
com\zhehekeji\common\util\SpringContextUtil.class
com\zhehekeji\common\util\PathUtil.class
com\zhehekeji\common\util\ValidatorUtil.class
com\zhehekeji\common\properities\Md5Properity.class
com\zhehekeji\common\util\Tools.class
META-INF\spring-configuration-metadata.json
com\zhehekeji\common\properities\RedisProperity.class
com\zhehekeji\common\constant\CommonConstant.class
com\zhehekeji\common\util\MD5Util.class
com\zhehekeji\common\util\HttpUtil.class
com\zhehekeji\common\CommonConfigure.class

@ -0,0 +1,12 @@
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\QrUtil.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\Tools.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\HttpUtil.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\SpringContextUtil.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\MD5Util.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\CommonConfigure.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\PathUtil.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\properities\Properity.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\properities\RedisProperity.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\util\ValidatorUtil.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\constant\CommonConstant.java
E:\workspace\backend-duoji-monitor\modules\common\src\main\java\com\zhehekeji\common\properities\Md5Properity.java

@ -0,0 +1,13 @@
# 使用说明
## CurrentUserUtil
##### 该类只能获取controller类里面被SessionHandler注解修饰的方法
## 请在yml中做如下配置
```yaml
zhehe:
filter:
sessionExpireTime: ##session过期时间,单位分钟,必须要填!!!!!!!
header: ##token请求头,默认为token
jwtSecret: ## jwt密钥,默认zheHeKeJi
sessionPrefix: ## redis上的session头默认为 :session:
```

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>modules</artifactId>
<groupId>com.zhehekeji</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhehekeji</groupId>
<version>1.0.0</version>
<artifactId>filter</artifactId>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.9.RELEASE</spring-boot.version>
<jwt.version>0.7.0</jwt.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

@ -0,0 +1,12 @@
package com.zhehekeji.filter;
public interface FilterConstance {
String HEADER = "token";
String JWT_KEY = "zhehekeji";
String SESSION_PREFIX = "session:";
Long SESSION_EXPIRE = 10800l;
}

@ -0,0 +1,73 @@
package com.zhehekeji.filter.aspect;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.common.util.HttpUtil;
import com.zhehekeji.core.pojo.HttpStatus;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.filter.FilterConstance;
import com.zhehekeji.filter.pojo.CurrentUser;
import com.zhehekeji.filter.pojo.SessionHandler;
import com.zhehekeji.filter.pojo.UserType;
import com.zhehekeji.filter.util.CurrentUserUtil;
import com.zhehekeji.filter.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @Description Session
* @Author wangyiming1031@aliyun.com
* @Date 2019/10/28 19:26
**/
@Aspect
@Component
@Slf4j
public class SessionAspect {
@Value("${zhehe.filter.enable}")
private Boolean enable;
@Value("${userUrl}")
private String userUrl;
/**
* zhehekeji..*.controller
* zhehekeji controller
*
* @param sessionHandler
*/
@Before("execution(public * com.zhehekeji..*.controller.*.*(..))&&@annotation(sessionHandler)")
public void handler(SessionHandler sessionHandler){
if(!enable){
return;
}
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader(FilterConstance.HEADER);
CurrentUser currentUser = null;
try {
String res = HttpUtil.token(userUrl+"/api/account/checkToken",token);
Result currentUserResult = JSONObject.parseObject(res,Result.class);
if(currentUserResult != null && currentUserResult.getCode() == 200){
currentUser = JSONObject.parseObject(JSONObject.toJSONString(currentUserResult.getData()),CurrentUser.class);
}
} catch (IOException e) {
e.printStackTrace();
}
if (sessionHandler.login()) {
Assert.isTrue(currentUser != null, HttpStatus.UNAUTHORIZED.getCode(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
}
if (sessionHandler.auth()) {
//todo 权限检验
}
CurrentUserUtil.setCurrentUser(currentUser);
}
}

@ -0,0 +1,40 @@
package com.zhehekeji.filter.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
public class CurrentUser {
/**
*
*/
private Integer id;
/**
*
*/
private String phone;
/**
*
*/
private String account;
private String email;
/**
*
*/
private String name;
/**
*
*/
private UserType userType;
}

@ -0,0 +1,25 @@
package com.zhehekeji.filter.pojo;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionHandler {
String value() default "";
UserType userType() default UserType.USER;
/**
*
* @return true: false:
*/
boolean login() default true;
/**
*
* @return true: false:
*/
boolean auth() default true;
}

@ -0,0 +1,19 @@
package com.zhehekeji.filter.pojo;
/**
* @Description
* @Author wangyiming1031@aliyun.com
* @Date 2019/10/28 19:30
**/
public enum UserType {
/**
*
*/
ACCOUNT,
/**
*
*/
USER,
;
}

@ -0,0 +1,30 @@
package com.zhehekeji.filter.util;
import com.zhehekeji.filter.pojo.CurrentUser;
/**
* @Description 线
* @Author wangyiming1031@aliyun.com
* @Date 2019/10/28 19:22
**/
public class CurrentUserUtil {
private static ThreadLocal<CurrentUser> currentUser = new ThreadLocal<>();
/**
*
*
* @return
*/
public static CurrentUser getCurrentUser() {
return currentUser.get();
}
public static void setCurrentUser(CurrentUser user) {
currentUser.set(user);
}
public static void delCurrentUser() {
currentUser.remove();
}
}

@ -0,0 +1,85 @@
package com.zhehekeji.filter.util;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.filter.FilterConstance;
import com.zhehekeji.filter.pojo.CurrentUser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* @Description JWTUtil
* @Author wangyiming1031@aliyun.com
* @Date 2019/10/28 19:11
**/
public class JwtUtil {
/**
* JWT
*
* @return
*/
private static String createJWT(CurrentUser currentUser) {
String userJson = JSONObject.toJSONString(currentUser);
JwtBuilder builder = Jwts.builder()
.setSubject(userJson)
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, FilterConstance.JWT_KEY);
return builder.compact();
}
/**
* JWT
* jwt
* @param jwtStr
* @return
*/
public static Claims parseJWT(String jwtStr) {
return Jwts.parser()
.setSigningKey(FilterConstance.JWT_KEY)
.parseClaimsJws(jwtStr)
.getBody();
}
/**
*
*
* @param request
* @return
*/
public static CurrentUser getUser(HttpServletRequest request) {
String token = getToken(request);
Claims claims;
try {
claims = parseJWT(token);
} catch (Exception e) {
return null;
}
String json = claims.getSubject();
CurrentUser userInfo = JSONObject.parseObject(json, CurrentUser.class);
return userInfo;
}
private static String getToken(HttpServletRequest request) {
return request.getHeader(FilterConstance.HEADER);
}
/**
* jwt,jwt
* header
* @param response
* @param currentUser
* @return
*/
public static String createTokenAndHeader(HttpServletResponse response,CurrentUser currentUser){
String jwt = createJWT(currentUser);
response.setHeader(FilterConstance.HEADER,jwt);
return jwt;
}
}

@ -0,0 +1,3 @@
version=1.0.0
groupId=com.zhehekeji
artifactId=filter

@ -0,0 +1,8 @@
com\zhehekeji\filter\pojo\SessionHandler.class
com\zhehekeji\filter\pojo\CurrentUser.class
com\zhehekeji\filter\pojo\UserType.class
com\zhehekeji\filter\aspect\SessionAspect.class
com\zhehekeji\filter\util\CurrentUserUtil.class
com\zhehekeji\filter\pojo\CurrentUser$CurrentUserBuilder.class
com\zhehekeji\filter\util\JwtUtil.class
com\zhehekeji\filter\FilterConstance.class

@ -0,0 +1,7 @@
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\util\JwtUtil.java
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\pojo\SessionHandler.java
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\aspect\SessionAspect.java
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\pojo\UserType.java
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\util\CurrentUserUtil.java
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\FilterConstance.java
E:\workspace\backend-duoji-monitor\modules\filter\src\main\java\com\zhehekeji\filter\pojo\CurrentUser.java

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springbootstart</artifactId>
<groupId>com.zhehekeji</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>modules</artifactId>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<common.version>1.0.0</common.version>
<base.assembly.version>1.0.0</base.assembly.version>
<filter.version>1.0.0</filter.version>
</properties>
<dependencies>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>base-assembly</artifactId>
<version>${base.assembly.version}</version>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>common</artifactId>
<version>${common.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://47.99.98.250:28888/repository/maven-public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>web</module>
<module>modules</module>
<module>modules/common</module>
<module>modules/filter</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.zhehekeji</groupId>
<artifactId>springbootstart</artifactId>
<version>1.0.0</version>
<name>duoji</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--json工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<profiles>
<profile>
<!-- 测试环境 -->
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://47.99.98.250:28888/repository/maven-public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application*.yml</exclude>
</excludes>
</resource>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>bootstrap.yml</include>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<!--指定编译的jdk版本-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<!--执行单元测试的插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>zip</nonFilteredFileExtension>
<nonFilteredFileExtension>cer</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
<nonFilteredFileExtension>py</nonFilteredFileExtension>
<nonFilteredFileExtension>keystore</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,28 @@
# 舵机
## 通讯协议:
![image](plc通讯协议1.jpg)
![image](plc通讯协议2.jpg)
### tcp通讯用的netty
#### 1.HeartNettyClient*类是维持与plc的心跳
#### 2.解码MyProtocolDecode 这里收到plc的包解析处理见通讯协议的两张图片
#### 3.调用sdk拍照录像转动球机等操作在com.zhehekeji.web.lib里面
## SDK:
### 1.调用sdk的代码在 com.zhehekeji.web.lib下面
### 2.sdk在根目录libs下面
### 3.sdk回调在CallBack类里重连回调断线回调球机转动回调下载mp4下载结束回调
### 4.详见SDK_ReadMe_请先读我.TXT
### InitService: 项目启动自动登录球机自动连接PLC
### 球机的连接句柄维护在CameraConnMap类里,key:球机IDvalue:登录句柄
# 部署 使用利珀一键部署服务
## windows(该服务一般都会放在win10系统上)
### start-jar.bat (注意目录和profile)
### stop-jar.bat (注意端口号)
## linux:
### sh app.sh start
### sh app.sh restart
### sh app.sh stop

@ -0,0 +1,2 @@
@echo off
start cmd /k "cd/d D:\workspace\duoji && javaw -jar duoji-1.0.0.jar --spring.profile.path=application-prod.yml"

@ -0,0 +1,24 @@
@echo off&setlocal EnableDelayedExpansion
set Port=
set Dstport=9091
for /F "usebackq skip=4 tokens=2,5" %%a in (`"netstat -ano -p tcp"`) do (
for /F "tokens=2 delims=:" %%k in ("%%a") do (
set Port=%%k
)
echo !Port! %%b >>portandpid.txt
)
for /F "tokens=2 delims=:" %%c in ("%1") do (
set Port=%%c
)
for /F "tokens=1,2 delims= " %%d in (portandpid.txt) do (
echo %%d
echo %Dstport%
if %%d == %Dstport% taskkill /f /pid %%e
)
del portandpid.txt
set Port=
set Dstport=
goto :eof
echo '结束了'

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springbootstart</artifactId>
<groupId>com.zhehekeji</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>duoji</artifactId>
<properties>
<java.version>1.8</java.version>
<common.version>1.0.0</common.version>
<base.assembly.version>1.0.0</base.assembly.version>
<filter.version>1.0.0</filter.version>
</properties>
<dependencies>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>base-assembly</artifactId>
<version>${base.assembly.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.50.Final</version>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>filter</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/libs/jna.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,15 @@
package com.zhehekeji.web;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication(scanBasePackages = {"com.zhehekeji"})
@MapperScan("com.zhehekeji.**.mapper.**")
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.run(args);
}
}

@ -0,0 +1,59 @@
package com.zhehekeji.web.config;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class PackagesSqlSessionFactory extends SqlSessionFactoryBean {
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
@Override
public void setTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;
//将加载多个绝对匹配的所有Resource
//将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分
//然后进行遍历模式匹配
try {
List<String> result = new ArrayList<String>();
Resource[] resources = resolver.getResources(typeAliasesPackage);
if (resources != null && resources.length > 0) {
MetadataReader metadataReader = null;
for (Resource resource : resources) {
if (resource.isReadable()) {
metadataReader = metadataReaderFactory.getMetadataReader(resource);
try {
result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
if (result.size() > 0) {
super.setTypeAliasesPackage(String.join(",", result));
} else {
log.error("参数typeAliasesPackage:" + typeAliasesPackage + ",未找到任何包");
}
//logger.info("d");
} catch (IOException e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,36 @@
package com.zhehekeji.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
@Profile({"test", "dev","prod"})
public class SwaggerConfig {
@Bean
public Docket petApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//指定提供接口所在的基包
.apis(RequestHandlerSelectors.basePackage("com.zhehekeji"))
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("舵机Api")
.version("1.0.0")
.description("web 舵机Api")
.build();
}
}

@ -0,0 +1,40 @@
package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.common.util.HttpUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.pojo.IndexVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@Api(value = "AppCenterController", tags = "用户中心")
@RequestMapping(value = "/app")
@RestController(value = "AppCenterController")
@Slf4j
public class AppCenterController {
@Value("${userUrl}")
private String userUrl;
@GetMapping("/userCenter")
@ApiOperation(value = "用户中心")
public Result<IndexVO> userCenter() {
Result result = null;
try {
String res = HttpUtil.doGet(userUrl+"/api/app/userCenter");
result = JSONObject.parseObject(res,Result.class);
} catch (IOException e) {
log.error("请求用户中心地址失败:{}",e);
Assert.isTrue(false,"请求用户中心地址失败");
}
return result;
}
}

@ -0,0 +1,305 @@
package com.zhehekeji.web.controller;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.CameraMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Api(value = "CameraControl",tags = "球机控制管理")
@RestController
@RequestMapping("/camera/control")
@Slf4j
public class CameraControlController {
@Resource
private CameraMapper cameraMapper;
@PostMapping("/{id}")
@ApiOperation(value = "球机登录")
public Result login(@PathVariable Integer id) {
checkLogin(id);
return Result.success();
}
private NetSDKLib.LLong cameraLogin(Integer cameraId){
log.info("相机登录 cameraId:{}",cameraId);
Camera camera = cameraMapper.selectById(cameraId);
Assert.notNull(camera,"球机不存在");
NetSDKLib.LLong lLong = LoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword(),cameraId);
Assert.isTrue(lLong.longValue() > 0,"登陆失败");
CameraConnMap.conn(cameraId,lLong);
return lLong;
}
@PostMapping("/up/{id}")
@ApiOperation(value = "球机控制向上")
public Result up(@PathVariable Integer id) {
log.debug("球机控制向上");
checkLogin(id);
PtzControlModule.ptzControlUpStart(id,0,0,1);
return Result.success();
}
@PostMapping("/up/stop/{id}")
@ApiOperation(value = "球机控制向上 停止")
public Result upStop(@PathVariable Integer id) {
log.debug("球机控制向上 停止");
checkLogin(id);
PtzControlModule.ptzControlUpEnd(id,0);
return Result.success();
}
@PostMapping("/down/{id}")
@ApiOperation(value = "球机控制向下")
public Result down(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlDownStart(id,0,0,1);
log.debug("球机控制向下");
return Result.success();
}
@PostMapping("/down/stop/{id}")
@ApiOperation(value = "球机控制向下-停止")
public Result downStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlDownEnd(id,0);
log.debug("球机控制向下 停止");
return Result.success();
}
@PostMapping("/left/{id}")
@ApiOperation(value = "球机控制向左")
public Result left(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlLeftStart(id,0,0,1);
log.debug("球机控制向左");
return Result.success();
}
@PostMapping("/left/stop/{id}")
@ApiOperation(value = "球机控制左-停止")
public Result leftStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlLeftEnd(id,0);
log.debug("球机控制向左 -停止");
return Result.success();
}
@PostMapping("/leftUp/{id}")
@ApiOperation(value = "球机控制向左上")
public Result leftUp(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlLeftUpStart(id,0,1,1);
log.debug("球机控制向上");
return Result.success();
}
@PostMapping("/leftUp/stop/{id}")
@ApiOperation(value = "球机控制左上-停止")
public Result leftUpStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlLeftUpEnd(id,0);
log.debug("球机控制向上 停止");
return Result.success();
}
@PostMapping("/leftDown/{id}")
@ApiOperation(value = "球机控制向左下")
public Result leftDown(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlLeftDownStart(id,0,1,1);
log.debug("球机控制左下");
return Result.success();
}
@PostMapping("/leftDown/stop/{id}")
@ApiOperation(value = "球机控制左下-停止")
public Result leftDownStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlLeftDownEnd(id,0);
log.debug("球机控制左下 停止");
return Result.success();
}
@PostMapping("/right/{id}")
@ApiOperation(value = "球机控制向右")
public Result right(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlRightStart(id,0,0,1);
log.debug("球机控制右");
return Result.success();
}
@PostMapping("/right/stop/{id}")
@ApiOperation(value = "球机控制右-停止")
public Result rightStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlRightEnd(id,0);
log.debug("球机控制右 停止");
return Result.success();
}
@PostMapping("/rightUp/{id}")
@ApiOperation(value = "球机控制向右上")
public Result rightUp(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlRightUpStart(id,0,1,1);
log.debug("球机控制右上");
return Result.success();
}
@PostMapping("/rightUp/stop/{id}")
@ApiOperation(value = "球机控制右上-停止")
public Result rightUpStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlRightUpEnd(id,0);
log.debug("球机控制右上 -停止");
return Result.success();
}
@PostMapping("/rightDown/{id}")
@ApiOperation(value = "球机控制向右下")
public Result rightDown(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlRightDownStart(id,0,1,1);
log.debug("球机控制右下");
return Result.success();
}
@PostMapping("/rightDown/stop/{id}")
@ApiOperation(value = "球机控制右下-停止")
public Result rightDownStop(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlRightDownEnd(id,0);
log.debug("球机控制右下 -停止");
return Result.success();
}
@PostMapping("/zoomAdd/start/{id}")
@ApiOperation(value = "球机控制 变倍+")
public Result ZoomAddStart(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlZoomAddStart(id,0,1);
return Result.success();
}
@PostMapping("/zoomAdd/stop/{id}")
@ApiOperation(value = "球机控制 变倍+ 停止")
public Result ZoomAddEnd(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlZoomAddEnd(id,0);
return Result.success();
}
@PostMapping("/zoomDec/start/{id}")
@ApiOperation(value = "球机控制 变倍-")
public Result ZoomDecStart(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlZoomDecStart(id,0,1);
return Result.success();
}
@PostMapping("/zoomDec/stop/{id}")
@ApiOperation(value = "球机控制 变倍- 停止")
public Result ZoomDecEnd(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlZoomDecEnd(id,0);
return Result.success();
}
@PostMapping("/focusAdd/start/{id}")
@ApiOperation(value = "球机控制 变焦 +")
public Result FocusAddStart(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlFocusAddStart(id,0,1);
return Result.success();
}
@PostMapping("/focusAdd/stop/{id}")
@ApiOperation(value = "球机控制 变焦+ 停止")
public Result focusAddEnd(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlFocusAddEnd(id,0);
return Result.success();
}
@PostMapping("/focusDec/start/{id}")
@ApiOperation(value = "球机控制 变焦 -")
public Result FocusDecStart(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlFocusDecStart(id,0,1);
return Result.success();
}
@PostMapping("/focusDec/stop/{id}")
@ApiOperation(value = "球机控制 变焦- 停止")
public Result focusDecEnd(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlFocusDecEnd(id,0);
return Result.success();
}
@PostMapping("/irisAdd/start/{id}")
@ApiOperation(value = "球机控制 光圈 +")
public Result irisAddStart(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlIrisAddStart(id,0,1);
return Result.success();
}
@PostMapping("/irisAdd/stop/{id}")
@ApiOperation(value = "球机控制 光圈+ 停止")
public Result irisAddEnd(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlIrisAddEnd(id,0);
return Result.success();
}
@PostMapping("/irisDec/start/{id}")
@ApiOperation(value = "球机控制 光圈 -")
public Result irisDecStart(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlIrisDecStart(id,0,1);
return Result.success();
}
@PostMapping("/irisDec/stop/{id}")
@ApiOperation(value = "球机控制 光圈- 停止")
public Result irisDecEnd(@PathVariable Integer id) {
checkLogin(id);
PtzControlModule.ptzControlIrisDecEnd(id,0);
return Result.success();
}
@PostMapping("/pic/{id}")
@ApiOperation(value = "立即拍照")
public Result pic(@PathVariable Integer id) {
checkLogin(id);
OrderInfo orderInfo = new OrderInfo(0L,"SRM123","AAA",1,1,"C5",true);
System.out.println(PtzControlModule.pic(id,0,orderInfo));
return Result.success();
}
// @PostMapping("/mp4/{id}")
// @ApiOperation(value = "录像")
// public Result MP4(@PathVariable Integer id) {
// checkLogin(id);
// PtzControlModule.downloadMp4(id);
// return Result.success();
// }
private void checkLogin(Integer cameraId){
if(CameraConnMap.getConnId(cameraId) == null){
cameraLogin(cameraId);
}
}
}

@ -0,0 +1,114 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.entity.CameraIO;
import com.zhehekeji.web.entity.CameraIOConfig;
import com.zhehekeji.web.lib.PtzControlModule;
import com.zhehekeji.web.pojo.camera.CameraConfigSearchReq;
import com.zhehekeji.web.pojo.camera.CameraIOPtz;
import com.zhehekeji.web.pojo.street.StreetSearch;
import com.zhehekeji.web.service.CameraService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
@Api(value = "camera",tags = "球机管理")
@RestController
@RequestMapping("/camera")
public class CameraController {
@Resource
private CameraService cameraService;
@Resource
private ValidatorUtil validatorUtil;
@PostMapping("/page")
@ApiOperation(value = "球机列表分页 ")
public Result<PageInfo<Camera>> list(@RequestBody StreetSearch streetSearch) {
return new Result<>(cameraService.cameras(streetSearch));
}
@PostMapping("")
@ApiOperation(value = "球机新增 ")
public Result<Integer> add(@RequestBody Camera camera) {
return new Result<>(cameraService.add(camera));
}
@PostMapping("/config/import")
@ApiOperation(value = "球机IO导入 ")
public Result upload(MultipartFile file) throws IOException {
cameraService.importExcel(file);
return Result.success();
}
@PostMapping("/config")
@ApiOperation(value = "球机IO配置新增 ")
public Result<Integer> addConfig (@RequestBody CameraIOConfig config) {
return Result.success(cameraService.addConfig(config));
}
@PostMapping("/config/page")
@ApiOperation(value = "球机IO配置分页列表")
public Result<PageInfo<CameraIOConfig>> configPage (@RequestBody CameraConfigSearchReq req) {
return Result.success(cameraService.configPageInfo(req));
}
@PutMapping("/config")
@ApiOperation(value = "球机IO配置修改 ")
public Result editConfig (@RequestBody CameraIOConfig config) {
cameraService.editConfig(config);
return Result.success();
}
@DeleteMapping("/config/{id}")
@ApiOperation(value = "球机IO配置删除 ")
public Result delConfig (@PathVariable Integer id) {
cameraService.delConfig(id);
return Result.success();
}
@PutMapping("")
@ApiOperation(value = "球机修改")
public Result edit(@RequestBody Camera camera) {
cameraService.edit(camera);
return Result.success();
}
@DeleteMapping("/{id}")
@ApiOperation(value = "球机删除")
public Result del(@PathVariable Integer id){
cameraService.del(id);
return Result.success();
}
@PostMapping("/{cameraId}/io/list")
@ApiOperation(value = "球机IO列表")
public Result<List<CameraIO>> IOPage(@PathVariable Integer cameraId) {
return Result.success(cameraService.ioList(cameraId));
}
@PostMapping("/io/ptz")
@ApiOperation(value = "球机IO配置")
public Result<Integer> ptz(@RequestBody CameraIOPtz req) {
validatorUtil.validate(req);
return Result.success(cameraService.ptz(req.getCameraIOId(),req.getCameraId(),req.getName(),req.getType(),req.getCode()));
}
@PostMapping("/io/toPtz")
@ApiOperation(value = "转至球机IO配置点")
public Result toPtz(@RequestBody CameraIOPtz req) {
//todo
//validatorUtil.validate(req);
Integer ptzId = cameraService.getPtzId(req.getCameraIOId());
PtzControlModule.toPtz(ptzId,req.getCameraId());
return Result.success();
}
}

@ -0,0 +1,92 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Category;
import com.zhehekeji.web.pojo.category.PageSearch;
import com.zhehekeji.web.service.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
@Api(value = "category",tags = "分类管理")
@RestController
@RequestMapping("/category")
public class CategoryController {
@Resource
private CategoryService categoryService;
@PostMapping("/import")
@ApiOperation(value = "分类导入")
public Result upload(MultipartFile file) throws IOException {
Integer rows = categoryService.importExcel(file);
Result result = Result.success();
result.setMessage("成功导入"+rows+"行");
return result;
}
@ApiOperation("分页列表")
@PostMapping("/page")
public Result<PageInfo<Category>> page(@RequestBody PageSearch pageSearch){
return Result.success(categoryService.list(pageSearch));
}
@ApiOperation("列表")
@GetMapping("/list")
public Result<List<Category>> list(@RequestParam String name){
return Result.success(categoryService.list(name));
}
@ApiOperation("修改")
@PutMapping()
public Result edit(@RequestBody Category category){
categoryService.edit(category);
return Result.success();
}
@ApiOperation("新增")
@PostMapping()
public Result add(@RequestBody Category category){
return Result.success(categoryService.add(category));
}
@ApiOperation("删除")
@DeleteMapping("/{id}")
public Result del(@PathVariable Integer id){
categoryService.del(id);
return Result.success();
}
@GetMapping("/export/model")
@ApiOperation(value = "品规模板下载")
public void download(HttpServletResponse response) throws IOException {
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[4096];
int n;
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("品规模板", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
ClassPathResource classPathResource = new ClassPathResource("品规模板.xlsx");
InputStream in = classPathResource.getInputStream();
while ((n = in.read(buffer)) > 0) {
os.write(buffer, 0, n);
}
os.flush();
os.close();
response.flushBuffer();
}
}

@ -0,0 +1,15 @@
package com.zhehekeji.web.controller;
import lombok.Data;
@Data
public class Login {
private String user;
private String ip;
private String password;
private Integer port;
}

@ -0,0 +1,87 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.pojo.OrderSaveReq;
import com.zhehekeji.web.pojo.OrderSearch;
import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.service.OrderService;
import com.zhehekeji.web.service.PlcOrderInfo;
import com.zhehekeji.web.service.PlcService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Api(value = "OrderController",tags = "订单管理")
@RestController(value = "OrderController")
@RequestMapping("/order")
public class OrderController {
@Resource
private OrderService orderService;
@Resource
private PlcService plcService;
@Resource
private ValidatorUtil validatorUtil;
@Value("${zhehe.filter.postToken}")
private String postToken;
@ApiOperation("新增")
@PostMapping("/")
public Result<Long> save(@RequestBody OrderSaveReq saveReq){
validatorUtil.validate(saveReq);
//Assert.isTrue(postToken.equals(saveReq.getToken()),"token不正确");
return Result.success(orderService.add(saveReq));
}
@ApiOperation("工单拍照")
@GetMapping("/camera")
public Result camera(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plcId") @RequestParam String plcId){
//orderService.pic(orderNum,plcId);
return Result.success();
}
@ApiOperation("工单开始信号")
@PostMapping("/start")
public Result orderStart(@ApiParam("工单号") @RequestBody PlcOrderInfo orderNum, @ApiParam("plc")@RequestParam String plcId){
orderNum.setOrderNum(plcId+"_"+orderNum.getTaskId());
plcService.orderStart(orderNum,plcId);
return Result.success();
}
@ApiOperation("工单结束信号")
@GetMapping("/stop")
public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")@RequestParam String plcId){
plcService.orderStop(plcId,orderNum);
return Result.success();
}
@ApiOperation("发生告警")
@GetMapping("/error")
public Result orderError(@ApiParam("plc") @RequestParam String plcId){
plcService.warnStart(plcId,"D1");
return Result.success();
}
@ApiOperation("告警结束")
@GetMapping("/errorStop")
public Result errorStop(@ApiParam("plc") @RequestParam String plcId){
plcService.warnStop(plcId);
return Result.success();
}
@PostMapping("/list")
@ApiOperation(value = "查询")
//@SessionHandler
public Result<PageInfo<OrderVO>> orders(@RequestBody OrderSearch orderSearch) {
//validatorUtil.validate(orderSearch);
return Result.success(orderService.orders(orderSearch));
}
}

@ -0,0 +1,65 @@
package com.zhehekeji.web.controller;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Api(value = "PLCController",tags = "PLC管理")
@RestController(value = "PLCController")
@RequestMapping("/plc")
public class PLCController {
@Resource
private StreetService streetService;
@Resource
private StreetMapper streetMapper;
@Resource
private NettyClient nettyClient;
@GetMapping("/tcp")
@ApiOperation(value = "连接plc,发起请求")
public Result heart(@RequestParam Integer id){
Street street = streetMapper.selectById(id);
Assert.isTrue(street!= null && street.getPlcIp() != null && street.getPlcPort() != null,"未配置IP");
//先判断该链接是否正常
if(!StreetConn.checkStreetConn(id)){
try {
nettyClient.createClient(street);
}catch (Exception e){
Assert.isTrue(false,"连接失败ip"+street.getPlcIp()+",port:"+street.getPlcPort());
}
}
return Result.success();
}
@Resource
private PlcService plcService;
@GetMapping("/disPlc")
@ApiOperation(value = "未连接的PLC")
public Result<List<StreetConn.PlcStatus>> disConn(){
return Result.success(StreetConn.disConnList());
}
@GetMapping("/plcStatus")
@ApiOperation(value = "返回连接异常的PLC数量")
public Result<Integer> plcStatus(){
return Result.success(plcService.plcStatus());
}
@GetMapping("/orderAction")
@ApiOperation(value = "执行的工单情况")
public Result<Map> orderAction(){
return Result.success(OrderAction.get());
}
}

@ -0,0 +1,29 @@
package com.zhehekeji.web.controller;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.pojo.realTime.RealTime;
import com.zhehekeji.web.service.RealTimeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Api(value = "realTime",tags = "实时监控")
@RestController
@RequestMapping("/realTime")
public class RealTimeController {
@Resource
private RealTimeService realTimeService;
@PostMapping("")
@ApiOperation(value = "实时列表")
//@SessionHandler
public Result<List<RealTime>> realTimes() {
return Result.success(realTimeService.realTimes());
}
}

@ -0,0 +1,129 @@
package com.zhehekeji.web.controller;
import com.alibaba.excel.EasyExcel;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.lib.PtzControlModule;
import com.zhehekeji.web.pojo.category.PageSearch;
import com.zhehekeji.web.pojo.stock.CheckByMan;
import com.zhehekeji.web.pojo.stock.StockCheck;
import com.zhehekeji.web.pojo.stock.StockExportExcel;
import com.zhehekeji.web.service.StockService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
@Api(value = "Stock", tags = "库存管理")
@RestController
@RequestMapping("/stock")
public class StockController {
@Resource
private StockService stockService;
@Resource
private ValidatorUtil validatorUtil;
@PostMapping("/import")
@ApiOperation(value = "库存导入")
public Result upload(MultipartFile file) {
stockService.importExcel(file);
return Result.success();
}
@GetMapping("/export/model")
@ApiOperation(value = "库存模板下载")
public void download(HttpServletResponse response) throws IOException {
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[4096];
int n;
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("库存模板", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
ClassPathResource classPathResource = new ClassPathResource("库存模板.xlsx");
InputStream in = classPathResource.getInputStream();
while ((n = in.read(buffer)) > 0) {
os.write(buffer, 0, n);
}
os.flush();
os.close();
response.flushBuffer();
}
@GetMapping("/list")
@ApiOperation(value = "盘点页面 返回map key:货架号 value:库存信息")
public Result<Map<String, List<Stock>>> stockByStreet(@RequestParam(required = true) Integer streetId) {
return Result.success(stockService.stocksByStreetId(streetId));
}
@PostMapping("/page")
@ApiOperation(value = "库存列表")
public Result<PageInfo<Stock>> page(@RequestBody PageSearch pageSearch) {
return Result.success(stockService.page(pageSearch));
}
@ApiOperation(value = "导出全部巷道excel")
@RequestMapping(value = "/export", method = RequestMethod.GET)
public void export(@RequestParam Integer streetId, HttpServletResponse response) throws IOException {
OutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("盘点" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
List<StockExportExcel> excels = stockService.exportExcels(streetId);
EasyExcel.write(os, StockExportExcel.class).sheet().doWrite(excels);
}
@ApiOperation(value = "复核页面的核对信息")
@RequestMapping(value = "/info", method = RequestMethod.POST)
public Result<Stock> stockInfo(@RequestBody StockCheck stockCheck) {
validatorUtil.validate(stockCheck);
return Result.success(stockService.stockInfo(stockCheck));
}
@ApiOperation(value = "复核正确")
@RequestMapping(value = "/checkCorrect", method = RequestMethod.POST)
public Result<Stock> check(@RequestBody StockCheck stockCheck) {
validatorUtil.validate(stockCheck);
return Result.success(stockService.checkCorrect(stockCheck));
}
@ApiOperation(value = "人工复核")
@RequestMapping(value = "/checkByMan", method = RequestMethod.POST)
public Result<Stock> checkByMan(@RequestBody CheckByMan checkByMan) {
validatorUtil.validate(checkByMan);
return Result.success(stockService.checkByMan(checkByMan));
}
@ApiOperation(value = "slow")
@RequestMapping(value = "/slow", method = RequestMethod.GET)
public Result slow(Integer cameraId,Integer x) {
PtzControlModule.toPtzSlow(cameraId,x);
return Result.success();
}
@ApiOperation(value = "currentPosition")
@RequestMapping(value = "/currentPosition", method = RequestMethod.GET)
public Result currentPosition(Integer cameraId,Integer ptzId) {
PtzControlModule.turn360C8(cameraId,ptzId);
return Result.success();
}
}

@ -0,0 +1,57 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.pojo.street.StreetSearch;
import com.zhehekeji.web.pojo.street.StreetVO;
import com.zhehekeji.web.service.StreetService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Api(value = "StreetController",tags = "巷道管理")
@RestController(value = "StreetController")
@RequestMapping("/street")
public class StreetController {
@Resource
private StreetService streetService;
@PostMapping("/page")
@ApiOperation(value = "巷道列表")
//@SessionHandler
public Result<PageInfo<StreetVO>> list(@RequestBody StreetSearch search) {
return new Result<>(streetService.page(search));
}
@PostMapping("")
@ApiOperation(value = "巷道新增")
public Result add(@RequestBody Street street){
return Result.success(streetService.add(street));
}
@PutMapping("")
@ApiOperation(value = "巷道修改")
public Result edit(@RequestBody Street street){
streetService.edit(street);
return Result.success();
}
@DeleteMapping("/{id}")
@ApiOperation(value = "巷道删除")
public Result del(@PathVariable Integer id){
streetService.del(id);
return Result.success();
}
@GetMapping("/{id}")
@ApiOperation(value = "巷道详情")
public Result<Street> detail(@PathVariable Integer id){
return Result.success(streetService.streetById(id));
}
}

@ -0,0 +1,32 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.pojo.warn.WarnSearch;
import com.zhehekeji.web.pojo.warn.WarnVO;
import com.zhehekeji.web.service.WarnService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Api(value = "Warn",tags = "告警管理")
@RestController
@RequestMapping("/warn")
public class WarnController {
@Resource
private WarnService warnService;
@Resource
private ValidatorUtil validatorUtil;
@PostMapping("/list")
@ApiOperation(value = "告警日志 和告警视频 都用这个接口")
//@SessionHandler
public Result<PageInfo<WarnVO>> orders(@RequestBody WarnSearch warnSearch) {
validatorUtil.validate(warnSearch);
return Result.success(warnService.page(warnSearch));
}
}

@ -0,0 +1,37 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("`camera`")
public class Camera {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String ip;
private Integer port;
private String user;
private String password;
private String rtsp;
@ApiModelProperty(value = "预置点 增长值",hidden = true)
private Integer ptzId;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

@ -0,0 +1,41 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("camera_io")
public class CameraIO {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer cameraId;
private String code;
private String name;
@ApiModelProperty("位置")
private String position;
@ApiModelProperty("对焦")
private String focusing;
@ApiModelProperty("光圈")
private String aperture;
@ApiModelProperty("倍率")
private String multiple;
private Integer ptzId;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

@ -0,0 +1,22 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("camera_io_config")
public class CameraIOConfig {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String code;
private LocalDateTime updateTime;
}

@ -0,0 +1,28 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Data
@TableName("category")
public class Category {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

@ -0,0 +1,104 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("`order`")
public class Order {
@TableId(type = IdType.AUTO)
private Long id;
private Integer streetId;
@ApiModelProperty("订单号")
private String orderNum;
@ApiModelProperty("0:正常 1告警")
private Integer status;
/**
* 1 2
*/
private Integer inOut1;
/**
* 1 2
*/
private Integer leftRight1;
/**
*
*/
private Integer column1;
/**
*
*/
private Integer row1;
/**
* 1 2
*/
private Integer inOut2;
/**
* 1 2
*/
private Integer leftRight2;
/**
*
*/
private Integer column2;
/**
*
*/
private Integer row2;
// private String shelveId;
//
// @TableField("`row`")
// private Integer row;
//
// @TableField("`column`")
// private Integer column;
// @ApiModelProperty("仓位号")
// private String positionNum;
@ApiModelProperty("视频图片地址")
@TableField("`video_path_1`")
private String videoPath1;
@ApiModelProperty("视频图片地址")
@TableField("`video_path_2`")
private String videoPath2;
@ApiModelProperty("图片地址,分隔")
private String picPaths;
// @ApiModelProperty("入库照片")
// private String putPath;
//
// @ApiModelProperty("出库照片")
// private String outputPath;
//
// @ApiModelProperty("货位照片")
// private String goodsPath;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}

@ -0,0 +1,42 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@TableName
@Data
public class OrderLastMedia {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField
private String shelveId;
@TableField("`row`")
private Integer row;
@TableField("`column`")
private Integer column;
private String lastOrderNum;
// private String lastPutOrderNum;
//
// @ApiModelProperty("入库照片")
// private String putPath;
//
// private String lastOutOrderNum;
//
// @ApiModelProperty("出库照片")
// private String outPutPath;
//
//
//
// @ApiModelProperty("货位照片")
// private String goodsPath;
}

@ -0,0 +1,53 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("`stock`")
public class Stock {
@TableId(type = IdType.AUTO)
private Long id;
private String orderNum;
@ApiModelProperty("品规名称")
private String category;
@ApiModelProperty("货架号")
private String shelveId;
@TableField(value = "`count`")
@ApiModelProperty("数量")
private Integer count;
@TableField(value = "`row`")
@ApiModelProperty("行号")
private Integer row;
@TableField(value = "`column`")
@ApiModelProperty("列号")
private Integer column;
@ApiModelProperty("0:未盘点 1盘点异常 2核对正确")
private Integer status;
@ApiModelProperty("操作前的图片")
private String preoperationPic;
@ApiModelProperty("操作后的图片")
private String overoperationPic;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime exportTime;
}

@ -0,0 +1,46 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class StockLog {
@TableId(type = IdType.AUTO)
private Long id;
private Integer userId;
private String username;
private String shelveId;
@TableField("`row`")
private Integer row;
@TableField("`column`")
private Integer column;
private String content;
@ApiModelProperty("之前的状态")
private Integer oldStatus;
@ApiModelProperty("更改之后的状态")
private Integer newStatus;
private String orderNum;
@ApiModelProperty("操作前的图片")
private String preoperationPic;
@ApiModelProperty("操作后的图片")
private String overoperationPic;
private LocalDateTime createTime;
}

@ -0,0 +1,82 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName
public class Street {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
@ApiModelProperty("PLC标识")
private String plcId;
private String plcIp;
private Integer plcPort;
@ApiModelProperty("左货架类型 0单伸 1双伸")
private Integer leftType;
@ApiModelProperty("左货架列数量")
private Integer leftColumn;
@ApiModelProperty("左货架行数量")
private Integer leftRow;
@ApiModelProperty("左内侧货架号-双伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String leftInsideShelveId;
@ApiModelProperty("左外侧货架号-双伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String leftOutsideShelveId;
@ApiModelProperty("货架号-单伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String leftShelveId;
@ApiModelProperty("右货架类型 0单伸 1双伸")
private Integer rightType;
@ApiModelProperty("右货架列数量")
private Integer rightColumn;
@ApiModelProperty("右货架行数量")
private Integer rightRow;
@ApiModelProperty("右内侧货架号-双伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String rightInsideShelveId;
@ApiModelProperty("右外侧货架号-双伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String rightOutsideShelveId;
@ApiModelProperty("货架号-单伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String rightShelveId;
@TableField(strategy = FieldStrategy.IGNORED)
private Integer camera1Id;
@TableField(strategy = FieldStrategy.IGNORED)
private Integer camera2Id;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@ApiModelProperty("样式 默认0 0:1个铺满 1:上下两个视频 2:2*2 3:3*3 4:4*4 5:5*5 66*6 8:8*8")
private Integer videoStyle;
}

@ -0,0 +1,20 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName
public class StreetShelve {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer streetId;
private String shelveId;
}

@ -0,0 +1,40 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName
public class Warn {
@TableId(type = IdType.AUTO)
private Long id;
private Integer streetId;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
@ApiModelProperty("视频图片地址")
@TableField("`video_path_1`")
private String videoPath1;
@ApiModelProperty("视频图片地址")
@TableField("`video_path_2`")
private String videoPath2;
private String location;
@TableField("`signal`")
private String signal;
}

@ -0,0 +1,84 @@
package com.zhehekeji.web.lib;
import com.sun.jna.Pointer;
import com.zhehekeji.web.entity.Order;
import com.zhehekeji.web.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
@Slf4j
public class CallBack {
/**
* 线
*/
public static class DisConnectCallBack implements NetSDKLib.fDisConnect {
@Override
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginID);
log.error("球机:{}掉线",cameraId);
//CameraConnMap.disConn(cameraId);
}
}
/**
* mp4
*/
public static class Mp4ReceiveCB implements NetSDKLib.fTimeDownLoadPosCallBack {
@Override
public void invoke(NetSDKLib.LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) {
if(dwDownLoadSize == -1) {
OrderRealtime.overDownload(lPlayHandle);
StopDownLoadThread stopDownLoadThread = new StopDownLoadThread(lPlayHandle);
stopDownLoadThread.start();
}
}
}
public static class HaveReConnect implements NetSDKLib.fHaveReConnect {
@Override
public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue());
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
}
}
public static class CBPTZStatusProcCallBack implements NetSDKLib.fPTZStatusProcCallBack{
private CBPTZStatusProcCallBack() {
}
private static class CallBackHolder {
private static CBPTZStatusProcCallBack instance = new CBPTZStatusProcCallBack();
}
public static CBPTZStatusProcCallBack getInstance() {
return CallBackHolder.instance;
}
@Override
public void invoke(NetSDKLib.LLong lLoginId, NetSDKLib.LLong lAttachHandle, Pointer pBuf, int dwBufLen, long dwUser) {
NetSDKLib.NET_PTZ_LOCATION_INFO PTZInfo = new NetSDKLib.NET_PTZ_LOCATION_INFO();
ToolKits.GetPointerData(pBuf, PTZInfo);
// if(PTZInfo.bState == 2){
// Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginId);
// if(cameraId != null){
// OrderInfo orderInfo = CameraCaptureMap.getOrderInfoByStreetId(cameraId);
// log.info("cameraId:{}",cameraId);
// if(orderInfo != null && !"C6".equals(orderInfo.getCode())){
// log.info("cameraId:{} 到位 拍照,code:{},orderNUm:{}",cameraId,orderInfo.getCode(),orderInfo.getOrderNum());
// //PtzControlModule.pic(cameraId,0,orderInfo);
// }
// CameraCaptureMap.remove(cameraId);
// }
//
// }
}
}
}

@ -0,0 +1,11 @@
package com.zhehekeji.web.lib;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
public class CameraAction implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
}
}

@ -0,0 +1,28 @@
package com.zhehekeji.web.lib;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class CameraCaptureMap {
private static Map<Integer,OrderInfo> cameraMap = new HashMap<>();
public static void put(Integer cameraId,OrderInfo orderInfo){
if(cameraId != null && orderInfo != null){
cameraMap.put(cameraId,orderInfo);
}
}
public static void remove(Integer cameraId){
cameraMap.remove(cameraId);
}
public static OrderInfo getOrderInfoByStreetId(Integer cameraId){
return cameraMap.get(cameraId);
}
}

@ -0,0 +1,43 @@
package com.zhehekeji.web.lib;
import java.util.HashMap;
import java.util.Map;
public class CameraConnMap{
/**
* key :cameraId
* value: loginId
*/
public static Map<Integer, NetSDKLib.LLong> cameraMap = new HashMap<>();
/**
* key:loginId
* value: cameraId
*/
public static Map<NetSDKLib.LLong,Integer> loginMap = new HashMap<>();
public static void conn(Integer cameraId,NetSDKLib.LLong handlerId){
synchronized (cameraId.toString().intern()){
cameraMap.put(cameraId,handlerId);
loginMap.put(handlerId,cameraId);
}
}
public static void disConn(Integer cameraId){
synchronized (cameraId.toString().intern()){
NetSDKLib.LLong lLong = cameraMap.get(cameraId);
cameraMap.remove(cameraId);
loginMap.remove(lLong);
}
}
public static NetSDKLib.LLong getConnId(Integer cameraId){
return cameraMap.get(cameraId);
}
public static Integer getCameraIdByLoginId(NetSDKLib.LLong lLong){
return loginMap.get(lLong);
}
}

@ -0,0 +1,49 @@
package com.zhehekeji.web.lib;
import com.sun.jna.Pointer;
import com.zhehekeji.web.mapper.OrderLastMediaMapper;
import com.zhehekeji.web.mapper.OrderMapper;
import com.zhehekeji.web.mapper.StockMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @Description
* @Author wangyiming1031@aliyun.com
* @Date 2020/12/14 16:11
**/
@Component
@Slf4j
public class CaptureReceiveCB implements NetSDKLib.fSnapRev{
@Resource
private OrderMapper orderMapper;
@Value("${mediaPath}")
private String mediaPath;
private static String fileType = "jpg";
@Resource
private StockMapper stockMapper;
/**
* 线
*/
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 10, 200,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10000000));
@Override
public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
CaptureRunnable captureRunnable = new CaptureRunnable(CmdSerial,fileType,RevLen,mediaPath,pBuf,orderMapper,stockMapper);
threadPoolExecutor.execute(captureRunnable);
}
}

@ -0,0 +1,122 @@
package com.zhehekeji.web.lib;
import com.sun.jna.Pointer;
import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.web.entity.Order;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.mapper.OrderMapper;
import com.zhehekeji.web.mapper.StockMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
@Slf4j
public class CaptureRunnable implements Runnable {
private int CmdSerial;
private String fileType;
private Integer RevLen;
private String mediaPath;
private Pointer pBuf;
private OrderMapper orderMapper;
private StockMapper stockMapper;
public CaptureRunnable(int cmdSerial, String fileType, Integer revLen, String mediaPath,
Pointer pBuf, OrderMapper orderMapper, StockMapper stockMapper) {
this.CmdSerial = cmdSerial;
this.fileType = fileType;
this.RevLen = revLen;
this.mediaPath = mediaPath;
this.pBuf = pBuf;
this.orderMapper = orderMapper;
this.stockMapper = stockMapper;
}
@Override
public void run() {
OrderInfo orderInfo = OrderCmdSerial.getOrderInfo(CmdSerial);
OrderCmdSerial.remove(CmdSerial);
if (orderInfo != null) {
String path = PathUtil.createFileName(fileType);
String picPath = savePic(pBuf, RevLen, mediaPath + path);
if (picPath == null) {
return;
}
String shelveId = orderInfo.getShelveId();
Integer row = orderInfo.getRow();
Integer column = orderInfo.getColumn();
//同步 防止有照片丢失
synchronized (orderInfo.getOrderNum().intern()) {
Order order = orderMapper.getOneByOrderNum(orderInfo.getOrderNum());
if (order != null) {
Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(), orderInfo.getRow(), orderInfo.getColumn());
if (stock == null) {
stock = new Stock();
stock.setShelveId(shelveId);
stock.setColumn(column);
stock.setRow(row);
stock.setStatus(0);
}
if (orderInfo.getIsPre()) {
stock.setOveroperationPic(path);
} else {
stock.setOveroperationPic(path);
}
stock.setOrderNum(order.getOrderNum());
stockMapper.updateById(stock);
String pics = order.getPicPaths();
if (StringUtils.isEmpty(pics)) {
order.setPicPaths(path);
} else {
order.setPicPaths(pics + "," + path);
}
Order update = new Order();
update.setId(order.getId());
update.setPicPaths(order.getPicPaths());
log.info(" update order set pics:{},orderNum:{}", update.getPicPaths(), orderInfo.getOrderNum());
orderMapper.updateById(update);
}
}
return;
}
log.warn("no order");
}
private String savePic(Pointer pBuf, int RevLen, String path) {
BufferedImage bufferedImage = null;
if (pBuf != null && RevLen > 0) {
byte[] buf = pBuf.getByteArray(0, RevLen);
ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf);
try {
bufferedImage = ImageIO.read(byteArrInput);
if (bufferedImage == null) {
return null;
}
File file = PathUtil.getFile(path);
ImageIO.write(bufferedImage, fileType, file);
return path;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedImage != null) {
bufferedImage.flush();
}
}
}
return null;
}
}

@ -0,0 +1,27 @@
package com.zhehekeji.web.lib;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
* SDK JNA
*/
public interface ImageAlgLib extends Library {
ImageAlgLib IMAGEALG_INSTANCE = (ImageAlgLib)Native.loadLibrary(Utils.getLoadLibrary("ImageAlg"), ImageAlgLib.class);
/*******************************************************************************
* : drcTable
* : rawY
* : - pRaw: 14bit
* : - height:
* : - width:
* : - sel: 0
* : - lut: sel1drc0
* : pYDataY
* : 0 :
* -1:
*******************************************************************************/
int drcTable(short[] pRaw, short width, short height, int sel, byte[] pYData, short[] lut);
}

@ -0,0 +1,167 @@
package com.zhehekeji.web.lib;
import com.zhehekeji.common.util.SpringContextUtil;
import com.zhehekeji.web.lib.NetSDKLib.LLong;
import com.zhehekeji.web.lib.NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY;
import com.zhehekeji.web.lib.NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY;
import java.io.File;
/**
*
*
*/
public class LoginModule {
public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
// 设备信息
public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
private static CallBack.DisConnectCallBack disConnectCallBack = new CallBack.DisConnectCallBack();
private static CallBack.HaveReConnect haveReConnect = new CallBack.HaveReConnect();
// 登陆句柄
public static LLong m_hLoginHandle = new LLong(0);
private static boolean bInit = false;
private static boolean bLogopen = false;
/**
* \if ENGLISH_LANG
* Init
* \else
*
* \endif
*/
public static boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) {
bInit = netsdk.CLIENT_Init(disConnect, null);
if(!bInit) {
System.out.println("Initialize SDK failed");
return false;
}
//Res res = Res.string();
//打开日志,可选
// NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
// File path = new File("./sdklog/");
// if (!path.exists()) {
// path.mkdir();
// }
// String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log";
// setLog.nPrintStrategy = 0;
// setLog.bSetFilePath = 1;
// System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
// System.out.println(logPath);
// setLog.bSetPrintStrategy = 1;
// bLogopen = netsdk.CLIENT_LogOpen(setLog);
// if(!bLogopen ) {
// System.err.println("Failed to open NetSDK log");
// }
// 设置断线重连回调接口设置过断线重连成功回调函数后当设备出现断线情况SDK内部会自动进行重连操作
// 此操作为可选操作,但建议用户进行设置
netsdk.CLIENT_SetAutoReconnect(haveReConnect, null);
//设置登录超时时间和尝试次数,可选
int waitTime = 5000; //登录请求响应超时时间设置为5S
int tryTimes = 3; //登录时尝试建立链接1次
netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);
// 设置更多网络参数NET_PARAM的nWaittimenConnectTryNum成员与CLIENT_SetConnectTime
// 接口设置的登录设备超时时间和尝试次数意义相同,可选
NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
netParam.nConnectTime = 10000; // 登录时尝试建立链接的超时时间
netParam.nGetConnInfoTime = 3000; // 设置子连接的超时时间
netsdk.CLIENT_SetNetworkParam(netParam);
CaptureReceiveCB captureReceiveCB = SpringContextUtil.getBean(CaptureReceiveCB.class);
netsdk.CLIENT_SetSnapRevCallBack(captureReceiveCB, null);
return true;
}
/**
* \if ENGLISH_LANG
* CleanUp
* \else
*
* \endif
*/
public static void cleanup() {
if(bLogopen) {
netsdk.CLIENT_LogClose();
}
if(bInit) {
netsdk.CLIENT_Cleanup();
}
}
/**
* \if ENGLISH_LANG
* Login Device
* \else
*
* \endif
*/
public static LLong login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword,Integer id) {
//IntByReference nError = new IntByReference(0);
//入参
init(disConnectCallBack,haveReConnect);
NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam=new NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
pstInParam.nPort=m_nPort;
pstInParam.szIP=m_strIp.getBytes();
pstInParam.szPassword=m_strPassword.getBytes();
pstInParam.szUserName=m_strUser.getBytes();
//出参
NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam=new NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
pstOutParam.stuDeviceInfo=m_stDeviceInfo;
//m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
m_hLoginHandle=netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
attachPTZStatusProc();
return m_hLoginHandle;
}
/**
*
*/
public static void attachPTZStatusProc() {
NET_IN_PTZ_STATUS_PROC pIn = new NET_IN_PTZ_STATUS_PROC();
pIn.nChannel = 0;
pIn.cbPTZStatusProc = CallBack.CBPTZStatusProcCallBack.getInstance();
pIn.write();
NET_OUT_PTZ_STATUS_PROC pOut = new NET_OUT_PTZ_STATUS_PROC();
pOut.write();
LLong AttachHandle = netsdk.CLIENT_AttachPTZStatusProc(m_hLoginHandle, pIn.getPointer(), pOut.getPointer(),0);
if(AttachHandle.longValue() == 0) {
System.out.printf("attachPTZStatusProc fail, ErrCode=\n");
}else {
System.out.println("attachPTZStatusProc success");
}
}
/**
* \if ENGLISH_LANG
* Logout Device
* \else
*
* \endif
*/
public static boolean logout() {
if(m_hLoginHandle.longValue() == 0) {
return false;
}
boolean bRet = netsdk.CLIENT_Logout(m_hLoginHandle);
if(bRet) {
m_hLoginHandle.setValue(0);
}
return bRet;
}
}

@ -0,0 +1,32 @@
package com.zhehekeji.web.lib;
/**
* @author 251823
* @description
* @date 2021/02/26
*/
public class NET_IN_PTZ_STATUS_PROC extends NetSDKLib.SdkStructure{
/**
* dwSize;
*/
public int dwSize;
/**
*
*/
public int nChannel;
/**
*
*/
public NetSDKLib.fPTZStatusProcCallBack cbPTZStatusProc;
/**
*
*/
public long dwUser;
public NET_IN_PTZ_STATUS_PROC(){
this.dwSize = this.size();
}
}

@ -0,0 +1,15 @@
package com.zhehekeji.web.lib;
/**
* @author 251823
* @description
* @date 2021/02/26
*/
public class NET_OUT_PTZ_STATUS_PROC extends NetSDKLib.SdkStructure{
/**
* dwSize;
*/
public int dwSize;
public NET_OUT_PTZ_STATUS_PROC(){
this.dwSize = this.size();
}
}

@ -0,0 +1,124 @@
package com.zhehekeji.web.lib;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import java.io.UnsupportedEncodingException;
import java.nio.CharBuffer;
/** Provides a temporary allocation of an immutable C string
* (<code>const char*</code> or <code>const wchar_t*</code>) for use when
* converting a Java String into a native memory function argument.
*
* @author Todd Fast, todd.fast@sun.com
* @author twall@users.sf.net
*/
public class NativeString implements CharSequence, Comparable<Object> {
private Pointer pointer;
private boolean wide;
/** Create a native string (NUL-terminated array of <code>char</code>).<p>
* If the system property <code>jna.encoding</code> is set, its value will
* be used to encode the native string. If not set or if the encoding
* is unavailable, the default platform encoding will be used.
*/
public NativeString(String string) {
this(string, false);
}
/** Create a native string as a NUL-terminated array of <code>wchar_t</code>
* (if <code>wide</code> is true) or <code>char</code>.<p>
* If the system property <code>jna.encoding</code> is set, its value will
* be used to encode the native <code>char</code>string.
* If not set or if the encoding is unavailable, the default platform
* encoding will be used.
*
* @param string value to write to native memory
* @param wide whether to store the String as <code>wchar_t</code>
*/
public NativeString(String string, boolean wide) {
if (string == null) {
throw new NullPointerException("String must not be null");
}
// Allocate the memory to hold the string. Note, we have to
// make this 1 element longer in order to accommodate the terminating
// NUL (which is generated in Pointer.setString()).
this.wide = wide;
if (wide) {
int len = (string.length() + 1 ) * Native.WCHAR_SIZE;
pointer = new Memory(len);
pointer.setString(0, string);
}
else {
byte[] data = getBytes(string);
pointer = new Memory(data.length + 1);
pointer.write(0, data, 0, data.length);
pointer.setByte(data.length, (byte)0);
}
}
static byte[] getBytes(String s) {
try {
return getBytes(s, System.getProperty("jna.encoding"));
}
catch (UnsupportedEncodingException e) {
return s.getBytes();
}
}
/** Return a byte array corresponding to the given String, using the given
encoding.
*/
static byte[] getBytes(String s, String encoding) throws UnsupportedEncodingException {
if (encoding != null) {
return s.getBytes(encoding);
}
return s.getBytes();
}
public int hashCode() {
return toString().hashCode();
}
public boolean equals(Object other) {
if (other instanceof CharSequence) {
return compareTo(other) == 0;
}
return false;
}
public String toString() {
String s = wide ? "const wchar_t*" : "const char*";
s += "(" + pointer.getString(0) + ")";
return s;
}
public Pointer getPointer() {
return pointer;
}
public char charAt(int index) {
return toString().charAt(index);
}
public int length() {
return toString().length();
}
public CharSequence subSequence(int start, int end) {
return CharBuffer.wrap(toString()).subSequence(start, end);
}
public int compareTo(Object other) {
if (other == null)
return 1;
return toString().compareTo(other.toString());
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,41 @@
package com.zhehekeji.web.lib;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* sdk
*/
public class OrderCmdSerial {
public static ConcurrentHashMap<Integer, OrderInfo> orderCmdSerialMap = new ConcurrentHashMap<>(Short.MAX_VALUE * 4);
private static AtomicInteger serialIntId = new AtomicInteger(0);
public static Integer nextSerial() {
return serialIntId.addAndGet(1);
}
public static void put(Integer serialId, OrderInfo orderInfo) {
orderCmdSerialMap.put(serialId, orderInfo);
}
public static void remove(Integer serialId) {
orderCmdSerialMap.remove(serialId);
}
public static OrderInfo getOrderInfo(Integer serialId) {
return orderCmdSerialMap.get(serialId);
}
public static void main(String[] args) {
AtomicInteger integer = new AtomicInteger(Integer.MAX_VALUE);
System.out.println(integer);
//System.out.println(integer.addAndGet(1));
System.out.println((short) integer.addAndGet(1));
AtomicInteger next = new AtomicInteger(integer.addAndGet(1));
System.out.println(next.get());
}
}

@ -0,0 +1,48 @@
package com.zhehekeji.web.lib;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@AllArgsConstructor
@Getter
@Setter
public class OrderInfo {
private Long orderId;
private String orderNum;
private String shelveId;
private Integer row;
private Integer column;
private String code;
/**
* true
* false
*/
private Boolean isPre;
/**
* 1: 2 3
*/
// private Integer type;
// @AllArgsConstructor
// @Getter
// public enum OrderPathType{
// PUT(1),
// OUTPUT(3),
// GOODS(2),
//
// ;
// private Integer type;
//
// }
}

@ -0,0 +1,87 @@
package com.zhehekeji.web.lib;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* sdk 使
*/
public class OrderRealtime {
/**
* key :streetId
* value:
*/
private static Map<Integer, String> orderMap = new ConcurrentHashMap<>();
/**
* key: streetId
* value:id warn
*/
private static Map<Integer, Long> warnIdMap = new ConcurrentHashMap<>();
/**
*
* key:
* value:
*/
private static Map<NetSDKLib.LLong, String> playOrderMap = new ConcurrentHashMap<>();
public static void startOrder(Integer streetId, String orderNum) {
orderMap.put(streetId, orderNum);
}
/**
*
*
* @param streetId
* @return
*/
public static String getOrderByStreetId(Integer streetId) {
return orderMap.get(streetId);
}
public static void startWarn(Integer streetId, Long warnId) {
if (warnId != null) {
warnIdMap.put(streetId, warnId);
}
}
public static Long getWarnId(Integer streetId) {
return warnIdMap.get(streetId);
}
public static void cleanWarn(Integer streetId) {
warnIdMap.remove(streetId);
}
/**
*
*
* @param streetId
* @return
*/
public static String stopOrder(Integer streetId) {
String orderNum = orderMap.get(streetId);
orderMap.remove(streetId);
return orderNum;
}
public static void startDownload(NetSDKLib.LLong play, String orderNum) {
playOrderMap.put(play, orderNum);
}
/**
*
*
* @param play
* @return
*/
public static String overDownload(NetSDKLib.LLong play) {
String orderNum = playOrderMap.get(play);
playOrderMap.remove(play);
return orderNum;
}
}

@ -0,0 +1,369 @@
package com.zhehekeji.web.lib;
import com.sun.jna.*;
import com.sun.jna.ptr.IntByReference;
import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.core.util.Assert;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
/**
*
*
*/
@Slf4j
public class PtzControlModule {
private static CallBack.Mp4ReceiveCB mp4ReceiveCB = new CallBack.Mp4ReceiveCB();
/**
*
*/
public static boolean ptzControlUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlUpEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlDownEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlLeftStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlLeftEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlRightStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlRightEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlLeftUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlLeftUpEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlRightUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlRightUpEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlLeftDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlLeftDownEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
0, 0, 0, 1);
}
/**
*
*/
public static boolean ptzControlRightDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN,
lParam1, lParam2, 0, 0);
}
public static boolean ptzControlRightDownEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN,
0, 0, 0, 1);
}
/**
* +
*/
public static boolean ptzControlZoomAddStart(Integer cameraId, int nChannelID, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL,
0, lParam2, 0, 0);
}
public static boolean ptzControlZoomAddEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL,
0, 0, 0, 1);
}
/**
* -
*/
public static boolean ptzControlZoomDecStart(Integer cameraId, int nChannelID, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL,
0, lParam2, 0, 0);
}
public static boolean ptzControlZoomDecEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL,
0, 0, 0, 1);
}
/**
* +
*/
public static boolean ptzControlFocusAddStart(Integer cameraId, int nChannelID, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL,
0, lParam2, 0, 0);
}
public static boolean ptzControlFocusAddEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL,
0, 0, 0, 1);
}
/**
* -
*/
public static boolean ptzControlFocusDecStart(Integer cameraId, int nChannelID, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL,
0, lParam2, 0, 0);
}
public static boolean ptzControlFocusDecEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL,
0, 0, 0, 1);
}
/**
* +
*/
public static boolean ptzControlIrisAddStart(Integer cameraId, int nChannelID, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL,
0, lParam2, 0, 0);
}
public static boolean ptzControlIrisAddEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL,
0, 0, 0, 1);
}
/**
* -
*/
public static boolean ptzControlIrisDecStart(Integer cameraId, int nChannelID, int lParam2) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL,
0, lParam2, 0, 0);
}
public static boolean ptzControlIrisDecEnd(Integer cameraId, int nChannelID) {
return LoginModule.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL,
0, 0, 0, 1);
}
public static boolean pic(Integer cameraId, int nChannelID, OrderInfo orderInfo) {
NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS();
stuSnapParams.Channel = nChannelID; // channel
stuSnapParams.mode = 0; // capture picture mode
stuSnapParams.Quality = 3; // picture quality
stuSnapParams.InterSnap = 0; // timer capture picture time interval
stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial();
OrderCmdSerial.put(stuSnapParams.CmdSerial, orderInfo);
IntByReference reserved = new IntByReference(0);
return LoginModule.netsdk.CLIENT_SnapPictureEx(CameraConnMap.getConnId(cameraId), stuSnapParams, reserved);
}
public static void downloadMp4(Integer cameraId, String path, String orderNum, LocalDateTime start, LocalDateTime end) {
//视频结束时间加上5s
end = end.plusSeconds(5);
PathUtil.checkDirc(path);
NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME();
startTime.setTime(start.getYear(), start.getMonthValue(), start.getDayOfMonth(), start.getHour(), start.getMinute(), start.getSecond());
NetSDKLib.NET_TIME endTime = new NetSDKLib.NET_TIME();
endTime.setTime(end.getYear(), end.getMonthValue(), end.getDayOfMonth(), end.getHour(), end.getMinute(), end.getSecond());
NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE download_by_data_type = new NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE();
download_by_data_type.nChannelID = 0;
download_by_data_type.stStartTime = startTime;
download_by_data_type.stStopTime = endTime;
download_by_data_type.szSavedFileName = path;
download_by_data_type.emDataType = 3;
download_by_data_type.emRecordType = 0;
download_by_data_type.cbDownLoadPos = mp4ReceiveCB;
download_by_data_type.write();
NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE net_out_download_by_data_type = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE();
net_out_download_by_data_type.write();
log.info("start download mp4 path:{},startTime:{} ,endTime:{},now:{}", path, startTime.toString(), endTime.toString(), LocalDateTime.now());
NetSDKLib.LLong l = LoginModule.netsdk.CLIENT_DownloadByDataType(CameraConnMap.getConnId(cameraId), download_by_data_type.getPointer(), net_out_download_by_data_type.getPointer(), 8000);
if (l.longValue() == 0) {
log.error("download error :{}", ToolKits.getErrorCodePrint());
} else {
OrderRealtime.startDownload(l, orderNum);
}
}
/**
*
*
* @param ptzId ID
* @param name
* @param cameraId ID,
*/
public static void ptz(Integer ptzId, String name, Integer cameraId) {
int dwzCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL;
Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwzCommand, 0, ptzId, 0, 0, ToolKits.GetGBKStringToPointer(name));
Assert.isTrue(ok, "设置失败");
}
/**
*
*
* @param ptzId
* @param cameraId
*/
public static void toPtz(Integer ptzId, Integer cameraId) {
int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand, 0, ptzId, 0, 0, null);
if (!ok) {
log.error("转至预置点 失败 cameraId:{},ptzId:{},error:{}", cameraId, ptzId,ToolKits.getErrorCodePrint());
}
}
/**
*
*
* @param cameraId
*/
public static void toPtzSlow(Integer cameraId,Integer x) {
int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_MOVE_ABSOLUTELY;
NetSDKLib.PTZ_CONTROL_ABSOLUTELY absolutely = new NetSDKLib.PTZ_CONTROL_ABSOLUTELY();
absolutely.stuPosition.nPositionX = x;
absolutely.stuPosition.nPositionY = 0;
absolutely.stuSpeed.fPositionX = 0.2f;
absolutely.stuSpeed.fPositionY = 0.2f;
absolutely.write();
//absolutely.stuSpeed.fZoom = 0.5f;
Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand,
0, 0, 0, 0, absolutely.getPointer());
if (!ok) {
log.error("toPtzSlow cameraId:{},error:{}", cameraId,ToolKits.getErrorCodePrint());
}
}
/**
* 360
* @param cameraId
*/
public static void turn360C8(Integer cameraId,Integer ptzId){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
int nType = NetSDKLib.NET_DEVSTATE_PTZ_LOCATION;
NetSDKLib.NET_PTZ_LOCATION_INFO ptzLocationInfo = new NetSDKLib.NET_PTZ_LOCATION_INFO();
IntByReference intRetLen = new IntByReference();
ptzLocationInfo.write();
System.out.println("size:"+ptzLocationInfo.size());
boolean bRet = LoginModule.netsdk.CLIENT_QueryDevState(CameraConnMap.getConnId(cameraId), nType, ptzLocationInfo.getPointer(), ptzLocationInfo.size(), intRetLen, 3000);
ptzLocationInfo.read();
if (bRet) {
log.debug("xParam:{}",ptzLocationInfo.nPTZPan);
int qq = (ptzLocationInfo.nPTZPan + 1799) % 3600;
log.debug("xParam turn to:{}",qq);
toPtzSlow(cameraId,qq);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
qq = (qq + 1799) % 3600;
log.debug("xParam turn to:{}",qq);
toPtzSlow(cameraId,qq);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ptzId != null){
log.info(" turn C8");
toPtz(ptzId,cameraId);
}
} else {
log.error("turn360C8 cameraId:{},error:{}",cameraId,ToolKits.getErrorCodePrint());
}
}
});
thread.start();
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save