├── .gitignore ├── Makefile ├── README.md ├── demo.go ├── go.mod ├── go.sum ├── include └── HCNetSDK.h ├── internal └── Device │ ├── HKDevice.go │ └── device.go ├── lib ├── Linux │ ├── HCNetSDKCom │ │ ├── libHCAlarm.so │ │ ├── libHCCoreDevCfg.so │ │ ├── libHCDisplay.so │ │ ├── libHCGeneralCfgMgr.so │ │ ├── libHCIndustry.so │ │ ├── libHCPlayBack.so │ │ ├── libHCPreview.so │ │ ├── libHCVoiceTalk.so │ │ ├── libStreamTransClient.so │ │ ├── libSystemTransform.so │ │ └── libanalyzedata.so │ ├── libHCCore.so │ ├── libcrypto.so │ ├── libhcnetsdk.so │ ├── libhpr.so │ └── libssl.so └── Windows │ ├── AudioRender.dll │ ├── ClientDemo.exe │ ├── EagleEyeRender.dll │ ├── GdiPlus.dll │ ├── GdiPlus.lib │ ├── HCCore.dll │ ├── HCCore.lib │ ├── HCNetSDK.dll │ ├── HCNetSDK.lib │ ├── HCNetSDKCom │ ├── AnalyzeData.dll │ ├── AudioIntercom.dll │ ├── HCAlarm.dll │ ├── HCAlarm.lib │ ├── HCCoreDevCfg.dll │ ├── HCDisplay.dll │ ├── HCGeneralCfgMgr.dll │ ├── HCGeneralCfgMgr.lib │ ├── HCIndustry.dll │ ├── HCPlayBack.dll │ ├── HCPreview.dll │ ├── HCPreview.lib │ ├── HCVoiceTalk.dll │ ├── OpenAL32.dll │ ├── StreamTransClient.dll │ ├── SystemTransform.dll │ └── libiconv2.dll │ ├── HXVA.dll │ ├── LocalXml.zip │ ├── MP_Render.dll │ ├── NPQos.dll │ ├── PlayCtrl.dll │ ├── PlayCtrl.lib │ ├── SuperRender.dll │ ├── YUVProcess.dll │ ├── hlog.dll │ ├── hpr.dll │ ├── libeay32.dll │ ├── libmmd.dll │ ├── log4cxx.properties │ └── ssleay32.dll └── main.go /.gitignore: -------------------------------------------------------------------------------- 1 | bin/* 2 | build/* 3 | .idea/* 4 | .vscode/* -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | export CGO_ENABLED=1 2 | export WDIR=${PWD} 3 | 4 | all: linux windows 5 | 6 | linux: 7 | cp -r lib/Linux/ build/ 8 | GOOS=linux CGO_CFLAGS="-I${WDIR}/include" CGO_LDFLAGS="-L${WDIR}/build -Wl,-rpath=${WDIR}/build -lhcnetsdk" go build -ldflags "-s -w" -o build/hik main.go 9 | 10 | windows: 11 | cp -r lib/Windows/ build/ 12 | CGO_LDFLAGS_ALLOW=".*" CGO_CFLAGS="-I${WDIR}/include" CGO_LDFLAGS="-L${WDIR}/build -Wl,--enable-stdcall-fixup,-rpath=${WDIR}/build -lHCNetSDK -lHCCore" GOOS=windows CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go build -ldflags "-s -w" -o build/hik.exe main.go 13 | 14 | clean: 15 | rm -r build 16 | 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 海康HCNetSDK-GO版本 2 | 3 | >参考连接 4 | > 5 | > 6 | 7 | ## 免责说明 8 | 仓库文件示例仅供大家**学习参考**,实际业务场景请自行封装 9 | 10 | ## 项目说明 11 | 12 | * 海康SDK实现Golang调用,实现基础的常用功能,主要针对报警、云台控制这些命令型接口。 13 | * 实际开发场景可能会大量使用`unsafe.Pointer`,有**一定的风险**,如果确定使用,建议由经验丰富的开发人员进行`Code Review`工作 14 | * 可以根据自己需求修改`include`下`HCNetSDK.h` 15 | * 遇到问题/有需求请提交 Issues,一起讨论 16 | * demo.go为参考链接示例,不包含报警功能 17 | * 默认为linux平台开发,再Windows平台请根据提示修改`HKDevice.go`中对应的变量类型 18 | 19 | ## 实现功能 20 | 21 | 1. 报警功能,只有布防方式可用,监听方式无法收到报警消息 22 | 2. 云台控制,个人测试正常 23 | 3. 视频预览,目前只是正常调用sdk,未进行界面视频预览,这里只是进行接口调用验证,实际业务场景还是建议走`http+StreamServer`,如c++的有`SRS`,golang有`lal`、`monibuca` 24 | 25 | ## 使用说明 26 | 27 | makefile编译 28 | 29 | ```shell 30 | Windows: # 用git bash 终端,不要用ide的终端 31 | mingw32-make.exe windows 32 | Linux: 33 | make linux 34 | ``` 35 | 36 | 清除 37 | 38 | ```shell 39 | Windows: 40 | mingw32-make.exe clean 41 | Linux: 42 | make clean 43 | ``` 44 | ## 联系方式 45 | 46 | * https://www.cnblogs.com/erfeng/ 47 | -------------------------------------------------------------------------------- /demo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | /* 4 | #cgo CFLAGS: -I./include 5 | #include 6 | #include 7 | #include 8 | #include "HCNetSDK.h" 9 | */ 10 | import "C" 11 | import ( 12 | "fmt" 13 | "log" 14 | "time" 15 | "unsafe" 16 | 17 | "github.com/pkg/errors" 18 | ) 19 | # 参考链接示例,比较粗糙,没有仔细修改,仅供大家参考 20 | # 1.云台控制 21 | # 2.抓图 22 | # 3.视频播放 23 | 24 | // 是否有错误 25 | func isErr(oper string) error { 26 | errno := int64(C.NET_DVR_GetLastError()) 27 | if errno > 0 { 28 | reMsg := fmt.Sprintf("%s摄像头失败,失败代码号:%d", oper, errno) 29 | return errors.New(reMsg) 30 | } 31 | return nil 32 | } 33 | 34 | // Init 初始化海康摄像头 35 | func Init() (err error) { 36 | C.NET_DVR_Init() 37 | if err = isErr("Init"); err != nil { 38 | return 39 | } 40 | // 设置连接时间 41 | C.NET_DVR_SetConnectTime(C.DWORD(2000), C.DWORD(1)) 42 | if err = isErr("SetConnectTime"); err != nil { 43 | return 44 | } 45 | log.Println("Success Init ") 46 | return nil 47 | } 48 | 49 | // Login 登录摄像头 50 | func Login() (int64, error) { 51 | var deviceinfoV30 C.NET_DVR_DEVICEINFO_V30 52 | c_ip := C.CString("192.168.10.240") 53 | defer C.free(unsafe.Pointer(c_ip)) 54 | 55 | c_login := C.CString("admin") 56 | defer C.free(unsafe.Pointer(c_login)) 57 | 58 | c_password := C.CString("admin508") 59 | defer C.free(unsafe.Pointer(c_password)) 60 | 61 | msgId := C.NET_DVR_Login_V30(c_ip, C.WORD(8000), c_login, c_password, 62 | (*C.NET_DVR_DEVICEINFO_V30)(unsafe.Pointer(&deviceinfoV30)), 63 | ) 64 | 65 | if int64(msgId) < 0 { 66 | if err := isErr("Login"); err != nil { 67 | return -1, err 68 | } 69 | return -1, errors.New("登录摄像头失败") 70 | } 71 | log.Println("Success login ,user id ", msgId) 72 | return int64(msgId), nil 73 | } 74 | 75 | // Logout 退出摄像头登录 76 | // uid:摄像头登录成功的id 77 | func Logout(uid int64) error { 78 | C.NET_DVR_Logout_V30(C.LONG(uid)) 79 | if err := isErr("Logout"); err != nil { 80 | return err 81 | } 82 | return nil 83 | } 84 | 85 | // Play 播放视频 86 | // uid:摄像头登录成功的id 87 | // 返回播放视频标识 pid 88 | func Play(uid int64) (int64, error) { 89 | var pDetectInfo C.NET_DVR_CLIENTINFO 90 | pDetectInfo.lChannel = C.LONG(1) 91 | pid := C.NET_DVR_RealPlay_V30(C.LONG(uid), (*C.NET_DVR_CLIENTINFO)(unsafe.Pointer(&pDetectInfo)), nil, nil, C.BOOL(1)) 92 | if int64(pid) < 0 { 93 | if err := isErr("Play"); err != nil { 94 | return -1, err 95 | } 96 | return -1, errors.New("播放失败") 97 | } 98 | 99 | return int64(pid), nil 100 | } 101 | 102 | // Capture 抓拍 103 | func Capture(uid int64) (string, error) { 104 | picPath := time.Now().Format("20060102150405") + ".jpeg" 105 | 106 | var jpegpara C.NET_DVR_JPEGPARA 107 | var lChannel uint32 = 1 108 | c_path := C.CString(picPath) 109 | defer C.free(unsafe.Pointer(c_path)) 110 | msgId := C.NET_DVR_CaptureJPEGPicture(C.LONG(uid), C.LONG(lChannel), 111 | (*C.NET_DVR_JPEGPARA)(unsafe.Pointer(&jpegpara)), 112 | c_path, 113 | ) 114 | 115 | if int64(msgId) < 0 { 116 | if err := isErr("Capture"); err != nil { 117 | return "", err 118 | } 119 | return "", errors.New("抓拍失败") 120 | } 121 | return picPath, nil 122 | } 123 | 124 | // PtzStop 停止相机 125 | // pid 播放标识符 126 | func PtzStop(pid int64) error { 127 | msgId := C.NET_DVR_StopRealPlay(C.LONG(pid)) 128 | if int64(msgId) < 0 { 129 | if err := isErr("PtzStop"); err != nil { 130 | return err 131 | } 132 | return errors.New("停止相机失败") 133 | } 134 | return nil 135 | } 136 | 137 | // PtzControlStart 云台控制 向左 138 | func PtzControlStart(pid int64) error { 139 | res := C.NET_DVR_PTZControlWithSpeed(C.LONG(pid), C.DWORD(23), C.DWORD(0), C.DWORD(5)) 140 | log.Println(res) 141 | if res == 0 { 142 | log.Println("fail control") 143 | if err := isErr("NET_DVR_PTZControlWithSpeed Start"); err != nil { 144 | return err 145 | } 146 | } 147 | return nil 148 | } 149 | 150 | // PtzControlStop 停止 151 | func PtzControlStop(pid int64) error { 152 | res := C.NET_DVR_PTZControlWithSpeed(C.LONG(pid), C.DWORD(23), C.DWORD(1), C.DWORD(2)) 153 | log.Println(res) 154 | if res == 0 { 155 | log.Println("fail control") 156 | if err := isErr("NET_DVR_PTZControlWithSpeed stop"); err != nil { 157 | return err 158 | } 159 | } 160 | return nil 161 | } 162 | 163 | // Close 释放SDK资源,在程序结束之前调用。 164 | func Close() { 165 | C.NET_DVR_Cleanup() 166 | } 167 | 168 | func main() { 169 | var err error 170 | err = Init() 171 | defer Close() 172 | if err != nil { 173 | log.Fatal(err.Error()) 174 | } 175 | 176 | var uid int64 177 | if uid, err = Login(); err != nil { 178 | log.Fatal(err.Error()) 179 | } 180 | 181 | res, _ := Play(uid) 182 | log.Println("Play:", res) 183 | 184 | log.Println(res) 185 | var picPath string 186 | if picPath, err = Capture(uid); err != nil { 187 | log.Fatal(err.Error()) 188 | } 189 | log.Println("图片路径:", picPath) 190 | 191 | var pid int64 192 | if pid, err = Play(uid); err != nil { 193 | log.Fatal(err.Error()) 194 | } 195 | 196 | if err = PtzControlStart(pid); err != nil { 197 | log.Fatal(err.Error()) 198 | } 199 | time.Sleep(5 * time.Second) 200 | if err = PtzControlStop(pid); err != nil { 201 | log.Fatal(err.Error()) 202 | } 203 | 204 | if err = PtzStop(pid); err != nil { 205 | log.Fatal(err.Error()) 206 | } 207 | 208 | if err = Logout(uid); err != nil { 209 | log.Fatal(err.Error()) 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module alarm 2 | 3 | go 1.18 4 | 5 | require ( 6 | github.com/golang/protobuf v1.5.2 7 | github.com/pkg/errors v0.9.1 8 | gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99 9 | ) 10 | 11 | require google.golang.org/protobuf v1.26.0 // indirect 12 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 2 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 3 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 4 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 5 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 6 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 7 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 8 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 9 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 10 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 11 | google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 12 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 13 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 14 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 15 | gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99 h1:dbuHpmKjkDzSOMKAWl10QNlgaZUd3V1q99xc81tt2Kc= 16 | gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 17 | -------------------------------------------------------------------------------- /include/HCNetSDK.h: -------------------------------------------------------------------------------- 1 | #ifndef _HC_NET_SDK_H_ 2 | #define _HC_NET_SDK_H_ 3 | 4 | #ifndef _WINDOWS_ 5 | #if (defined(_WIN32) || defined(_WIN64)) 6 | #include 7 | #include 8 | #endif 9 | #endif 10 | 11 | #ifndef __PLAYRECT_defined 12 | #define __PLAYRECT_defined 13 | typedef struct __PLAYRECT 14 | { 15 | int x; 16 | int y; 17 | int uWidth; 18 | int uHeight; 19 | }PLAYRECT; 20 | #endif 21 | 22 | #if (defined(_WIN32)) //windows 23 | typedef unsigned __int64 UINT64; 24 | typedef signed __int64 INT64; 25 | #elif defined(__linux__) || defined(__APPLE__) //linux 26 | #define BOOL int 27 | #include 28 | typedef uint32_t DWORD; 29 | typedef uint16_t WORD; 30 | typedef uint16_t SHORT; 31 | typedef uint16_t USHORT; 32 | typedef int32_t LONG; 33 | typedef uint8_t BYTE; 34 | typedef uint32_t UINT; 35 | typedef void* LPVOID; 36 | typedef void* HANDLE; 37 | typedef uint32_t * LPDWORD; 38 | typedef uint64_t UINT64; 39 | 40 | #ifndef TRUE 41 | #define TRUE 1 42 | #endif 43 | #ifndef FALSE 44 | #define FALSE 0 45 | #endif 46 | #ifndef NULL 47 | #define NULL 0 48 | #endif 49 | 50 | #define __stdcall 51 | #define CALLBACK 52 | 53 | #define NET_DVR_API extern "C" 54 | typedef unsigned int COLORKEY; 55 | typedef unsigned int COLORREF; 56 | 57 | #ifndef __HWND_defined 58 | #define __HWND_defined 59 | #if defined(__linux__) 60 | typedef unsigned int HWND; 61 | #else 62 | typedef void* HWND; 63 | #endif 64 | #endif 65 | 66 | #ifndef __HDC_defined 67 | #define __HDC_defined 68 | #if defined(__linux__) 69 | typedef struct __DC 70 | { 71 | void* surface; //SDL Surface 72 | HWND hWnd; //HDC window handle 73 | }DC; 74 | typedef DC* HDC; 75 | #else 76 | typedef void* HDC; 77 | #endif 78 | #endif 79 | 80 | typedef struct tagInitInfo 81 | { 82 | int uWidth; 83 | int uHeight; 84 | }INITINFO; 85 | #endif 86 | 87 | #define SERIALNO_LEN 48 //序列号长度 88 | #define NET_DVR_DEV_ADDRESS_MAX_LEN 129 89 | #define NET_DVR_LOGIN_USERNAME_MAX_LEN 64 90 | #define NET_DVR_LOGIN_PASSWD_MAX_LEN 64 91 | 92 | 93 | #define LIGHT_PWRON 2 /* 接通灯光电源 */ 94 | #define WIPER_PWRON 3 /* 接通雨刷开关 */ 95 | #define FAN_PWRON 4 /* 接通风扇开关 */ 96 | #define HEATER_PWRON 5 /* 接通加热器开关 */ 97 | #define AUX_PWRON1 6 /* 接通辅助设备开关 */ 98 | #define AUX_PWRON2 7 /* 接通辅助设备开关 */ 99 | #define SET_PRESET 8 /* 设置预置点 */ 100 | #define CLE_PRESET 9 /* 清除预置点 */ 101 | 102 | #define ZOOM_IN 11 /* 焦距以速度SS变大(倍率变大) */ 103 | #define ZOOM_OUT 12 /* 焦距以速度SS变小(倍率变小) */ 104 | #define FOCUS_NEAR 13 /* 焦点以速度SS前调 */ 105 | #define FOCUS_FAR 14 /* 焦点以速度SS后调 */ 106 | #define IRIS_OPEN 15 /* 光圈以速度SS扩大 */ 107 | #define IRIS_CLOSE 16 /* 光圈以速度SS缩小 */ 108 | 109 | #define TILT_UP 21 /* 云台以SS的速度上仰 */ 110 | #define TILT_DOWN 22 /* 云台以SS的速度下俯 */ 111 | #define PAN_LEFT 23 /* 云台以SS的速度左转 */ 112 | #define PAN_RIGHT 24 /* 云台以SS的速度右转 */ 113 | #define UP_LEFT 25 /* 云台以SS的速度上仰和左转 */ 114 | #define UP_RIGHT 26 /* 云台以SS的速度上仰和右转 */ 115 | #define DOWN_LEFT 27 /* 云台以SS的速度下俯和左转 */ 116 | #define DOWN_RIGHT 28 /* 云台以SS的速度下俯和右转 */ 117 | #define PAN_AUTO 29 /* 云台以SS的速度左右自动扫描 */ 118 | 119 | #define FILL_PRE_SEQ 30 /* 将预置点加入巡航序列 */ 120 | #define SET_SEQ_DWELL 31 /* 设置巡航点停顿时间 */ 121 | #define SET_SEQ_SPEED 32 /* 设置巡航速度 */ 122 | #define CLE_PRE_SEQ 33 /* 将预置点从巡航序列中删除 */ 123 | #define STA_MEM_CRUISE 34 /* 开始记录轨迹 */ 124 | #define STO_MEM_CRUISE 35 /* 停止记录轨迹 */ 125 | #define RUN_CRUISE 36 /* 开始轨迹 */ 126 | #define RUN_SEQ 37 /* 开始巡航 */ 127 | #define STOP_SEQ 38 /* 停止巡航 */ 128 | #define GOTO_PRESET 39 /* 快球转到预置点 */ 129 | 130 | #define DEL_SEQ 43 /* 删除巡航路径 */ 131 | #define STOP_CRUISE 44 /* 停止轨迹 */ 132 | #define DELETE_CRUISE 45 /* 删除单条轨迹 */ 133 | #define DELETE_ALL_CRUISE 46/* 删除所有轨迹 */ 134 | 135 | #define PAN_CIRCLE 50 /* 云台以SS的速度自动圆周扫描 */ 136 | #define DRAG_PTZ 51 /* 拖动PTZ */ 137 | #define LINEAR_SCAN 52 /* 区域扫描 */ //2014-03-15 138 | #define CLE_ALL_PRESET 53 /* 预置点全部清除 */ 139 | #define CLE_ALL_SEQ 54 /* 巡航全部清除 */ 140 | #define CLE_ALL_CRUISE 55 /* 轨迹全部清除 */ 141 | 142 | #define POPUP_MENU 56 /* 显示操作菜单 */ 143 | 144 | #define TILT_DOWN_ZOOM_IN 58 /* 云台以SS的速度下俯&&焦距以速度SS变大(倍率变大) */ 145 | #define TILT_DOWN_ZOOM_OUT 59 /* 云台以SS的速度下俯&&焦距以速度SS变小(倍率变小) */ 146 | #define PAN_LEFT_ZOOM_IN 60 /* 云台以SS的速度左转&&焦距以速度SS变大(倍率变大)*/ 147 | #define PAN_LEFT_ZOOM_OUT 61 /* 云台以SS的速度左转&&焦距以速度SS变小(倍率变小)*/ 148 | #define PAN_RIGHT_ZOOM_IN 62 /* 云台以SS的速度右转&&焦距以速度SS变大(倍率变大) */ 149 | #define PAN_RIGHT_ZOOM_OUT 63 /* 云台以SS的速度右转&&焦距以速度SS变小(倍率变小) */ 150 | #define UP_LEFT_ZOOM_IN 64 /* 云台以SS的速度上仰和左转&&焦距以速度SS变大(倍率变大)*/ 151 | #define UP_LEFT_ZOOM_OUT 65 /* 云台以SS的速度上仰和左转&&焦距以速度SS变小(倍率变小)*/ 152 | #define UP_RIGHT_ZOOM_IN 66 /* 云台以SS的速度上仰和右转&&焦距以速度SS变大(倍率变大)*/ 153 | #define UP_RIGHT_ZOOM_OUT 67 /* 云台以SS的速度上仰和右转&&焦距以速度SS变小(倍率变小)*/ 154 | #define DOWN_LEFT_ZOOM_IN 68 /* 云台以SS的速度下俯和左转&&焦距以速度SS变大(倍率变大) */ 155 | #define DOWN_LEFT_ZOOM_OUT 69 /* 云台以SS的速度下俯和左转&&焦距以速度SS变小(倍率变小) */ 156 | #define DOWN_RIGHT_ZOOM_IN 70 /* 云台以SS的速度下俯和右转&&焦距以速度SS变大(倍率变大) */ 157 | #define DOWN_RIGHT_ZOOM_OUT 71 /* 云台以SS的速度下俯和右转&&焦距以速度SS变小(倍率变小) */ 158 | #define TILT_UP_ZOOM_IN 72 /* 云台以SS的速度上仰&&焦距以速度SS变大(倍率变大) */ 159 | #define TILT_UP_ZOOM_OUT 73 160 | 161 | //宏定义 162 | #define MAX_NAMELEN 16 //DVR本地登陆名 163 | #define MAX_RIGHT 32 //设备支持的权限(1-12表示本地权限,13-32表示远程权限) 164 | #define NAME_LEN 32 //用户名长度 165 | #define MIN_PASSWD_LEN 8 //最小密码长度 166 | #define PASSWD_LEN 16 //密码长度 167 | #define STREAM_PASSWD_LEN 12 //码流加密密钥最大长度 168 | #define MAX_PASSWD_LEN_EX 64 //密码长度64位 169 | #define GUID_LEN 16 //GUID长度 170 | #define DEV_TYPE_NAME_LEN 24 //设备类型名称长度 171 | #define SERIALNO_LEN 48 //序列号长度 172 | #define MACADDR_LEN 6 //mac地址长度 173 | #define MAC_ADDRESS_NUM 48 //Mac地址长度 174 | #define MAX_INTERVAL_NUM 4 //最大时间间隔个数 175 | 176 | // struct 177 | 178 | //NET_DVR_Login_V30()参数结构 179 | typedef struct tagNET_DVR_DEVICEINFO_V30 180 | { 181 | BYTE sSerialNumber[SERIALNO_LEN]; //序列号 182 | BYTE byAlarmInPortNum; //报警输入个数 183 | BYTE byAlarmOutPortNum; //报警输出个数 184 | BYTE byDiskNum; //硬盘个数 185 | BYTE byDVRType; //设备类型, 1:DVR 2:ATM DVR 3:DVS ...... 186 | BYTE byChanNum; //模拟通道个数 187 | BYTE byStartChan; //起始通道号,例如DVS-1,DVR - 1 188 | BYTE byAudioChanNum; //语音通道数 189 | BYTE byIPChanNum; //最大数字通道个数,低位 190 | BYTE byZeroChanNum; //零通道编码个数 //2010-01-16 191 | BYTE byMainProto; //主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp 192 | BYTE bySubProto; //子码流传输协议类型0-private, 1-rtsp,2-同时支持private和rtsp 193 | BYTE bySupport; 194 | BYTE bySupport1; 195 | BYTE bySupport2; 196 | WORD wDevType; 197 | BYTE bySupport3; 198 | BYTE byMultiStreamProto;//是否支持多码流,按位表示,0-不支持,1-支持,bit1-码流3,bit2-码流4,bit7-主码流,bit-8子码流 199 | BYTE byStartDChan; //起始数字通道号,0表示无效 200 | BYTE byStartDTalkChan; //起始数字对讲通道号,区别于模拟对讲通道号,0表示无效 201 | BYTE byHighDChanNum; //数字通道个数,高位 202 | BYTE bySupport4; 203 | BYTE byLanguageType; 204 | BYTE byVoiceInChanNum; //音频输入通道数 205 | BYTE byStartVoiceInChanNo; //音频输入起始通道号 0表示无效 206 | BYTE bySupport5; 207 | BYTE bySupport6; 208 | BYTE byMirrorChanNum; //镜像通道个数,<录播主机中用于表示导播通道> 209 | WORD wStartMirrorChanNo; //起始镜像通道号 210 | BYTE bySupport7; 211 | BYTE byRes2; //保留 212 | }NET_DVR_DEVICEINFO_V30, *LPNET_DVR_DEVICEINFO_V30; 213 | 214 | typedef struct tagNET_DVR_DEVICEINFO_V40 215 | { 216 | NET_DVR_DEVICEINFO_V30 struDeviceV30; 217 | BYTE bySupportLock; //设备支持锁定功能,该字段由SDK根据设备返回值来赋值的。bySupportLock为1时,dwSurplusLockTime和byRetryLoginTime有效 218 | BYTE byRetryLoginTime; //剩余可尝试登陆的次数,用户名,密码错误时,此参数有效 219 | BYTE byPasswordLevel; //admin密码安全等级0-无效,1-默认密码,2-有效密码,3-风险较高的密码。当用户的密码为出厂默认密码(12345)或者风险较高的密码时,上层客户端需要提示用户更改密码。 220 | BYTE byProxyType; //代理类型,0-不使用代理, 1-使用socks5代理, 2-使用EHome代理 221 | DWORD dwSurplusLockTime; //剩余时间,单位秒,用户锁定时,此参数有效 222 | BYTE byCharEncodeType; //字符编码类型 223 | BYTE bySupportDev5;//支持v50版本的设备参数获取,设备名称和设备类型名称长度扩展为64字节 224 | BYTE bySupport; //能力集扩展,位与结果:0- 不支持,1- 支持 225 | BYTE byLoginMode; //登录模式 0-Private登录 1-ISAPI登录 226 | DWORD dwOEMCode; 227 | int iResidualValidity; //该用户密码剩余有效天数,单位:天,返回负值,表示密码已经超期使用,例如“-3表示密码已经超期使用3天” 228 | BYTE byResidualValidity; // iResidualValidity字段是否有效,0-无效,1-有效 229 | BYTE byRes2[243]; 230 | }NET_DVR_DEVICEINFO_V40, *LPNET_DVR_DEVICEINFO_V40; 231 | 232 | typedef void (*fLoginResultCallBack) (LONG lUserID, DWORD dwResult, LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo , void* pUser); 233 | typedef void (*REALDATACALLBACK) (LONG lPlayHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser); 234 | 235 | typedef struct tagNET_DVR_USER_LOGIN_INFO 236 | { 237 | char sDeviceAddress[NET_DVR_DEV_ADDRESS_MAX_LEN]; 238 | BYTE byUseTransport; //是否启用能力集透传,0--不启用透传,默认,1--启用透传 239 | WORD wPort; 240 | char sUserName[NET_DVR_LOGIN_USERNAME_MAX_LEN]; 241 | char sPassword[NET_DVR_LOGIN_PASSWD_MAX_LEN]; 242 | fLoginResultCallBack cbLoginResult; 243 | void *pUser; 244 | BOOL bUseAsynLogin; 245 | BYTE byProxyType; //0:不使用代理,1:使用标准代理,2:使用EHome代理 246 | BYTE byUseUTCTime; //0-不进行转换,默认,1-接口上输入输出全部使用UTC时间,SDK完成UTC时间与设备时区的转换,2-接口上输入输出全部使用平台本地时间,SDK完成平台本地时间与设备时区的转换 247 | BYTE byLoginMode; //0-Private 1-ISAPI 2-自适应 248 | BYTE byHttps; //0-不适用tls,1-使用tls 2-自适应 249 | LONG iProxyID; //代理服务器序号,添加代理服务器信息时,相对应的服务器数组下表值 250 | BYTE byVerifyMode; //认证方式,0-不认证,1-双向认证,2-单向认证;认证仅在使用TLS的时候生效; 251 | BYTE byRes3[119]; 252 | }NET_DVR_USER_LOGIN_INFO,*LPNET_DVR_USER_LOGIN_INFO; 253 | 254 | //图片质量 255 | typedef struct tagNET_DVR_JPEGPARA 256 | { 257 | WORD wPicSize; 258 | WORD wPicQuality; /* 图片质量系数 0-最好 1-较好 2-一般 */ 259 | }NET_DVR_JPEGPARA, *LPNET_DVR_JPEGPARA; 260 | 261 | //软解码预览参数 262 | typedef struct tagNET_DVR_CLIENTINFO 263 | { 264 | LONG lChannel; 265 | LONG lLinkMode; 266 | HWND hPlayWnd; 267 | char* sMultiCastIP; 268 | BYTE byProtoType; 269 | BYTE byRes[3]; 270 | }NET_DVR_CLIENTINFO, *LPNET_DVR_CLIENTINFO; 271 | 272 | #define STREAM_ID_LEN 32 273 | 274 | //预览V40接口 275 | typedef struct tagNET_DVR_PREVIEWINFO 276 | { 277 | LONG lChannel; 278 | DWORD dwStreamType; 279 | DWORD dwLinkMode; 280 | HWND hPlayWnd; 281 | DWORD bBlocked; 282 | DWORD bPassbackRecord; 283 | BYTE byPreviewMode; 284 | BYTE byStreamID[STREAM_ID_LEN]; 285 | BYTE byProtoType; 286 | BYTE byRes1; 287 | BYTE byVideoCodingType; 288 | DWORD dwDisplayBufNum; 289 | BYTE byNPQMode; 290 | BYTE byRes[215]; 291 | }NET_DVR_PREVIEWINFO, *LPNET_DVR_PREVIEWINFO; 292 | 293 | typedef struct tagNET_DVR_BUF_INFO 294 | { 295 | void* pBuf; //缓冲区指针 296 | DWORD nLen; //缓冲区长度 297 | }NET_DVR_BUF_INFO, *LPNET_DVR_BUF_INFO; 298 | 299 | typedef struct tagNET_DVR_IN_PARAM 300 | { 301 | NET_DVR_BUF_INFO struCondBuf; 302 | NET_DVR_BUF_INFO struInParamBuf; 303 | DWORD dwRecvTimeout; 304 | BYTE byRes[32]; 305 | }NET_DVR_IN_PARAM,LPNET_DVR_IN_PARAM; 306 | 307 | typedef struct tagNET_DVR_OUT_PARAM 308 | { 309 | NET_DVR_BUF_INFO struOutBuf; 310 | void* lpStatusList; 311 | BYTE byRes[32]; 312 | }NET_DVR_OUT_PARAM,LPNET_DVR_OUT_PARAM; 313 | 314 | 315 | typedef struct tagNET_DVR_SETUPALARM_PARAM 316 | { 317 | DWORD dwSize; 318 | BYTE byLevel; //布防优先级,0-一等级(高),1-二等级(中),2-三等级(低) 319 | BYTE byAlarmInfoType; //上传报警信息类型(抓拍机支持),0-老报警信息(NET_DVR_PLATE_RESULT),1-新报警信息(NET_ITS_PLATE_RESULT)2012-9-28 320 | BYTE byRetAlarmTypeV40; //0--返回NET_DVR_ALARMINFO_V30或NET_DVR_ALARMINFO, 1--设备支持NET_DVR_ALARMINFO_V40则返回NET_DVR_ALARMINFO_V40,不支持则返回NET_DVR_ALARMINFO_V30或NET_DVR_ALARMINFO 321 | BYTE byRetDevInfoVersion; //CVR上传报警信息回调结构体版本号 0-COMM_ALARM_DEVICE, 1-COMM_ALARM_DEVICE_V40 322 | BYTE byRetVQDAlarmType; //VQD报警上传类型,0-上传报报警NET_DVR_VQD_DIAGNOSE_INFO,1-上传报警NET_DVR_VQD_ALARM 323 | //1-表示人脸侦测报警扩展(INTER_FACE_DETECTION),0-表示原先支持结构(INTER_FACESNAP_RESULT) 324 | BYTE byFaceAlarmDetection; 325 | //Bit0- 表示二级布防是否上传图片: 0-上传,1-不上传 326 | //Bit1- 表示开启数据上传确认机制;0-不开启,1-开启 327 | //Bit6- 表示雷达检测报警(eventType:radarDetection)是否开启实时上传;0-不开启,1-开启(用于web插件实时显示雷达目标轨迹) 328 | BYTE bySupport; 329 | //断网续传类型 330 | //bit0-车牌检测(IPC) (0-不续传,1-续传) 331 | //bit1-客流统计(IPC) (0-不续传,1-续传) 332 | //bit2-热度图统计(IPC) (0-不续传,1-续传) 333 | //bit3-人脸抓拍(IPC) (0-不续传,1-续传) 334 | //bit4-人脸对比(IPC) (0-不续传,1-续传) 335 | BYTE byBrokenNetHttp; 336 | WORD wTaskNo; //任务处理号 和 (上传数据NET_DVR_VEHICLE_RECOG_RESULT中的字段dwTaskNo对应 同时 下发任务结构 NET_DVR_VEHICLE_RECOG_COND中的字段dwTaskNo对应) 337 | BYTE byDeployType; //布防类型:0-客户端布防,1-实时布防 338 | BYTE bySubScription; //订阅,按位表示,未开启订阅不上报 //占位 339 | //Bit7-移动侦测人车分类是否传图;0-不传图(V30上报),1-传图(V40上报) 340 | BYTE byRes1[2]; 341 | BYTE byAlarmTypeURL;//bit0-表示人脸抓拍报警上传(INTER_FACESNAP_RESULT);0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断,同时设备需要支持URL的相关服务,当前是”云存储“) 342 | //bit1-表示EVENT_JSON中图片数据长传类型;0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断) 343 | //bit2 - 人脸比对(报警类型为COMM_SNAP_MATCH_ALARM)中图片数据上传类型:0 - 二进制传输,1 - URL传输 344 | //bit3 - 行为分析(报警类型为COMM_ALARM_RULE)中图片数据上传类型:0 - 二进制传输,1 - URL传输,本字段设备是否支持,对应软硬件能力集中节点是否返回且为true 345 | BYTE byCustomCtrl;//Bit0- 表示支持副驾驶人脸子图上传: 0-不上传,1-上传 346 | }NET_DVR_SETUPALARM_PARAM, *LPNET_DVR_SETUPALARM_PARAM; 347 | 348 | 349 | //单IO触发抓拍功能配置 350 | typedef struct tagNET_DVR_SNAPCFG 351 | { 352 | DWORD dwSize; 353 | BYTE byRelatedDriveWay;//触发IO关联的车道号 354 | BYTE bySnapTimes; //线圈抓拍次数,0-不抓拍,非0-连拍次数,目前最大5次 355 | WORD wSnapWaitTime; //抓拍等待时间,单位ms,取值范围[0,60000] 356 | WORD wIntervalTime[MAX_INTERVAL_NUM];//连拍间隔时间,ms 357 | DWORD dwSnapVehicleNum; //抓拍车辆序号。 358 | NET_DVR_JPEGPARA struJpegPara;//抓拍图片参数 359 | BYTE byRes2[16];//保留字节 360 | }NET_DVR_SNAPCFG, *LPNET_DVR_SNAPCFG; 361 | 362 | 363 | //报警设备信息 364 | typedef struct 365 | { 366 | BYTE byUserIDValid; /* userid是否有效 0-无效,1-有效 */ 367 | BYTE bySerialValid; /* 序列号是否有效 0-无效,1-有效 */ 368 | BYTE byVersionValid; /* 版本号是否有效 0-无效,1-有效 */ 369 | BYTE byDeviceNameValid; /* 设备名字是否有效 0-无效,1-有效 */ 370 | BYTE byMacAddrValid; /* MAC地址是否有效 0-无效,1-有效 */ 371 | BYTE byLinkPortValid; /* login端口是否有效 0-无效,1-有效 */ 372 | BYTE byDeviceIPValid; /* 设备IP是否有效 0-无效,1-有效 */ 373 | BYTE bySocketIPValid; /* socket ip是否有效 0-无效,1-有效 */ 374 | LONG lUserID; /* NET_DVR_Login()返回值, 布防时有效 */ 375 | BYTE sSerialNumber[SERIALNO_LEN]; /* 序列号 */ 376 | DWORD dwDeviceVersion; /* 版本信息 高16位表示主版本,低16位表示次版本*/ 377 | char sDeviceName[NAME_LEN]; /* 设备名字 */ 378 | BYTE byMacAddr[MACADDR_LEN]; /* MAC地址 */ 379 | WORD wLinkPort; /* link port */ 380 | char sDeviceIP[128]; /* IP地址 */ 381 | char sSocketIP[128]; /* 报警主动上传时的socket IP地址 */ 382 | BYTE byIpProtocol; /* Ip协议 0-IPV4, 1-IPV6 */ 383 | BYTE byRes1[2]; 384 | BYTE bJSONBroken; //JSON断网续传标志。0:不续传;1:续传 385 | WORD wSocketPort; 386 | BYTE byRes2[6]; 387 | }NET_DVR_ALARMER, *LPNET_DVR_ALARMER; 388 | 389 | //sdk function 390 | DWORD NET_DVR_GetSDKVersion(); 391 | DWORD NET_DVR_GetSDKBuildVersion(); 392 | int NET_DVR_IsSupport(); 393 | 394 | // sdk init 395 | BOOL NET_DVR_Init(); 396 | BOOL NET_DVR_Cleanup(); 397 | 398 | // login device 399 | LONG NET_DVR_Login_V30(char *sDVRIP, WORD wDVRPort, char *sUserName, char *sPassword, LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo); 400 | LONG NET_DVR_Login_V40(LPNET_DVR_USER_LOGIN_INFO pLoginInfo,LPNET_DVR_DEVICEINFO_V40 lpDeviceInfo); 401 | BOOL NET_DVR_Logout(LONG lUserID); 402 | BOOL NET_DVR_Logout_V30(LONG lUserID); 403 | 404 | // connect device 405 | BOOL NET_DVR_SetConnectTime(DWORD dwWaitTime, DWORD dwTryTimes); 406 | BOOL NET_DVR_SetReconnect(DWORD dwInterval, BOOL bEnableRecon); 407 | 408 | // sdk capture 409 | BOOL NET_DVR_CaptureJPEGPicture(LONG lUserID, LONG lChannel, LPNET_DVR_JPEGPARA lpJpegPara, char *sPicFileName); 410 | BOOL NET_DVR_CaptureJPEGPicture(LONG lUserID, LONG lChannel, LPNET_DVR_JPEGPARA lpJpegPara, char *sPicFileName); 411 | 412 | // stream play control 413 | LONG NET_DVR_RealPlay_V30(LONG lUserID, LPNET_DVR_CLIENTINFO lpClientInfo, void(*fRealDataCallBack_V30) (LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser), void* pUser, BOOL bBlocked); 414 | BOOL NET_DVR_ClosePreview(LONG lUserID, DWORD nSessionID); 415 | BOOL NET_DVR_ClosePlayBack(LONG lUserID, DWORD nSessionID); 416 | LONG NET_DVR_RealPlay_V40(LONG lUserID, LPNET_DVR_PREVIEWINFO lpPreviewInfo, REALDATACALLBACK fRealDataCallBack_V30, void* pUser); 417 | BOOL NET_DVR_StopRealPlay(LONG lRealHandle); 418 | 419 | BOOL NET_DVR_SaveRealData(LONG lRealHandle,char *sFileName); 420 | BOOL NET_DVR_StopSaveRealData(LONG lRealHandle); 421 | 422 | // device ptz control 423 | BOOL NET_DVR_PTZControlWithSpeed(LONG lRealHandle, DWORD dwPTZCommand, DWORD dwStop, DWORD dwSpeed); 424 | 425 | DWORD NET_DVR_GetLastError(); 426 | 427 | // alarm 428 | BOOL NET_DVR_GetDeviceAbility(LONG lUserID, DWORD dwAbilityType, char* pInBuf, DWORD dwInLength, char* pOutBuf, DWORD dwOutLength); 429 | 430 | BOOL NET_DVR_GetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel, LPVOID lpOutBuffer, DWORD dwOutBufferSize, LPDWORD lpBytesReturned); 431 | BOOL NET_DVR_SetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel, LPVOID lpInBuffer, DWORD dwInBufferSize); 432 | 433 | BOOL NET_DVR_GetDeviceConfig(LONG lUserID, DWORD dwCommand, DWORD dwCount, LPVOID lpInBuffer, DWORD dwInBufferSize, LPVOID lpStatusList, LPVOID lpOutBuffer, DWORD dwOutBufferSize); 434 | BOOL NET_DVR_SetDeviceConfigEx(LONG lUserID, DWORD dwCommand, DWORD dwCount, NET_DVR_IN_PARAM *lpInParam, NET_DVR_OUT_PARAM *lpOutParam); 435 | 436 | // 报警消息回调 437 | typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser); 438 | BOOL NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser); 439 | typedef BOOL (CALLBACK *MSGCallBack_V31)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser); 440 | BOOL NET_DVR_SetDVRMessageCallBack_V31(MSGCallBack_V31 fMessageCallBack, void* pUser); 441 | BOOL NET_DVR_SetDVRMessageCallBack_V50(int iIndex, MSGCallBack fMessageCallBack, void* pUser); 442 | BOOL NET_DVR_SetDVRMessageCallBack_V51(int iIndex, MSGCallBack fMsgCallBack, void* pUser); 443 | 444 | 445 | // 报警消息监听 446 | BOOL NET_DVR_StartListen(char *sLocalIP,WORD wLocalPort); 447 | BOOL NET_DVR_StopListen(); 448 | 449 | LONG NET_DVR_StartListen_V30(char *sLocalIP, WORD wLocalPort, MSGCallBack DataCallback, void* pUserData); 450 | BOOL NET_DVR_StopListen_V30(LONG lListenHandle); 451 | BOOL NET_DVR_ContinuousShoot(LONG lUserID, LPNET_DVR_SNAPCFG lpInter); 452 | 453 | //报警 454 | LONG NET_DVR_SetupAlarmChan(LONG lUserID); 455 | BOOL NET_DVR_CloseAlarmChan(LONG lAlarmHandle); 456 | LONG NET_DVR_SetupAlarmChan_V30(LONG lUserID); 457 | BOOL NET_DVR_CloseAlarmChan_V30(LONG lAlarmHandle); 458 | LONG NET_DVR_SetupAlarmChan_V41(LONG lUserID, LPNET_DVR_SETUPALARM_PARAM lpSetupParam); 459 | 460 | 461 | // car capture 462 | 463 | //BOOL NET_DVR_ManualSnap(LONG lUserID, NET_DVR_MANUALSNAP const* lpInter, LPNET_DVR_PLATE_RESULT lpOuter); 464 | BOOL NET_DVR_ContinuousShoot(LONG lUserID, LPNET_DVR_SNAPCFG lpInter); 465 | 466 | #endif -------------------------------------------------------------------------------- /internal/Device/HKDevice.go: -------------------------------------------------------------------------------- 1 | package Device 2 | 3 | // #cgo LDFLAGS 需要根据不同的平台修改 hcnetsdk(linux) / HCNETSDK(Windows) 4 | /* 5 | #cgo CFLAGS: -I../../include 6 | #cgo LDFLAGS: -L$../../build -lHCCore -lhpr -lhcnetsdk 7 | #include 8 | #include 9 | #include "HCNetSDK.h" 10 | extern void AlarmCallBack(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser); 11 | */ 12 | import "C" 13 | import ( 14 | "errors" 15 | "fmt" 16 | "log" 17 | "unsafe" 18 | ) 19 | 20 | //export AlarmCallBack 21 | func AlarmCallBack(command C.LONG, alarm *C.NET_DVR_ALARMER, info *C.char, len C.DWORD, user unsafe.Pointer) { 22 | fmt.Println("receive alarm") 23 | } 24 | 25 | type HKDevice struct { 26 | ip string 27 | port int 28 | username string 29 | password string 30 | loginId int 31 | alarmHandle int 32 | } 33 | 34 | //InitHikSDK hk sdk init 35 | func InitHikSDK() { 36 | C.NET_DVR_Init() 37 | C.NET_DVR_SetConnectTime(2000, 5) 38 | C.NET_DVR_SetReconnect(10000, 1) 39 | } 40 | 41 | //HKExit hk sdk clean 42 | func HKExit() { 43 | C.NET_DVR_Cleanup() 44 | } 45 | 46 | //NewHKDevice new hk-device instance 47 | func NewHKDevice(info DeviceInfo) Device { 48 | return &HKDevice{ 49 | ip: info.IP, 50 | port: info.Port, 51 | username: info.UserName, 52 | password: info.Password} 53 | } 54 | 55 | //Login hk device loin 56 | func (device *HKDevice) Login() (int, error) { 57 | // init data 58 | var deviceInfoV30 C.NET_DVR_DEVICEINFO_V30 59 | ip := C.CString(device.ip) 60 | usr := C.CString(device.username) 61 | passwd := C.CString(device.password) 62 | defer func() { 63 | C.free(unsafe.Pointer(ip)) 64 | C.free(unsafe.Pointer(usr)) 65 | C.free(unsafe.Pointer(passwd)) 66 | }() 67 | 68 | device.loginId = int(C.NET_DVR_Login_V30(ip, C.WORD(device.port), usr, passwd, 69 | (*C.NET_DVR_DEVICEINFO_V30)(unsafe.Pointer(&deviceInfoV30)), 70 | )) 71 | if device.loginId < 0 { 72 | return -1, device.HKErr("login ") 73 | } 74 | log.Println("login success") 75 | return device.loginId, nil 76 | } 77 | 78 | //Logout hk device logout 79 | func (device *HKDevice) Logout() error { 80 | C.NET_DVR_Logout_V30(C.LONG(device.loginId)) 81 | if err := device.HKErr("NVRLogout"); err != nil { 82 | return err 83 | } 84 | return nil 85 | } 86 | 87 | func (device *HKDevice) SetAlarmCallBack() error { 88 | if C.NET_DVR_SetDVRMessageCallBack_V30(C.MSGCallBack(C.AlarmCallBack), C.NULL) != C.TRUE { 89 | return device.HKErr(device.ip + ":set alarm callback") 90 | } 91 | return nil 92 | } 93 | func (device *HKDevice) StartListenAlarmMsg() error { 94 | var struAlarmParam C.NET_DVR_SETUPALARM_PARAM 95 | struAlarmParam.dwSize = C.uint(unsafe.Sizeof(struAlarmParam)) //Windows -> C.ulong 96 | struAlarmParam.byAlarmInfoType = 0 97 | 98 | device.alarmHandle = int(C.NET_DVR_SetupAlarmChan_V41(C.int(device.loginId), &struAlarmParam)) // Windows -> C.long 99 | if device.alarmHandle < 0 { 100 | return device.HKErr("setup alarm chan") 101 | } 102 | return nil 103 | } 104 | 105 | func (device *HKDevice) StopListenAlarmMsg() error { 106 | if C.NET_DVR_CloseAlarmChan_V30(C.int(device.alarmHandle)) != C.TRUE { //Windows C.long 107 | return device.HKErr("stoop alarm chan") 108 | } 109 | return nil 110 | } 111 | 112 | //HKErr Detect success of operation 113 | func (device *HKDevice) HKErr(operation string) error { 114 | errno := int64(C.NET_DVR_GetLastError()) 115 | if errno > 0 { 116 | reMsg := fmt.Sprintf("%s:%s摄像头失败,失败代码号:%d", device.ip, operation, errno) 117 | return errors.New(reMsg) 118 | } 119 | return nil 120 | } 121 | -------------------------------------------------------------------------------- /internal/Device/device.go: -------------------------------------------------------------------------------- 1 | package Device 2 | 3 | type Device interface { 4 | Login() (int, error) 5 | Logout() error 6 | SetAlarmCallBack() error 7 | StartListenAlarmMsg() error 8 | StopListenAlarmMsg() error 9 | } 10 | type DeviceInfo struct { 11 | IP string 12 | Port int 13 | UserName string 14 | Password string 15 | } 16 | -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCAlarm.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCAlarm.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCCoreDevCfg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCCoreDevCfg.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCDisplay.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCDisplay.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCGeneralCfgMgr.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCGeneralCfgMgr.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCIndustry.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCIndustry.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCPlayBack.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCPlayBack.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCPreview.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCPreview.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libHCVoiceTalk.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libHCVoiceTalk.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libStreamTransClient.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libStreamTransClient.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libSystemTransform.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libSystemTransform.so -------------------------------------------------------------------------------- /lib/Linux/HCNetSDKCom/libanalyzedata.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/HCNetSDKCom/libanalyzedata.so -------------------------------------------------------------------------------- /lib/Linux/libHCCore.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/libHCCore.so -------------------------------------------------------------------------------- /lib/Linux/libcrypto.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/libcrypto.so -------------------------------------------------------------------------------- /lib/Linux/libhcnetsdk.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/libhcnetsdk.so -------------------------------------------------------------------------------- /lib/Linux/libhpr.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/libhpr.so -------------------------------------------------------------------------------- /lib/Linux/libssl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Linux/libssl.so -------------------------------------------------------------------------------- /lib/Windows/AudioRender.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/AudioRender.dll -------------------------------------------------------------------------------- /lib/Windows/ClientDemo.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/ClientDemo.exe -------------------------------------------------------------------------------- /lib/Windows/EagleEyeRender.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/EagleEyeRender.dll -------------------------------------------------------------------------------- /lib/Windows/GdiPlus.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/GdiPlus.dll -------------------------------------------------------------------------------- /lib/Windows/GdiPlus.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/GdiPlus.lib -------------------------------------------------------------------------------- /lib/Windows/HCCore.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCCore.dll -------------------------------------------------------------------------------- /lib/Windows/HCCore.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCCore.lib -------------------------------------------------------------------------------- /lib/Windows/HCNetSDK.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDK.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDK.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDK.lib -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/AnalyzeData.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/AnalyzeData.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/AudioIntercom.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/AudioIntercom.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCAlarm.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCAlarm.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCAlarm.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCAlarm.lib -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCCoreDevCfg.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCCoreDevCfg.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCDisplay.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCDisplay.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCGeneralCfgMgr.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCGeneralCfgMgr.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCGeneralCfgMgr.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCGeneralCfgMgr.lib -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCIndustry.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCIndustry.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCPlayBack.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCPlayBack.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCPreview.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCPreview.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCPreview.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCPreview.lib -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/HCVoiceTalk.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/HCVoiceTalk.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/OpenAL32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/OpenAL32.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/StreamTransClient.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/StreamTransClient.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/SystemTransform.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/SystemTransform.dll -------------------------------------------------------------------------------- /lib/Windows/HCNetSDKCom/libiconv2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HCNetSDKCom/libiconv2.dll -------------------------------------------------------------------------------- /lib/Windows/HXVA.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/HXVA.dll -------------------------------------------------------------------------------- /lib/Windows/LocalXml.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/LocalXml.zip -------------------------------------------------------------------------------- /lib/Windows/MP_Render.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/MP_Render.dll -------------------------------------------------------------------------------- /lib/Windows/NPQos.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/NPQos.dll -------------------------------------------------------------------------------- /lib/Windows/PlayCtrl.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/PlayCtrl.dll -------------------------------------------------------------------------------- /lib/Windows/PlayCtrl.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/PlayCtrl.lib -------------------------------------------------------------------------------- /lib/Windows/SuperRender.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/SuperRender.dll -------------------------------------------------------------------------------- /lib/Windows/YUVProcess.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/YUVProcess.dll -------------------------------------------------------------------------------- /lib/Windows/hlog.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/hlog.dll -------------------------------------------------------------------------------- /lib/Windows/hpr.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/hpr.dll -------------------------------------------------------------------------------- /lib/Windows/libeay32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/libeay32.dll -------------------------------------------------------------------------------- /lib/Windows/libmmd.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/libmmd.dll -------------------------------------------------------------------------------- /lib/Windows/log4cxx.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/log4cxx.properties -------------------------------------------------------------------------------- /lib/Windows/ssleay32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modestying/HCNetSDK_golang/a06b83fda43a8d347285d5f7ff508cc3e5741f32/lib/Windows/ssleay32.dll -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "alarm/internal/Device" 5 | "fmt" 6 | "runtime" 7 | ) 8 | 9 | func init() { 10 | Device.InitHikSDK() 11 | } 12 | 13 | func main() { 14 | fmt.Println(runtime.GOOS) 15 | info := Device.DeviceInfo{ 16 | IP: "192.168.0.66", 17 | UserName: "admin", 18 | Password: "admin508", 19 | Port: 8000, 20 | } 21 | device := Device.NewHKDevice(info) 22 | if _, err := device.Login(); err != nil { 23 | fmt.Println(err.Error()) 24 | } else { 25 | fmt.Println("success login") 26 | } 27 | defer func() { 28 | device.Logout() 29 | Device.HKExit() 30 | }() 31 | 32 | // device.SetAlarmCallBack() 33 | // device.StartListenAlarmMsg() 34 | // time.Sleep(time.Second * 100) 35 | // device.StopListenAlarmMsg() 36 | } 37 | --------------------------------------------------------------------------------