173 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			5.0 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) 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+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), 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
 | |
| }
 | 
