Golang подключение к камере Hikvision через SDK - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь подключиться к счетной камере hikvision iDS-2CD6810F / C. Я использую golang вер. 1.14.2 и SDK EN-HCNetSDKV6.1.4.17_build20200331_Win64

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "syscall"
    "unsafe"
)

var (
    hcNetSDK             *syscall.LazyDLL
    netDVRInit           *syscall.LazyProc
    netDVRSetConnectTime *syscall.LazyProc
    netDVRSetReconnect   *syscall.LazyProc
    netDVRLogin          *syscall.LazyProc
    netDVRGetLastError   *syscall.LazyProc
)

const (
    serialnoLen int = 48
)

type netDVRDeviceInfo struct {
    sSerialNumber     [serialnoLen]byte
    byAlarmInPortNum  byte
    byAlarmOutPortNum byte
    byDiskNum         byte
    byDVRType         byte
    byChanNum         byte
    byStartChan       byte
}

func init() {
    dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
    hcNetSDK = syscall.NewLazyDLL(dir + "\\HCNetSDK.dll")
    netDVRInit = hcNetSDK.NewProc("NET_DVR_Init")
    netDVRSetConnectTime = hcNetSDK.NewProc("NET_DVR_SetConnectTime")
    netDVRSetReconnect = hcNetSDK.NewProc("NET_DVR_SetReconnect")
    netDVRLogin = hcNetSDK.NewProc("NET_DVR_Login")
    netDVRGetLastError = hcNetSDK.NewProc("NET_DVR_GetLastError")
}

//NetDVRInit export
func NetDVRInit() {
    // Initialize
    r1, _, err := netDVRInit.Call()
    fmt.Print("netDVRInit: ")
    if r1 == 0 {
        fmt.Println(err)
    } else {
        fmt.Println("Ok")
    }
    // Set connected time and reconnected time
    r1, _, err = netDVRSetConnectTime.Call(5000, 1)
    fmt.Print("netDVRSetConnectTime: ")
    if r1 == 0 {
        fmt.Println(err)
    } else {
        fmt.Println("Ok")
    }
    fmt.Print("netDVRSetReconnect: ")
    r1, _, err = netDVRSetReconnect.Call(10000, 1)
    if r1 == 0 {
        fmt.Println(err)
    } else {
        fmt.Println("Ok")
    }
}

//NetDVRLogin export
func NetDVRLogin() {
    devInfo := new(netDVRDeviceInfo)
    user, _, _ := netDVRLogin.Call(
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("10.10.10.10"))),
        8000,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("admin"))),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("admin_pass"))),
        uintptr(unsafe.Pointer(devInfo)))
    err, _, _ := netDVRGetLastError.Call()
    fmt.Println("netDVRLogin: ")
    fmt.Printf("    User: %d\n", int16(user))
    fmt.Printf("    Error: %d\n", err)
}

С этим источником после вызова NetDVRInit() и NetDVRLogin() я получаю следующий вывод:

netDVRInit: Ok
netDVRSetConnectTime: Ok
netDVRSetReconnect: Ok
netDVRLogin: 
    User: -1
    Error: 7

Ошибка 7 в соответствии с документацией: «Не удалось подключиться к устройству. Устройство отключено или истекло время ожидания соединения из-за сети». Но я уверен, что они верны. Есть идеи?

...