123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- 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), 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)
- }
- type TimeRange struct {
- StartTime time.Time
- EndTime time.Time
- }
|