package HikSDK /* #cgo LDFLAGS: -Wl,--allow-multiple-definition #include #include */ 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 }