Files
HikNetSDKPkg/Nvr.go

180 lines
5.1 KiB
Go

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) GetTimeZone() (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.GetTimeZone()
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+1), 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-1), 23, 59, 59, 59, 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)
}
func (this *Nvr) Status() bool {
if this == nil {
return false
}
return Core.NET_DVR_RemoteControl(this.userId)
}
type TimeRange struct {
StartTime time.Time
EndTime time.Time
}