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:
		
							
								
								
									
										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 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 kunmeng
					kunmeng