1. 增加 GetDVRDeviceConfig函数
2. 增加 NET_DVR_FindNextFile_V30 函数 3. 增加 NET_DVR_FindFile_V30 函数 4. 增加 新的 Go 数据模型 5. 规范化 Go 数据模型 6. 调整部分的 C 头文件中的结构体,以修复 CGo 无法识别函数参数类型的问题(https://stackoverflow.com/questions/59353668/get-the-struct-from-c-to-golang) 7. 简化球机退出登陆 8. 实现 NVR 相关接口 9. 编写 NVR 接口测试用例
This commit is contained in:
@@ -299,7 +299,6 @@ func (this *BallCamera) PtzGotoPut(Action int, P, T, Z float64) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
//println(PByte, TByte, ZByte)
|
|
||||||
pBuf := append([]byte{0xff, 0x01, 0x00, 0x4b}, PByte...)
|
pBuf := append([]byte{0xff, 0x01, 0x00, 0x4b}, PByte...)
|
||||||
tBuf := append([]byte{0xff, 0x01, 0x00, 0x4d}, TByte...)
|
tBuf := append([]byte{0xff, 0x01, 0x00, 0x4d}, TByte...)
|
||||||
zBuf := append([]byte{0xff, 0x01, 0x00, 0x4f}, ZByte...)
|
zBuf := append([]byte{0xff, 0x01, 0x00, 0x4f}, ZByte...)
|
||||||
@@ -430,16 +429,6 @@ func verify(data []byte) (byte, error) {
|
|||||||
return byte(checksum), nil
|
return byte(checksum), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (receiver *BallCamera) Logout() error {
|
func (this *BallCamera) Logout() error {
|
||||||
//if receiver._type == BuKongQiu {
|
return Core.Logout(this.userId)
|
||||||
// err := core.SerialStop(receiver.serialStartHandle)
|
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
err := Core.Logout(receiver.userId)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
500
Core/Type.go
500
Core/Type.go
@@ -1,5 +1,16 @@
|
|||||||
package Core
|
package Core
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include "HCNetSDK.h"
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
const NAME_LEN = 32
|
||||||
|
const PASSWD_LEN = 16
|
||||||
|
const SERIALNO_LEN = 48
|
||||||
|
const STREAM_ID_LEN = 32
|
||||||
|
|
||||||
type DWORD uint32
|
type DWORD uint32
|
||||||
type WORD uint16
|
type WORD uint16
|
||||||
type USHORT WORD
|
type USHORT WORD
|
||||||
@@ -15,32 +26,467 @@ type UINT uint32
|
|||||||
// type LPDWORD unsigned int*
|
// type LPDWORD unsigned int*
|
||||||
type UINT64 uint64
|
type UINT64 uint64
|
||||||
type INT64 int64
|
type INT64 int64
|
||||||
|
|
||||||
type NET_DVR_DEVICEINFO_V30 struct {
|
type NET_DVR_DEVICEINFO_V30 struct {
|
||||||
SSerialNumber [48]BYTE
|
cData C.NET_DVR_DEVICEINFO_V30
|
||||||
ByAlarmInPortNum BYTE
|
SSerialNumber []byte // 序列号
|
||||||
ByAlarmOutPortNum BYTE
|
ByAlarmInPortNum BYTE // 模拟报警输入个数
|
||||||
ByDiskNum BYTE
|
ByAlarmOutPortNum BYTE // 模拟报警输出个数
|
||||||
ByDVRType BYTE
|
ByDiskNum BYTE // 硬盘个数
|
||||||
ByChanNum BYTE
|
ByDVRType BYTE // 设备类型
|
||||||
ByStartChan BYTE
|
ByChanNum BYTE // 设备模拟通道个数,数字(IP)通道最大个数为byIPChanNum + byHighDChanNum*256
|
||||||
ByAudioChanNum BYTE
|
ByStartChan BYTE // 模拟通道的起始通道号,从1开始。数字通道的起始通道号见下面参数byStartDChan
|
||||||
ByIPChanNum BYTE
|
ByAudioChanNum BYTE // 设备语音对讲通道数
|
||||||
ByZeroChanNum BYTE
|
ByIPChanNum BYTE // 设备最大数字通道个数,低8位,高8位见byHighDChanNum。可以根据IP通道个数来判断是否调用NET_DVR_GetDVRConfig(配置命令NET_DVR_GET_IPPARACFG_V40)获取模拟和数字通道相关参数(NET_DVR_IPPARACFG_V40)。
|
||||||
ByMainProto BYTE
|
ByZeroChanNum BYTE // 零通道编码个数
|
||||||
BySubProto BYTE
|
ByMainProto BYTE // 主码流传输协议类型:0- private,1- rtsp,2- 同时支持私有协议和rtsp协议取流(默认采用私有协议取流)
|
||||||
BySupport BYTE
|
BySubProto BYTE // 子码流传输协议类型:0- private,1- rtsp,2- 同时支持私有协议和rtsp协议取流(默认采用私有协议取流)
|
||||||
BySupport1 BYTE
|
BySupport BYTE // 能力,位与结果为0表示不支持,1表示支持
|
||||||
BySupport2 BYTE
|
//bySupport & 0x1,表示是否支持智能搜索
|
||||||
WDevType WORD
|
//bySupport & 0x2,表示是否支持备份
|
||||||
BySupport3 BYTE
|
//bySupport & 0x4,表示是否支持压缩参数能力获取
|
||||||
ByMultiStreamProto BYTE
|
//bySupport & 0x8, 表示是否支持双网卡
|
||||||
ByStartDChan BYTE
|
//bySupport & 0x10, 表示支持远程SADP
|
||||||
ByStartDTalkChan BYTE
|
//bySupport & 0x20, 表示支持Raid卡功能
|
||||||
ByHighDChanNum BYTE
|
//bySupport & 0x40, 表示支持IPSAN目录查找
|
||||||
BySupport4 BYTE
|
//bySupport & 0x80, 表示支持rtp over rtsp
|
||||||
ByLanguageType BYTE
|
BySupport1 BYTE // 能力集扩充,位与结果为0表示不支持,1表示支持
|
||||||
ByVoiceInChanNum BYTE
|
//bySupport1 & 0x1, 表示是否支持snmp v30
|
||||||
ByStartVoiceInChanNo BYTE
|
//bySupport1 & 0x2, 表示是否支持区分回放和下载
|
||||||
byMirrorChanNum BYTE
|
//bySupport1 & 0x4, 表示是否支持布防优先级
|
||||||
wStartMirrorChanNo WORD
|
//bySupport1 & 0x8, 表示智能设备是否支持布防时间段扩展
|
||||||
|
//bySupport1 & 0x10,表示是否支持多磁盘数(超过33个)
|
||||||
|
//bySupport1 & 0x20,表示是否支持rtsp over http
|
||||||
|
//bySupport1 & 0x80,表示是否支持车牌新报警信息,且还表示是否支持NET_DVR_IPPARACFG_V40配置
|
||||||
|
BySupport2 BYTE // 能力集扩充,位与结果为0表示不支持,1表示支持
|
||||||
|
//bySupport2 & 0x1, 表示解码器是否支持通过URL取流解码
|
||||||
|
//bySupport2 & 0x2, 表示是否支持FTPV40
|
||||||
|
//bySupport2 & 0x4, 表示是否支持ANR(断网录像)
|
||||||
|
//bySupport2 & 0x20, 表示是否支持单独获取设备状态子项
|
||||||
|
//bySupport2 & 0x40, 表示是否是码流加密设备
|
||||||
|
WDevType WORD // 设备型号,详见下文列表
|
||||||
|
BySupport3 BYTE // 能力集扩充,位与结果为0表示不支持,1表示支持
|
||||||
|
//bySupport3 & 0x1, 表示是否支持多码流
|
||||||
|
//bySupport3 & 0x4, 表示是否支持按组配置,具体包含通道图像参数、报警输入参数、IP报警输入/输出接入参数、用户参数、设备工作状态、JPEG抓图、定时和时间抓图、硬盘盘组管理等
|
||||||
|
//bySupport3 & 0x20, 表示是否支持通过DDNS域名解析取流
|
||||||
|
ByMultiStreamProto BYTE // 是否支持多码流,按位表示,位与结果:0-不支持,1-支持
|
||||||
|
//byMultiStreamProto & 0x1, 表示是否支持码流3
|
||||||
|
//byMultiStreamProto & 0x2, 表示是否支持码流4
|
||||||
|
//byMultiStreamProto & 0x40,表示是否支持主码流
|
||||||
|
//byMultiStreamProto & 0x80,表示是否支持子码流
|
||||||
|
ByStartDChan BYTE // 起始数字通道号,0表示无数字通道,比如DVR或IPC
|
||||||
|
ByStartDTalkChan BYTE // 起始数字对讲通道号,区别于模拟对讲通道号,0表示无数字对讲通道
|
||||||
|
ByHighDChanNum BYTE // 数字通道个数,高8位
|
||||||
|
BySupport4 BYTE // 能力集扩展,按位表示,位与结果:0- 不支持,1- 支持
|
||||||
|
//bySupport4 & 0x01, 表示是否所有码流类型同时支持RTSP和私有协议
|
||||||
|
//bySupport4 & 0x10, 表示是否支持域名方式挂载网络硬盘
|
||||||
|
ByLanguageType BYTE // 支持语种能力,按位表示,位与结果:0- 不支持,1- 支持
|
||||||
|
//byLanguageType ==0,表示老设备,不支持该字段
|
||||||
|
//byLanguageType & 0x1,表示是否支持中文
|
||||||
|
//byLanguageType & 0x2,表示是否支持英文
|
||||||
|
ByVoiceInChanNum BYTE // 音频输入通道数
|
||||||
|
ByStartVoiceInChanNo BYTE // 音频输入起始通道号,0表示无效
|
||||||
|
BySupport5 BYTE
|
||||||
|
BySupport6 BYTE
|
||||||
|
ByMirrorChanNum BYTE // 镜像通道个数,录播主机中用于表示导播通道
|
||||||
|
WStartMirrorChanNo WORD // 起始镜像通道号
|
||||||
|
BySupport7 BYTE
|
||||||
|
ByRes2 BYTE // 保留,置为0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_DEVICEINFO_V30) GetCPtr() *C.NET_DVR_DEVICEINFO_V30 {
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_DEVICEINFO_V30) Go() {
|
||||||
|
this.SSerialNumber = C.GoBytes(unsafe.Pointer(&this.cData.sSerialNumber), C.int(SERIALNO_LEN))
|
||||||
|
this.ByAlarmInPortNum = BYTE(this.cData.byAlarmInPortNum)
|
||||||
|
this.ByAlarmOutPortNum = BYTE(this.cData.byAlarmOutPortNum)
|
||||||
|
this.ByDiskNum = BYTE(this.cData.byDiskNum)
|
||||||
|
this.ByDVRType = BYTE(this.cData.byDVRType)
|
||||||
|
this.ByChanNum = BYTE(this.cData.byChanNum)
|
||||||
|
this.ByStartChan = BYTE(this.cData.byStartChan)
|
||||||
|
this.ByAudioChanNum = BYTE(this.cData.byAudioChanNum)
|
||||||
|
this.ByIPChanNum = BYTE(this.cData.byIPChanNum)
|
||||||
|
this.ByZeroChanNum = BYTE(this.cData.byZeroChanNum)
|
||||||
|
this.ByMainProto = BYTE(this.cData.byMainProto)
|
||||||
|
this.BySubProto = BYTE(this.cData.bySubProto)
|
||||||
|
this.BySupport = BYTE(this.cData.bySupport)
|
||||||
|
this.BySupport1 = BYTE(this.cData.bySupport1)
|
||||||
|
this.BySupport2 = BYTE(this.cData.bySupport2)
|
||||||
|
this.WDevType = WORD(this.cData.wDevType)
|
||||||
|
this.BySupport3 = BYTE(this.cData.bySupport3)
|
||||||
|
this.ByMultiStreamProto = BYTE(this.cData.byMultiStreamProto)
|
||||||
|
this.ByStartDChan = BYTE(this.cData.byStartDChan)
|
||||||
|
this.ByStartDTalkChan = BYTE(this.cData.byStartDTalkChan)
|
||||||
|
this.ByHighDChanNum = BYTE(this.cData.byHighDChanNum)
|
||||||
|
this.BySupport4 = BYTE(this.cData.bySupport4)
|
||||||
|
this.ByLanguageType = BYTE(this.cData.byLanguageType)
|
||||||
|
this.ByVoiceInChanNum = BYTE(this.cData.byVoiceInChanNum)
|
||||||
|
this.ByStartVoiceInChanNo = BYTE(this.cData.byStartVoiceInChanNo)
|
||||||
|
this.BySupport5 = BYTE(this.cData.bySupport5)
|
||||||
|
this.BySupport6 = BYTE(this.cData.bySupport6)
|
||||||
|
this.ByMirrorChanNum = BYTE(this.cData.byMirrorChanNum)
|
||||||
|
this.WStartMirrorChanNo = WORD(this.cData.wStartMirrorChanNo)
|
||||||
|
this.BySupport7 = BYTE(this.cData.bySupport7)
|
||||||
|
this.ByRes2 = BYTE(this.cData.byRes2)
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_NETAPPCFG struct {
|
||||||
|
cData C.NET_DVR_NETAPPCFG
|
||||||
|
DwSize DWORD
|
||||||
|
SDNSIp []byte
|
||||||
|
StruNtpClientParam NET_DVR_NTPPARA
|
||||||
|
StruDDNSClientParam NET_DVR_DDNSPARA
|
||||||
|
Res []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_NETAPPCFG) GetCPtr() *C.NET_DVR_NETAPPCFG {
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_NETAPPCFG) GetC() C.NET_DVR_NETAPPCFG {
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_NETAPPCFG) Go() {
|
||||||
|
this.DwSize = DWORD(this.cData.dwSize)
|
||||||
|
this.SDNSIp = C.GoBytes(unsafe.Pointer(&this.cData.sDNSIp), C.int(16))
|
||||||
|
this.StruNtpClientParam.SetC(this.cData.struNtpClientParam)
|
||||||
|
this.StruDDNSClientParam.SetC(this.cData.struDDNSClientParam)
|
||||||
|
this.Res = C.GoBytes(unsafe.Pointer(&this.cData.res), C.int(464))
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_NTPPARA struct {
|
||||||
|
cData C.NET_DVR_NTPPARA
|
||||||
|
SNTPServer []byte
|
||||||
|
WInterval WORD
|
||||||
|
ByEnableNTP BYTE
|
||||||
|
CTimeDifferenceH int8
|
||||||
|
CTimeDifferenceM int8
|
||||||
|
Res1 BYTE
|
||||||
|
WNtpPort WORD
|
||||||
|
Res2 []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set NET_DVR_NTPPARA 的 cData
|
||||||
|
func (this *NET_DVR_NTPPARA) SetC(cData C.NET_DVR_NTPPARA) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_NTPPARA) GetCPtr() *C.NET_DVR_NTPPARA {
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_NTPPARA) Go() {
|
||||||
|
this.SNTPServer = C.GoBytes(unsafe.Pointer(&this.cData.sNTPServer), C.int(64))
|
||||||
|
this.WInterval = WORD(this.cData.wInterval)
|
||||||
|
this.ByEnableNTP = BYTE(this.cData.byEnableNTP)
|
||||||
|
this.CTimeDifferenceH = int8(this.cData.cTimeDifferenceH)
|
||||||
|
this.CTimeDifferenceM = int8(this.cData.cTimeDifferenceM)
|
||||||
|
this.Res1 = BYTE(this.cData.res1)
|
||||||
|
this.WNtpPort = WORD(this.cData.wNtpPort)
|
||||||
|
this.Res2 = C.GoBytes(unsafe.Pointer(&this.cData.res2), C.int(8))
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_DDNSPARA struct {
|
||||||
|
cData C.NET_DVR_DDNSPARA
|
||||||
|
SUserName []byte
|
||||||
|
SPassword []byte
|
||||||
|
SDomainName []byte
|
||||||
|
ByEnableDDNS BYTE
|
||||||
|
Res []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_DDNSPARA) SetC(cData C.NET_DVR_DDNSPARA) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_DDNSPARA) GetCPtr() *C.NET_DVR_DDNSPARA {
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_DDNSPARA) Go() {
|
||||||
|
this.SUserName = C.GoBytes(unsafe.Pointer(&this.cData.sUsername), C.int(NAME_LEN))
|
||||||
|
this.SPassword = C.GoBytes(unsafe.Pointer(&this.cData.sPassword), C.int(PASSWD_LEN))
|
||||||
|
this.SDomainName = C.GoBytes(unsafe.Pointer(&this.cData.sDomainName), C.int(64))
|
||||||
|
this.ByEnableDDNS = BYTE(this.cData.byEnableDDNS)
|
||||||
|
this.Res = C.GoBytes(unsafe.Pointer(&this.cData.res), C.int(15))
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_MRD_SEARCH_PARAM struct {
|
||||||
|
cData C.NET_DVR_MRD_SEARCH_PARAM
|
||||||
|
DwSize DWORD
|
||||||
|
StruStreamInfo NET_DVR_STREAM_INFO
|
||||||
|
WYear WORD
|
||||||
|
ByMonth BYTE
|
||||||
|
ByDrawFrame BYTE
|
||||||
|
ByStreamType BYTE
|
||||||
|
ByLocalOrUTC BYTE
|
||||||
|
ByRes []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_PARAM) g2c() {
|
||||||
|
this.cData.dwSize = C.DWORD(this.DwSize)
|
||||||
|
this.cData.struStreamInfo = this.StruStreamInfo.GetC()
|
||||||
|
this.cData.wYear = C.WORD(this.WYear)
|
||||||
|
this.cData.byMonth = C.BYTE(this.ByMonth)
|
||||||
|
this.cData.byDrawFrame = C.BYTE(this.ByDrawFrame)
|
||||||
|
this.cData.byStreamType = C.BYTE(this.ByStreamType)
|
||||||
|
this.cData.byLocalOrUTC = C.BYTE(this.ByLocalOrUTC)
|
||||||
|
var cArray [30]C.BYTE
|
||||||
|
for i := 0; i < len(this.ByRes); i++ {
|
||||||
|
cArray[i] = C.BYTE(this.ByRes[i])
|
||||||
|
}
|
||||||
|
this.cData.byRes = cArray
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_PARAM) SetC(cData C.NET_DVR_MRD_SEARCH_PARAM) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_PARAM) GetCPtr() *C.NET_DVR_MRD_SEARCH_PARAM {
|
||||||
|
this.g2c()
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_PARAM) GetC() C.NET_DVR_MRD_SEARCH_PARAM {
|
||||||
|
this.g2c()
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_PARAM) Go() {
|
||||||
|
this.DwSize = DWORD(this.cData.dwSize)
|
||||||
|
this.StruStreamInfo.SetC(this.cData.struStreamInfo)
|
||||||
|
this.WYear = WORD(this.cData.wYear)
|
||||||
|
this.ByMonth = BYTE(this.cData.byMonth)
|
||||||
|
this.ByDrawFrame = BYTE(this.cData.byDrawFrame)
|
||||||
|
this.ByStreamType = BYTE(this.cData.byStreamType)
|
||||||
|
this.ByLocalOrUTC = BYTE(this.cData.byLocalOrUTC)
|
||||||
|
this.ByRes = C.GoBytes(unsafe.Pointer(&this.cData.byRes), C.int(30))
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_STREAM_INFO struct {
|
||||||
|
cData C.NET_DVR_STREAM_INFO
|
||||||
|
DwSize DWORD
|
||||||
|
ByID []byte
|
||||||
|
DwChannel DWORD
|
||||||
|
ByRes []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_STREAM_INFO) g2c() {
|
||||||
|
var byIDArray [STREAM_ID_LEN]C.BYTE
|
||||||
|
for i := 0; i < len(this.ByID); i++ {
|
||||||
|
byIDArray[i] = C.BYTE(this.ByID[i])
|
||||||
|
}
|
||||||
|
var byResArray [32]C.BYTE
|
||||||
|
for i := 0; i < len(this.ByRes); i++ {
|
||||||
|
byResArray[i] = C.BYTE(this.ByRes[i])
|
||||||
|
}
|
||||||
|
this.cData.dwSize = C.DWORD(this.DwSize)
|
||||||
|
this.cData.byID = byIDArray
|
||||||
|
this.cData.dwChannel = C.DWORD(this.DwChannel)
|
||||||
|
this.cData.byRes = byResArray
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_STREAM_INFO) SetC(cData C.NET_DVR_STREAM_INFO) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_STREAM_INFO) GetC() C.NET_DVR_STREAM_INFO {
|
||||||
|
this.g2c()
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_STREAM_INFO) GetCPtr() *C.NET_DVR_STREAM_INFO {
|
||||||
|
this.g2c()
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_STREAM_INFO) Go() {
|
||||||
|
this.DwSize = DWORD(this.cData.dwSize)
|
||||||
|
this.ByID = C.GoBytes(unsafe.Pointer(&this.cData.byID), C.int(STREAM_ID_LEN))
|
||||||
|
this.DwChannel = DWORD(this.cData.dwChannel)
|
||||||
|
this.ByRes = C.GoBytes(unsafe.Pointer(&this.cData.byRes), C.int(32))
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_MRD_SEARCH_RESULT struct {
|
||||||
|
cData C.NET_DVR_MRD_SEARCH_RESULT
|
||||||
|
DwSize DWORD
|
||||||
|
ByRecordDistribution []byte
|
||||||
|
ByHasEventRecode []byte
|
||||||
|
ByRes BYTE
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_RESULT) g2c() {
|
||||||
|
var byRecordDistributionArray [32]C.BYTE
|
||||||
|
for i := 0; i < len(this.ByRecordDistribution); i++ {
|
||||||
|
byRecordDistributionArray[i] = C.BYTE(this.ByRecordDistribution[i])
|
||||||
|
}
|
||||||
|
var byHasEventRecodeArray [31]C.BYTE
|
||||||
|
for i := 0; i < len(this.ByHasEventRecode); i++ {
|
||||||
|
byHasEventRecodeArray[i] = C.BYTE(this.ByHasEventRecode[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
this.cData.dwSize = C.DWORD(this.DwSize)
|
||||||
|
this.cData.byRecordDistribution = byRecordDistributionArray
|
||||||
|
this.cData.byHasEventRecode = byHasEventRecodeArray
|
||||||
|
this.cData.byRes = C.BYTE(this.ByRes)
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_RESULT) SetC(cData C.NET_DVR_MRD_SEARCH_RESULT) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_RESULT) GetC() C.NET_DVR_MRD_SEARCH_RESULT {
|
||||||
|
this.g2c()
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_RESULT) GetCPtr() *C.NET_DVR_MRD_SEARCH_RESULT {
|
||||||
|
this.g2c()
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_MRD_SEARCH_RESULT) Go() {
|
||||||
|
this.DwSize = DWORD(this.cData.dwSize)
|
||||||
|
this.ByRecordDistribution = C.GoBytes(unsafe.Pointer(&this.cData.byRecordDistribution), C.int(32))
|
||||||
|
this.ByHasEventRecode = C.GoBytes(unsafe.Pointer(&this.cData.byHasEventRecode), C.int(31))
|
||||||
|
this.ByRes = BYTE(this.cData.byRes)
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_FILECOND struct {
|
||||||
|
cData C.NET_DVR_FILECOND
|
||||||
|
LChannel LONG
|
||||||
|
DwFileType DWORD
|
||||||
|
DwIsLocked DWORD
|
||||||
|
DwUseCardNo DWORD
|
||||||
|
SCardNumber []byte
|
||||||
|
StruStartTime NET_DVR_TIME
|
||||||
|
StruStopTime NET_DVR_TIME
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_FILECOND) g2c() {
|
||||||
|
this.cData.lChannel = C.LONG(this.LChannel)
|
||||||
|
this.cData.dwFileType = C.DWORD(this.DwFileType)
|
||||||
|
this.cData.dwIsLocked = C.DWORD(this.DwIsLocked)
|
||||||
|
this.cData.dwUseCardNo = C.DWORD(this.DwUseCardNo)
|
||||||
|
var sCardNumberArray [32]C.BYTE
|
||||||
|
for i := 0; i < len(this.SCardNumber); i++ {
|
||||||
|
sCardNumberArray[i] = C.BYTE(this.SCardNumber[i])
|
||||||
|
}
|
||||||
|
this.cData.sCardNumber = sCardNumberArray
|
||||||
|
this.cData.struStartTime = this.StruStartTime.GetC()
|
||||||
|
this.cData.struStopTime = this.StruStopTime.GetC()
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_FILECOND) SetC(cData C.NET_DVR_FILECOND) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_FILECOND) GetC() C.NET_DVR_FILECOND {
|
||||||
|
this.g2c()
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_FILECOND) GetCPtr() *C.NET_DVR_FILECOND {
|
||||||
|
this.g2c()
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_FILECOND) Go() {
|
||||||
|
this.LChannel = LONG(this.cData.lChannel)
|
||||||
|
this.DwFileType = DWORD(this.cData.dwFileType)
|
||||||
|
this.DwIsLocked = DWORD(this.cData.dwIsLocked)
|
||||||
|
this.DwUseCardNo = DWORD(this.cData.dwUseCardNo)
|
||||||
|
this.SCardNumber = C.GoBytes(unsafe.Pointer(&this.cData.sCardNumber), C.int(64))
|
||||||
|
this.StruStartTime.SetC(this.cData.struStartTime)
|
||||||
|
this.StruStopTime.SetC(this.cData.struStopTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_TIME struct {
|
||||||
|
cData C.NET_DVR_TIME
|
||||||
|
DwYear DWORD
|
||||||
|
DwMonth DWORD
|
||||||
|
DwDay DWORD
|
||||||
|
DwHour DWORD
|
||||||
|
DwMinute DWORD
|
||||||
|
DwSecond DWORD
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_TIME) g2c() {
|
||||||
|
this.cData.dwYear = C.DWORD(this.DwYear)
|
||||||
|
this.cData.dwMonth = C.DWORD(this.DwMonth)
|
||||||
|
this.cData.dwDay = C.DWORD(this.DwDay)
|
||||||
|
this.cData.dwHour = C.DWORD(this.DwHour)
|
||||||
|
this.cData.dwMinute = C.DWORD(this.DwMinute)
|
||||||
|
this.cData.dwSecond = C.DWORD(this.DwSecond)
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_TIME) SetC(cData C.NET_DVR_TIME) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_TIME) GetC() C.NET_DVR_TIME {
|
||||||
|
this.g2c()
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_TIME) GetCPtr() *C.NET_DVR_TIME {
|
||||||
|
this.g2c()
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_TIME) Go() {
|
||||||
|
this.DwYear = DWORD(this.cData.dwYear)
|
||||||
|
this.DwMonth = DWORD(this.cData.dwMonth)
|
||||||
|
this.DwDay = DWORD(this.cData.dwDay)
|
||||||
|
this.DwHour = DWORD(this.cData.dwHour)
|
||||||
|
this.DwMinute = DWORD(this.cData.dwMinute)
|
||||||
|
this.DwSecond = DWORD(this.cData.dwSecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
type NET_DVR_FINDDATA_V30 struct {
|
||||||
|
cData C.NET_DVR_FINDDATA_V30
|
||||||
|
SFileName []byte
|
||||||
|
StruStartTime NET_DVR_TIME
|
||||||
|
StruStopTime NET_DVR_TIME
|
||||||
|
DwFileSize DWORD
|
||||||
|
SCardNum []byte
|
||||||
|
ByLocked BYTE
|
||||||
|
ByFileType BYTE
|
||||||
|
ByRes []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_FINDDATA_V30) g2c() {
|
||||||
|
var sFileNameArray [100]C.BYTE
|
||||||
|
for i := 0; i < len(this.SFileName); i++ {
|
||||||
|
sFileNameArray[i] = C.BYTE(this.SFileName[i])
|
||||||
|
}
|
||||||
|
this.cData.struStartTime = this.StruStartTime.GetC()
|
||||||
|
this.cData.struStopTime = this.StruStopTime.GetC()
|
||||||
|
this.cData.dwFileSize = C.DWORD(this.DwFileSize)
|
||||||
|
var sCardNumArray [32]C.BYTE
|
||||||
|
for i := 0; i < len(this.SCardNum); i++ {
|
||||||
|
sCardNumArray[i] = C.BYTE(this.SCardNum[i])
|
||||||
|
}
|
||||||
|
this.cData.byLocked = C.BYTE(this.ByLocked)
|
||||||
|
this.cData.byFileType = C.BYTE(this.ByFileType)
|
||||||
|
var byResArray [2]C.BYTE
|
||||||
|
for i := 0; i < len(this.ByRes); i++ {
|
||||||
|
byResArray[i] = C.BYTE(this.ByRes[i])
|
||||||
|
}
|
||||||
|
this.cData.byRes = byResArray
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_FINDDATA_V30) SetC(cData C.NET_DVR_FINDDATA_V30) {
|
||||||
|
this.cData = cData
|
||||||
|
this.Go()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NET_DVR_FINDDATA_V30) GetC() C.NET_DVR_FINDDATA_V30 {
|
||||||
|
this.g2c()
|
||||||
|
return this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_FINDDATA_V30) GetCPtr() *C.NET_DVR_FINDDATA_V30 {
|
||||||
|
this.g2c()
|
||||||
|
return &this.cData
|
||||||
|
}
|
||||||
|
func (this *NET_DVR_FINDDATA_V30) Go() {
|
||||||
|
this.SFileName = C.GoBytes(unsafe.Pointer(&this.cData.sFileName), C.int(100))
|
||||||
|
this.StruStartTime.SetC(this.cData.struStartTime)
|
||||||
|
this.StruStopTime.SetC(this.cData.struStopTime)
|
||||||
|
this.DwFileSize = DWORD(this.cData.dwFileSize)
|
||||||
|
this.SCardNum = C.GoBytes(unsafe.Pointer(&this.cData.sCardNum), C.int(32))
|
||||||
|
this.ByLocked = BYTE(this.cData.byLocked)
|
||||||
|
this.ByFileType = BYTE(this.cData.byFileType)
|
||||||
|
this.ByRes = C.GoBytes(unsafe.Pointer(&this.cData.byRes), C.int(12))
|
||||||
}
|
}
|
||||||
|
|||||||
77
Core/core.go
77
Core/core.go
@@ -49,13 +49,13 @@ func Login(Ip string, Port int, Username string, Password string) (LONG, NET_DVR
|
|||||||
defer C.free(unsafe.Pointer(cUsername))
|
defer C.free(unsafe.Pointer(cUsername))
|
||||||
cPassword := C.CString(Password)
|
cPassword := C.CString(Password)
|
||||||
defer C.free(unsafe.Pointer(cPassword))
|
defer C.free(unsafe.Pointer(cPassword))
|
||||||
var DeviceInfo C.NET_DVR_DEVICEINFO_V30
|
var DeviceInfo NET_DVR_DEVICEINFO_V30
|
||||||
cUserId := C.NET_DVR_Login_V30(cIp, C.WORD(Port), cUsername, cPassword, &DeviceInfo)
|
cUserId := C.NET_DVR_Login_V30(cIp, C.WORD(Port), cUsername, cPassword, DeviceInfo.GetCPtr())
|
||||||
if LONG(cUserId) == -1 {
|
if LONG(cUserId) == -1 {
|
||||||
return -1, NET_DVR_DEVICEINFO_V30{}, LastError("NET_DVR_Login_V30")
|
return -1, NET_DVR_DEVICEINFO_V30{}, LastError("NET_DVR_Login_V30")
|
||||||
}
|
}
|
||||||
DATA := CNET_DVR_DEVICEINFO_V30ToGO(&DeviceInfo)
|
DeviceInfo.Go()
|
||||||
return LONG(cUserId), DATA, nil
|
return LONG(cUserId), DeviceInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Logout(userId LONG) error {
|
func Logout(userId LONG) error {
|
||||||
@@ -67,6 +67,12 @@ func Logout(userId LONG) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func NET_DVR_FindClose_V30(QueryHandle LONG) error {
|
||||||
|
if C.NET_DVR_FindClose_V30(C.LONG(QueryHandle)) == C.FALSE {
|
||||||
|
return LastError("NET_DVR_FindClose_V30")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func SerialStart(UserId LONG, CallBack serialDataCallBack) (LONG, error) {
|
func SerialStart(UserId LONG, CallBack serialDataCallBack) (LONG, error) {
|
||||||
SerialStartParam := C.NET_DVR_SERIALSTART_V40{}
|
SerialStartParam := C.NET_DVR_SERIALSTART_V40{}
|
||||||
@@ -111,19 +117,10 @@ func (d *CDVR_PTZPOS) Go() DVR_PTZPOS {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (d *CDVR_PTZPOS) Set(Action, PanPos, TiltPos, ZoomPos float64) {
|
func (d *CDVR_PTZPOS) Set(Action, PanPos, TiltPos, ZoomPos float64) {
|
||||||
//a1 := DEC2HEX(Action)
|
|
||||||
//a2 := DEC2HEX(PanPos)
|
|
||||||
//a3 := DEC2HEX(TiltPos)
|
|
||||||
//a4 := DEC2HEX(ZoomPos)
|
|
||||||
//println(a1, a2, a3, a4)
|
|
||||||
d.wAction = C.WORD(Action)
|
d.wAction = C.WORD(Action)
|
||||||
d.wPanPos = C.WORD(DEC2HEX(PanPos))
|
d.wPanPos = C.WORD(DEC2HEX(PanPos))
|
||||||
d.wTiltPos = C.WORD(DEC2HEX(TiltPos))
|
d.wTiltPos = C.WORD(DEC2HEX(TiltPos))
|
||||||
d.wZoomPos = C.WORD(DEC2HEX(ZoomPos))
|
d.wZoomPos = C.WORD(DEC2HEX(ZoomPos))
|
||||||
//d.wAction = C.WORD(1)
|
|
||||||
//d.wPanPos = C.WORD(0x77)
|
|
||||||
//d.wTiltPos = C.WORD(0x88)
|
|
||||||
//d.wZoomPos = C.WORD(0x99)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type DVR_PTZPOS struct {
|
type DVR_PTZPOS struct {
|
||||||
@@ -189,6 +186,14 @@ func SetDVRConfig(lUserID LONG, dwCommand DWORD, lChannel LONG, lpInBuffer unsaf
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetDVRDeviceConfig(lUserID LONG, dwCommand DWORD, dwCount DWORD, lpInBuffer unsafe.Pointer, dwInBufferSize DWORD, lpStatusList unsafe.Pointer, lpOutBuffer unsafe.Pointer, dwOutBufferSize DWORD) error {
|
||||||
|
cResult := C.NET_DVR_GetDeviceConfig(C.LONG(lUserID), C.DWORD(dwCommand), C.DWORD(dwCount), C.LPVOID(lpInBuffer), C.DWORD(dwInBufferSize), C.LPVOID(lpStatusList), C.LPVOID(lpOutBuffer), C.DWORD(dwOutBufferSize))
|
||||||
|
if cResult != 1 {
|
||||||
|
return LastError("NET_DVR_GetDeviceConfig")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func LastError(funcName string) error {
|
func LastError(funcName string) error {
|
||||||
cCode := C.NET_DVR_GetLastError()
|
cCode := C.NET_DVR_GetLastError()
|
||||||
if cCode == 0 {
|
if cCode == 0 {
|
||||||
@@ -214,39 +219,19 @@ func PTZControlWithSpeed_Other(lUserID LONG, lChannel LONG, dwPTZCommand DWORD,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func CNET_DVR_DEVICEINFO_V30ToGO(CData *C.NET_DVR_DEVICEINFO_V30) NET_DVR_DEVICEINFO_V30 {
|
func NET_DVR_FindFile_V30(lUserID LONG, lpFindFileInfo NET_DVR_FILECOND) (LONG, error) {
|
||||||
var goData NET_DVR_DEVICEINFO_V30
|
Handle := C.NET_DVR_FindFile_V30(C.LONG(lUserID), lpFindFileInfo.GetCPtr())
|
||||||
|
if Handle == -1 {
|
||||||
// Copy the SSerialNumber field
|
return 0, LastError("NET_DVR_FindFile_V30")
|
||||||
for i := 0; i < 48; i++ {
|
}
|
||||||
goData.SSerialNumber[i] = BYTE(byte(CData.sSerialNumber[i]))
|
return LONG(Handle), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy other fields
|
func NET_DVR_FindNextFile_V30(lFindHandle LONG, lpFindData *NET_DVR_FINDDATA_V30) (LONG, error) {
|
||||||
goData.ByAlarmInPortNum = BYTE(CData.byAlarmInPortNum)
|
state := C.NET_DVR_FindNextFile_V30(C.LONG(lFindHandle), (*lpFindData).GetCPtr())
|
||||||
goData.ByAlarmOutPortNum = BYTE(CData.byAlarmOutPortNum)
|
if state == -1 {
|
||||||
goData.ByDiskNum = BYTE(CData.byDiskNum)
|
return 0, LastError("NET_DVR_FindNextFile_V30")
|
||||||
goData.ByDVRType = BYTE(CData.byDVRType)
|
}
|
||||||
goData.ByChanNum = BYTE(CData.byChanNum)
|
lpFindData.Go()
|
||||||
goData.ByStartChan = BYTE(CData.byStartChan)
|
return LONG(state), nil
|
||||||
goData.ByAudioChanNum = BYTE(CData.byAudioChanNum)
|
|
||||||
goData.ByIPChanNum = BYTE(CData.byIPChanNum)
|
|
||||||
goData.ByZeroChanNum = BYTE(CData.byZeroChanNum)
|
|
||||||
goData.ByMainProto = BYTE(CData.byMainProto)
|
|
||||||
goData.BySubProto = BYTE(CData.bySubProto)
|
|
||||||
goData.BySupport = BYTE(CData.bySupport)
|
|
||||||
goData.BySupport1 = BYTE(CData.bySupport1)
|
|
||||||
goData.BySupport2 = BYTE(CData.bySupport2)
|
|
||||||
goData.WDevType = WORD(CData.wDevType)
|
|
||||||
goData.BySupport3 = BYTE(CData.bySupport3)
|
|
||||||
goData.ByMultiStreamProto = BYTE(CData.byMultiStreamProto)
|
|
||||||
goData.ByStartDChan = BYTE(CData.byStartDChan)
|
|
||||||
goData.ByStartDTalkChan = BYTE(CData.byStartDTalkChan)
|
|
||||||
goData.ByHighDChanNum = BYTE(CData.byHighDChanNum)
|
|
||||||
goData.BySupport4 = BYTE(CData.bySupport4)
|
|
||||||
goData.ByLanguageType = BYTE(CData.byLanguageType)
|
|
||||||
goData.ByVoiceInChanNum = BYTE(CData.byVoiceInChanNum)
|
|
||||||
goData.ByStartVoiceInChanNo = BYTE(CData.byStartVoiceInChanNo)
|
|
||||||
|
|
||||||
return goData
|
|
||||||
}
|
}
|
||||||
|
|||||||
172
Nvr.go
Normal file
172
Nvr.go
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
package HikSDK
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo LDFLAGS: -Wl,--allow-multiple-definition
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"gitea.com/kunmeng/HikNetSDKPkg/Core"
|
||||||
|
"time"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Nvr struct {
|
||||||
|
userId Core.LONG
|
||||||
|
deviceInfo Core.NET_DVR_DEVICEINFO_V30
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNvr(Ip string, Port int, Username, Password string) (*Nvr, error) {
|
||||||
|
userId, deviceInfo, err := Core.Login(Ip, Port, Username, Password)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Nvr{
|
||||||
|
userId: userId,
|
||||||
|
deviceInfo: deviceInfo,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Nvr) getNvrUTCDiff() (int, error) {
|
||||||
|
var data Core.NET_DVR_NETAPPCFG
|
||||||
|
var dataPtr = unsafe.Pointer(data.GetCPtr())
|
||||||
|
err := Core.GetDVRConfig(this.userId, 222, 0, dataPtr, Core.DWORD(unsafe.Sizeof(data.GetC())))
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
data.Go()
|
||||||
|
|
||||||
|
return int(data.StruNtpClientParam.CTimeDifferenceH)*60 + int(data.StruNtpClientParam.CTimeDifferenceM)*map[int8]int{-1: -1, 0: 1}[data.StruNtpClientParam.CTimeDifferenceH>>7], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Nvr) CheckTimeRegionWithMonth(Year, Month, Channel uint16) ([]uint8, error) {
|
||||||
|
|
||||||
|
// //// 查当月
|
||||||
|
var struSearchParam Core.NET_DVR_MRD_SEARCH_PARAM
|
||||||
|
struSearchParam.DwSize = Core.DWORD(unsafe.Sizeof(struSearchParam.GetC()))
|
||||||
|
struSearchParam.WYear = Core.WORD(Year)
|
||||||
|
struSearchParam.ByMonth = Core.BYTE(Month)
|
||||||
|
struSearchParam.StruStreamInfo.DwChannel = Core.DWORD(32 + Channel)
|
||||||
|
struSearchParam.ByLocalOrUTC = 1
|
||||||
|
struSearchParam.ByDrawFrame = 0
|
||||||
|
struSearchParam.ByStreamType = 0
|
||||||
|
|
||||||
|
var dataPtr = unsafe.Pointer(struSearchParam.GetCPtr())
|
||||||
|
|
||||||
|
var ResData Core.NET_DVR_MRD_SEARCH_RESULT
|
||||||
|
var ResDataPtr = unsafe.Pointer(ResData.GetCPtr())
|
||||||
|
|
||||||
|
err := Core.GetDVRDeviceConfig(this.userId, 6164, 0, dataPtr, Core.DWORD(unsafe.Sizeof(struSearchParam.GetC())), nil, ResDataPtr, Core.DWORD(unsafe.Sizeof(ResData.GetC())))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ResData.Go()
|
||||||
|
var res []uint8
|
||||||
|
for i := 0; i < 32; i++ {
|
||||||
|
if ResData.ByRecordDistribution[i] != 0 {
|
||||||
|
res = append(res, uint8(i+1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Nvr) CheckTimeRegionWithDay(Year, Month, Day, Channel uint16) ([]TimeRange, error) {
|
||||||
|
var Data Core.NET_DVR_FILECOND
|
||||||
|
Data.DwFileType = 0xff
|
||||||
|
Data.DwIsLocked = 0xff
|
||||||
|
Data.DwUseCardNo = 0
|
||||||
|
Data.LChannel = Core.LONG(32 + Channel)
|
||||||
|
StartTime := Core.NET_DVR_TIME{
|
||||||
|
DwYear: Core.DWORD(Year),
|
||||||
|
DwMonth: Core.DWORD(Month),
|
||||||
|
DwDay: Core.DWORD(Day),
|
||||||
|
DwHour: 0,
|
||||||
|
DwMinute: 0,
|
||||||
|
DwSecond: 0,
|
||||||
|
}
|
||||||
|
StopTime := Core.NET_DVR_TIME{
|
||||||
|
DwYear: Core.DWORD(Year),
|
||||||
|
DwMonth: Core.DWORD(Month),
|
||||||
|
DwDay: Core.DWORD(Day),
|
||||||
|
DwHour: 23,
|
||||||
|
DwMinute: 59,
|
||||||
|
DwSecond: 59,
|
||||||
|
}
|
||||||
|
Data.StruStartTime = StartTime
|
||||||
|
Data.StruStopTime = StopTime
|
||||||
|
QueryHandle, err := Core.NET_DVR_FindFile_V30(this.userId, Data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var FindData Core.NET_DVR_FINDDATA_V30
|
||||||
|
var state Core.LONG
|
||||||
|
state, err = Core.NET_DVR_FindNextFile_V30(QueryHandle, &FindData)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ByUTCDiff, err := this.getNvrUTCDiff()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var res []TimeRange
|
||||||
|
for state > 0 {
|
||||||
|
var StartTimeObj time.Time
|
||||||
|
var EndTimeObj time.Time
|
||||||
|
|
||||||
|
if state == 1001 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if state == 1003 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if state == 1004 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if state == 1000 {
|
||||||
|
if uint16(FindData.StruStartTime.DwDay) != Day {
|
||||||
|
StartTimeObj = time.Date(int(FindData.StruStartTime.DwYear), time.Month(FindData.StruStartTime.DwMonth), int(FindData.StruStartTime.DwDay), 0, 0, 0, 0, time.UTC)
|
||||||
|
} else {
|
||||||
|
StartTimeObj = time.Date(int(FindData.StruStartTime.DwYear), time.Month(FindData.StruStartTime.DwMonth), int(FindData.StruStartTime.DwDay), int(FindData.StruStartTime.DwHour), int(FindData.StruStartTime.DwMinute), int(FindData.StruStartTime.DwSecond), 0, time.UTC)
|
||||||
|
}
|
||||||
|
if uint16(FindData.StruStopTime.DwDay) != Day {
|
||||||
|
EndTimeObj = time.Date(int(FindData.StruStopTime.DwYear), time.Month(FindData.StruStopTime.DwMonth), int(FindData.StruStopTime.DwDay), 0, 0, 0, 0, time.UTC)
|
||||||
|
} else {
|
||||||
|
EndTimeObj = time.Date(int(FindData.StruStopTime.DwYear), time.Month(FindData.StruStopTime.DwMonth), int(FindData.StruStopTime.DwDay), int(FindData.StruStopTime.DwHour), int(FindData.StruStopTime.DwMinute), int(FindData.StruStopTime.DwSecond), 0, time.UTC)
|
||||||
|
}
|
||||||
|
StartTimeObj = StartTimeObj.Add(time.Minute * time.Duration(ByUTCDiff))
|
||||||
|
EndTimeObj = EndTimeObj.Add(time.Minute * time.Duration(ByUTCDiff))
|
||||||
|
res = append(res, TimeRange{
|
||||||
|
StartTime: StartTimeObj,
|
||||||
|
EndTime: EndTimeObj,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if state == 1002 {
|
||||||
|
FindData = Core.NET_DVR_FINDDATA_V30{}
|
||||||
|
state, err = Core.NET_DVR_FindNextFile_V30(QueryHandle, &FindData)
|
||||||
|
time.Sleep(time.Millisecond * 5)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
FindData = Core.NET_DVR_FINDDATA_V30{}
|
||||||
|
state, err = Core.NET_DVR_FindNextFile_V30(QueryHandle, &FindData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
time.Sleep(time.Millisecond * 5)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = Core.NET_DVR_FindClose_V30(QueryHandle)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
func (this *Nvr) Logout() error {
|
||||||
|
return Core.Logout(this.userId)
|
||||||
|
}
|
||||||
|
|
||||||
|
type TimeRange struct {
|
||||||
|
StartTime time.Time
|
||||||
|
EndTime time.Time
|
||||||
|
}
|
||||||
33
Nvr_test.go
Normal file
33
Nvr_test.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package HikSDK
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gitea.com/kunmeng/HikNetSDKPkg/Core"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewNvr(t *testing.T) {
|
||||||
|
err := Core.Init()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
nvr, err := NewNvr("192.168.211.124", 8000, "admin", "guanyaokeji8520")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
diff, err := nvr.getNvrUTCDiff()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.Log(diff)
|
||||||
|
month, err := nvr.CheckTimeRegionWithMonth(2025, 3, 1)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.Log(month)
|
||||||
|
timeList, err := nvr.CheckTimeRegionWithDay(2025, 3, 20, 1)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.Log(timeList)
|
||||||
|
}
|
||||||
@@ -12816,7 +12816,7 @@ typedef struct
|
|||||||
}NET_DVR_EMAILPARA, *LPNET_DVR_EMAILPARA;
|
}NET_DVR_EMAILPARA, *LPNET_DVR_EMAILPARA;
|
||||||
|
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
typedef struct
|
typedef struct NET_DVR_NETAPPCFG
|
||||||
{
|
{
|
||||||
DWORD dwSize;
|
DWORD dwSize;
|
||||||
char sDNSIp[16]; /* DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
|
char sDNSIp[16]; /* DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
|
||||||
@@ -13492,7 +13492,7 @@ typedef struct
|
|||||||
}NET_DVR_DEVICEINFO, *LPNET_DVR_DEVICEINFO;
|
}NET_DVR_DEVICEINFO, *LPNET_DVR_DEVICEINFO;
|
||||||
|
|
||||||
//NET_DVR_Login_V30()<29><><EFBFBD><EFBFBD><EFBFBD>ṹ
|
//NET_DVR_Login_V30()<29><><EFBFBD><EFBFBD><EFBFBD>ṹ
|
||||||
typedef struct
|
typedef struct NET_DVR_DEVICEINFO_V30
|
||||||
{
|
{
|
||||||
BYTE sSerialNumber[SERIALNO_LEN]; //<2F><><EFBFBD>к<EFBFBD>
|
BYTE sSerialNumber[SERIALNO_LEN]; //<2F><><EFBFBD>к<EFBFBD>
|
||||||
BYTE byAlarmInPortNum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
BYTE byAlarmInPortNum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
@@ -13781,7 +13781,7 @@ typedef struct
|
|||||||
}NET_DVR_FIND_DATA, *LPNET_DVR_FIND_DATA;
|
}NET_DVR_FIND_DATA, *LPNET_DVR_FIND_DATA;
|
||||||
|
|
||||||
//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>(9000)
|
//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>(9000)
|
||||||
typedef struct
|
typedef struct NET_DVR_FINDDATA_V30
|
||||||
{
|
{
|
||||||
char sFileName[100];//<2F>ļ<EFBFBD><C4BC><EFBFBD>
|
char sFileName[100];//<2F>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
NET_DVR_TIME struStartTime;//<2F>ļ<EFBFBD><C4BC>Ŀ<EFBFBD>ʼʱ<CABC><CAB1>
|
NET_DVR_TIME struStartTime;//<2F>ļ<EFBFBD><C4BC>Ŀ<EFBFBD>ʼʱ<CABC><CAB1>
|
||||||
@@ -13843,7 +13843,7 @@ typedef struct
|
|||||||
|
|
||||||
|
|
||||||
//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
||||||
typedef struct
|
typedef struct NET_DVR_FILECOND
|
||||||
{
|
{
|
||||||
LONG lChannel;//ͨ<><CDA8><EFBFBD><EFBFBD>
|
LONG lChannel;//ͨ<><CDA8><EFBFBD><EFBFBD>
|
||||||
DWORD dwFileType;//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
DWORD dwFileType;//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|||||||
Reference in New Issue
Block a user