Nvr.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package HikSDK
  2. /*
  3. #cgo LDFLAGS: -Wl,--allow-multiple-definition
  4. #include <stdio.h>
  5. #include <string.h>
  6. */
  7. import "C"
  8. import (
  9. "gitea.com/kunmeng/HikNetSDKPkg/Core"
  10. "time"
  11. "unsafe"
  12. )
  13. type Nvr struct {
  14. userId Core.LONG
  15. deviceInfo Core.NET_DVR_DEVICEINFO_V30
  16. }
  17. func NewNvr(Ip string, Port int, Username, Password string) (*Nvr, error) {
  18. userId, deviceInfo, err := Core.Login(Ip, Port, Username, Password)
  19. if err != nil {
  20. return nil, err
  21. }
  22. return &Nvr{
  23. userId: userId,
  24. deviceInfo: deviceInfo,
  25. }, nil
  26. }
  27. func (this *Nvr) getNvrUTCDiff() (int, error) {
  28. var data Core.NET_DVR_NETAPPCFG
  29. var dataPtr = unsafe.Pointer(data.GetCPtr())
  30. err := Core.GetDVRConfig(this.userId, 222, 0, dataPtr, Core.DWORD(unsafe.Sizeof(data.GetC())))
  31. if err != nil {
  32. return 0, err
  33. }
  34. data.Go()
  35. return int(data.StruNtpClientParam.CTimeDifferenceH)*60 + int(data.StruNtpClientParam.CTimeDifferenceM)*map[int8]int{-1: -1, 0: 1}[data.StruNtpClientParam.CTimeDifferenceH>>7], nil
  36. }
  37. func (this *Nvr) CheckTimeRegionWithMonth(Year, Month, Channel uint16) ([]uint8, error) {
  38. // //// 查当月
  39. var struSearchParam Core.NET_DVR_MRD_SEARCH_PARAM
  40. struSearchParam.DwSize = Core.DWORD(unsafe.Sizeof(struSearchParam.GetC()))
  41. struSearchParam.WYear = Core.WORD(Year)
  42. struSearchParam.ByMonth = Core.BYTE(Month)
  43. struSearchParam.StruStreamInfo.DwChannel = Core.DWORD(32 + Channel)
  44. struSearchParam.ByLocalOrUTC = 1
  45. struSearchParam.ByDrawFrame = 0
  46. struSearchParam.ByStreamType = 0
  47. var dataPtr = unsafe.Pointer(struSearchParam.GetCPtr())
  48. var ResData Core.NET_DVR_MRD_SEARCH_RESULT
  49. var ResDataPtr = unsafe.Pointer(ResData.GetCPtr())
  50. err := Core.GetDVRDeviceConfig(this.userId, 6164, 0, dataPtr, Core.DWORD(unsafe.Sizeof(struSearchParam.GetC())), nil, ResDataPtr, Core.DWORD(unsafe.Sizeof(ResData.GetC())))
  51. if err != nil {
  52. return nil, err
  53. }
  54. ResData.Go()
  55. var res []uint8
  56. for i := 0; i < 32; i++ {
  57. if ResData.ByRecordDistribution[i] != 0 {
  58. res = append(res, uint8(i+1))
  59. }
  60. }
  61. return res, nil
  62. }
  63. func (this *Nvr) CheckTimeRegionWithDay(Year, Month, Day, Channel uint16) ([]TimeRange, error) {
  64. var Data Core.NET_DVR_FILECOND
  65. Data.DwFileType = 0xff
  66. Data.DwIsLocked = 0xff
  67. Data.DwUseCardNo = 0
  68. Data.LChannel = Core.LONG(32 + Channel)
  69. StartTime := Core.NET_DVR_TIME{
  70. DwYear: Core.DWORD(Year),
  71. DwMonth: Core.DWORD(Month),
  72. DwDay: Core.DWORD(Day),
  73. DwHour: 0,
  74. DwMinute: 0,
  75. DwSecond: 0,
  76. }
  77. StopTime := Core.NET_DVR_TIME{
  78. DwYear: Core.DWORD(Year),
  79. DwMonth: Core.DWORD(Month),
  80. DwDay: Core.DWORD(Day),
  81. DwHour: 23,
  82. DwMinute: 59,
  83. DwSecond: 59,
  84. }
  85. Data.StruStartTime = StartTime
  86. Data.StruStopTime = StopTime
  87. QueryHandle, err := Core.NET_DVR_FindFile_V30(this.userId, Data)
  88. if err != nil {
  89. return nil, err
  90. }
  91. var FindData Core.NET_DVR_FINDDATA_V30
  92. var state Core.LONG
  93. state, err = Core.NET_DVR_FindNextFile_V30(QueryHandle, &FindData)
  94. if err != nil {
  95. return nil, err
  96. }
  97. ByUTCDiff, err := this.getNvrUTCDiff()
  98. if err != nil {
  99. return nil, err
  100. }
  101. var res []TimeRange
  102. for state > 0 {
  103. var StartTimeObj time.Time
  104. var EndTimeObj time.Time
  105. if state == 1001 {
  106. break
  107. }
  108. if state == 1003 {
  109. break
  110. }
  111. if state == 1004 {
  112. break
  113. }
  114. if state == 1000 {
  115. if uint16(FindData.StruStartTime.DwDay) != Day {
  116. StartTimeObj = time.Date(int(FindData.StruStartTime.DwYear), time.Month(FindData.StruStartTime.DwMonth), int(FindData.StruStartTime.DwDay+1), 0, 0, 0, 0, time.UTC)
  117. } else {
  118. 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)
  119. }
  120. if uint16(FindData.StruStopTime.DwDay) != Day {
  121. EndTimeObj = time.Date(int(FindData.StruStopTime.DwYear), time.Month(FindData.StruStopTime.DwMonth), int(FindData.StruStopTime.DwDay-1), 23, 59, 59, 59, time.UTC)
  122. } else {
  123. 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)
  124. }
  125. StartTimeObj = StartTimeObj.Add(time.Minute * time.Duration(-ByUTCDiff))
  126. EndTimeObj = EndTimeObj.Add(time.Minute * time.Duration(-ByUTCDiff))
  127. res = append(res, TimeRange{
  128. StartTime: StartTimeObj,
  129. EndTime: EndTimeObj,
  130. })
  131. }
  132. if state == 1002 {
  133. FindData = Core.NET_DVR_FINDDATA_V30{}
  134. state, err = Core.NET_DVR_FindNextFile_V30(QueryHandle, &FindData)
  135. time.Sleep(time.Millisecond * 5)
  136. continue
  137. }
  138. FindData = Core.NET_DVR_FINDDATA_V30{}
  139. state, err = Core.NET_DVR_FindNextFile_V30(QueryHandle, &FindData)
  140. if err != nil {
  141. return res, err
  142. }
  143. time.Sleep(time.Millisecond * 5)
  144. }
  145. err = Core.NET_DVR_FindClose_V30(QueryHandle)
  146. if err != nil {
  147. return nil, err
  148. }
  149. return res, nil
  150. }
  151. func (this *Nvr) Logout() error {
  152. return Core.Logout(this.userId)
  153. }
  154. type TimeRange struct {
  155. StartTime time.Time
  156. EndTime time.Time
  157. }