Nvr.go 5.3 KB

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