14 Commits
1.0.0 ... 1.0.2

Author SHA1 Message Date
kunmeng
d563b72610 移除Golang的内容 2025-01-08 09:40:54 +08:00
41d8da2401 1. 修改按月查询的数据返回
2. 修复一点击即视的死锁问题
2024-11-14 09:44:00 +08:00
763376a95c 1. 返回合适的错误标识 2024-10-31 15:29:13 +08:00
8afb72cab6 1. 海康设备状态加入到结构体中 2024-10-31 15:22:07 +08:00
3e7ead4a2f 补充上次提交 2024-10-28 13:57:25 +08:00
10f587962f 添加 获取海康NVR时区的API 2024-10-28 13:24:18 +08:00
3fd2fc4062 1. 修改 Docker Hub 使用内部镜像源
2. 修改 Arm 加载动态链接库链接路径前面的空格
2024-10-24 13:55:17 +08:00
002d24e2b0 1. 添加 获取 Nvr 与 UTC 之间的插曲接口
2. 修复 球机聚焦接口存在的错误
3. 修复 PTZ 跳转到指定位置 Action 参数标准海康接口下无效的问题,以及无法设置Z值
4. 移除 GetBallCameraByName
5. 添加 PointPair 配置文件结构
2024-10-22 15:20:51 +08:00
bd6cff81ec 1. 添加 球机的一点即视 和 逆运算接口
2. 添加 Nvr 和 球机 的配置结构体 和一些基本结构体类型
3. 修改 Nvr 和 球机 的 Login 方法
4. 修复 球机部分 MOVE 操作无法停止
5. 修复 HikBase Login 返回值错误
2024-10-12 12:43:38 +08:00
a52e1a27fc 1. 修复 Go 不同架构下 getSystemLibrary 获取的 dll 名 2024-10-10 16:30:40 +08:00
4fa9ce6131 1. 修复 包名为 HikNetSDK 2024-10-10 15:17:04 +08:00
c36505d530 Merge remote-tracking branch 'origin/master' 2024-10-10 15:15:49 +08:00
167dd8be77 1. 修复 go.mod module 为 gitea.com/kunmeng/HikNetSDKPkg
2. 删除 main.go
2024-10-10 15:15:37 +08:00
77a3e37a0e 1. 修复 go 包名为 gitea.com/kunmeng/HikNetSDKPkg
2. 删除 main.go
2024-10-10 15:10:08 +08:00
15 changed files with 494 additions and 643 deletions

25
.gitignore vendored
View File

@@ -1,12 +1,15 @@
/.idea /.idea
/cmake-build-debug-visual-studio /.cache
/cmake-build-release-visual-studio /.fleet
*.lib /cmake-build-debug-visual-studio
*.dll /cmake-build-release-visual-studio
*.so /cmake-build-debug
*.a *.lib
*.zip *.dll
/build *.so
/arm64_linux_lib *.a
/arm64_windows_lib *.zip
/build
/arm64_linux_lib
/arm64_windows_lib
/amd64_linux_lib /amd64_linux_lib

View File

@@ -44,21 +44,21 @@ if(OS STREQUAL "Windows")
target_link_libraries(HikNetSDKPkg PRIVATE "HCNetSDK.lib") target_link_libraries(HikNetSDKPkg PRIVATE "HCNetSDK.lib")
target_link_libraries(HikNetSDKPkg PRIVATE "HCCore.lib") target_link_libraries(HikNetSDKPkg PRIVATE "HCCore.lib")
target_link_libraries(HikNetSDKPkg PRIVATE "GdiPlus.lib") target_link_libraries(HikNetSDKPkg PRIVATE "GdiPlus.lib")
elseif (Arch STREQUAL "x86_64") elseif (Arch STREQUAL "x86_64" OR Arch STREQUAL "amd64")
target_link_directories(HikNetSDKPkg PRIVATE "./amd64_linux_lib") target_link_directories(HikNetSDKPkg PRIVATE "./amd64_linux_lib")
target_link_libraries(HikNetSDKPkg "libHCCore.so") target_link_libraries(HikNetSDKPkg PRIVATE "libHCCore.so")
target_link_libraries(HikNetSDKPkg "libhcnetsdk.so") target_link_libraries(HikNetSDKPkg PRIVATE "libhcnetsdk.so")
target_link_libraries(HikNetSDKPkg "libhpr.so") target_link_libraries(HikNetSDKPkg PRIVATE "libhpr.so")
target_link_libraries(HikNetSDKPkg "libz.so") target_link_libraries(HikNetSDKPkg PRIVATE "libz.so")
elseif (Arch STREQUAL "aarch64") elseif (Arch STREQUAL "aarch64")
target_link_directories(HikNetSDKPkg PRIVATE "./arm64_linux_lib") target_link_directories(HikNetSDKPkg PRIVATE "./arm64_linux_lib")
target_link_libraries(HikNetSDKPkg "libAudioRender.so") target_link_libraries(HikNetSDKPkg PRIVATE "libAudioRender.so")
target_link_libraries(HikNetSDKPkg "libcrypto.so") target_link_libraries(HikNetSDKPkg PRIVATE "libcrypto.so")
target_link_libraries(HikNetSDKPkg "libHCCore.so") target_link_libraries(HikNetSDKPkg PRIVATE "libHCCore.so")
target_link_libraries(HikNetSDKPkg "libhcnetsdk.so") target_link_libraries(HikNetSDKPkg PRIVATE "libhcnetsdk.so")
target_link_libraries(HikNetSDKPkg "libhpr.so") target_link_libraries(HikNetSDKPkg PRIVATE "libhpr.so")
target_link_libraries(HikNetSDKPkg "libPlayCtrl.so") target_link_libraries(HikNetSDKPkg PRIVATE "libPlayCtrl.so")
target_link_libraries(HikNetSDKPkg "libssl.so") target_link_libraries(HikNetSDKPkg PRIVATE "libssl.so")
target_link_libraries(HikNetSDKPkg "libSuperRender.so") target_link_libraries(HikNetSDKPkg PRIVATE "libSuperRender.so")
target_link_libraries(HikNetSDKPkg "libz.so") target_link_libraries(HikNetSDKPkg PRIVATE "libz.so")
endif () endif ()

View File

@@ -1,10 +1,10 @@
FROM alpine:3.19 AS deps FROM r-2.top/alpine:3.19 AS deps
WORKDIR /usr WORKDIR /usr
RUN apk add gcc g++ cmake make acl RUN apk add gcc g++ cmake make acl
FROM alpine:3.19 AS build FROM r-2.top/alpine:3.19 AS build
WORKDIR /hikbuild WORKDIR /hikbuild
@@ -14,7 +14,7 @@ COPY . /hikbuild
RUN cmake . -D Arch=${TARGETARCH} -D CMAKE_BUILD_TYPE=RELEASE && make RUN cmake . -D Arch=${TARGETARCH} -D CMAKE_BUILD_TYPE=RELEASE && make
FROM alpine:3.19 AS export FROM r-2.top/alpine:3.19 AS export
WORKDIR /home WORKDIR /home
COPY --from=build /hikbuild/build /home COPY --from=build /hikbuild/build /home

View File

@@ -1,107 +0,0 @@
package main
import (
"fmt"
"github.com/ebitengine/purego"
"runtime"
"unsafe"
)
var libc uintptr
var (
DVR_Init func() bool
newHIKBallCamera func() unsafe.Pointer
initBallCamera func(core unsafe.Pointer, ip string, port string, username string, password string, BallMachineType string) bool
ptzTo func(core unsafe.Pointer, Action int, P float32, T float32, Z float32) bool
ptzGet func(unsafe.Pointer, unsafe.Pointer, unsafe.Pointer, unsafe.Pointer) bool
stopBus func(unsafe.Pointer, int) bool
startBus func(unsafe.Pointer, int, int) bool
newHIKNvr func() unsafe.Pointer
initNvr func(unsafe.Pointer, string, string, string, string, int) bool
checkTimeRegionWithMonth func(core unsafe.Pointer, year int, month int) string
checkTimeRegionWithDay func(core unsafe.Pointer, year int, month int, day int) string
)
func init() {
var err error
libc, err = openLibrary(getSystemLibrary())
if err != nil {
panic(err)
}
purego.RegisterLibFunc(&DVR_Init, libc, "DVR_Init")
purego.RegisterLibFunc(&newHIKBallCamera, libc, "NewHIKBallCamera")
purego.RegisterLibFunc(&initBallCamera, libc, "InitBallCamera")
purego.RegisterLibFunc(&ptzTo, libc, "PtzGotoPut")
purego.RegisterLibFunc(&ptzGet, libc, "PtzGet")
purego.RegisterLibFunc(&stopBus, libc, "StopBus")
purego.RegisterLibFunc(&startBus, libc, "StartBus")
purego.RegisterLibFunc(&newHIKNvr, libc, "NewHIKNvr")
purego.RegisterLibFunc(&initNvr, libc, "InitNvr")
purego.RegisterLibFunc(&checkTimeRegionWithMonth, libc, "CheckTimeRegionWithMonth")
purego.RegisterLibFunc(&checkTimeRegionWithDay, libc, "CheckTimeRegionWithDay")
}
func getSystemLibrary() string {
switch runtime.GOOS {
case "linux":
return "libc.so.6"
case "windows":
return "Hikvision_Network_SDK_Packaging_Library.dll"
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
type HIKBallCamera struct {
core unsafe.Pointer
}
func NewHIKBallCamera() *HIKBallCamera {
return &HIKBallCamera{
core: newHIKBallCamera(),
}
}
func (h *HIKBallCamera) Login(ip string, port string, username string, password string, BallMachineType string) bool {
return initBallCamera(h.core, ip, port, username, password, BallMachineType)
}
func (h *HIKBallCamera) PtzTo(Action int, P, T, Z float32) bool {
return ptzTo(h.core, Action, P, T, Z)
}
func (h *HIKBallCamera) PTZGet(P, T, Z *float32) bool {
return ptzGet(h.core, unsafe.Pointer(P), unsafe.Pointer(T), unsafe.Pointer(Z))
}
func (h *HIKBallCamera) StopBus(Direction int) bool {
return stopBus(h.core, Direction)
}
func (h *HIKBallCamera) StartBus(Direction, Speed int) bool {
return startBus(h.core, Direction, Speed)
}
type HIKNvr struct {
core unsafe.Pointer
}
func NewHIKNvr() *HIKNvr {
return &HIKNvr{
core: newHIKNvr(),
}
}
func (h *HIKNvr) Login(ip string, port string, username string, password string, nvrType int) bool {
return initNvr(h.core, ip, port, username, password, nvrType)
}
func (h *HIKNvr) CheckTimeRegionWithMonth(year int, month int) string {
return checkTimeRegionWithMonth(h.core, year, month)
}
func (h *HIKNvr) CheckTimeRegionWithDay(year int, month int, day int) string {
return checkTimeRegionWithDay(h.core, year, month, day)
}

5
go.mod
View File

@@ -1,5 +0,0 @@
module Hik_GoC
go 1.23.1
require github.com/ebitengine/purego v0.8.0

2
go.sum
View File

@@ -1,2 +0,0 @@
github.com/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE=
github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=

View File

@@ -29,6 +29,7 @@ extern "C" {
Omnimatrix bool InitNvr(void* PtrHIKNvr,char* ip, char* port, char* username, char* password, int channel); Omnimatrix bool InitNvr(void* PtrHIKNvr,char* ip, char* port, char* username, char* password, int channel);
Omnimatrix char* CheckTimeRegionWithMonth(void* PtrHIKNvr,int year,int month); Omnimatrix char* CheckTimeRegionWithMonth(void* PtrHIKNvr,int year,int month);
Omnimatrix char* CheckTimeRegionWithDay(void* PtrHIKNvr,int year,int month,int day); Omnimatrix char* CheckTimeRegionWithDay(void* PtrHIKNvr,int year,int month,int day);
Omnimatrix int NvrUTCDiff(void* PtrHIKNvr);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -3,50 +3,50 @@
#include "src/HIKNvr.h" #include "src/HIKNvr.h"
#include <cstring> #include <cstring>
bool DVR_Init(){ bool DVR_Init() {
return HK_DVR_Init(); return HK_DVR_Init();
} }
void* NewHIKBallCamera() { void *NewHIKBallCamera() {
return new HIKBallCamera(); return new HIKBallCamera();
} }
bool InitBallCamera(void* PtrHIKBallCamera,const char* ip, const char* port,const char* username,const char* password,const char* BallMachineType){ bool InitBallCamera(void *PtrHIKBallCamera, const char *ip, const char *port, const char *username, const char *password, const char *BallMachineType) {
auto* HIKBallCameraObj = (HIKBallCamera*)PtrHIKBallCamera; auto *HIKBallCameraObj = (HIKBallCamera *)PtrHIKBallCamera;
return HIKBallCameraObj->InitBallCamera(ip,port,username,password,BallMachineType); return HIKBallCameraObj->InitBallCamera(ip, port, username, password, BallMachineType);
} }
bool PtzGotoPut(void* PtrHIKBallCamera,int Action, float P, float T, float Z){ bool PtzGotoPut(void *PtrHIKBallCamera, int Action, float P, float T, float Z) {
auto* HIKBallCameraObj = (HIKBallCamera*)PtrHIKBallCamera; auto *HIKBallCameraObj = (HIKBallCamera *)PtrHIKBallCamera;
return HIKBallCameraObj->PtzGotoPut(Action,P,T,Z); return HIKBallCameraObj->PtzGotoPut(Action, P, T, Z);
} }
bool PtzGet(void* PtrHIKBallCamera,void *P, void *T, void *Z){ bool PtzGet(void *PtrHIKBallCamera, void *P, void *T, void *Z) {
auto* HIKBallCameraObj = (HIKBallCamera*)PtrHIKBallCamera; auto *HIKBallCameraObj = (HIKBallCamera *)PtrHIKBallCamera;
return HIKBallCameraObj->PtzGet((float*)P,(float*)T,(float*)Z); return HIKBallCameraObj->PtzGet((float *)P, (float *)T, (float *)Z);
} }
bool StopBus(void* PtrHIKBallCamera,int direction){ bool StopBus(void *PtrHIKBallCamera, int direction) {
auto* HIKBallCameraObj = (HIKBallCamera*)PtrHIKBallCamera; auto *HIKBallCameraObj = (HIKBallCamera *)PtrHIKBallCamera;
return HIKBallCameraObj->StopBus(direction); return HIKBallCameraObj->StopBus(direction);
} }
bool StartBus(void* PtrHIKBallCamera,int direction,int speed){ bool StartBus(void *PtrHIKBallCamera, int direction, int speed) {
auto* HIKBallCameraObj = (HIKBallCamera*)PtrHIKBallCamera; auto *HIKBallCameraObj = (HIKBallCamera *)PtrHIKBallCamera;
return HIKBallCameraObj->StartBus(direction,speed); return HIKBallCameraObj->StartBus(direction, speed);
} }
void* NewHIKNvr(){ void *NewHIKNvr() {
return new HIKNvr(); return new HIKNvr();
} }
bool InitNvr(void* PtrHIKNvr,char* ip, char* port, char* username, char* password, int channel){ bool InitNvr(void *PtrHIKNvr, char *ip, char *port, char *username, char *password, int channel) {
auto* HIKNvrObj = (HIKNvr*)PtrHIKNvr; auto *HIKNvrObj = (HIKNvr *)PtrHIKNvr;
return HIKNvrObj->InitNvr(ip,port,username,password,channel); return HIKNvrObj->InitNvr(ip, port, username, password, channel);
} }
char* CheckTimeRegionWithMonth(void* PtrHIKNvr,int year,int month){ char *CheckTimeRegionWithMonth(void *PtrHIKNvr, int year, int month) {
auto* HIKNvrObj = (HIKNvr*)PtrHIKNvr; auto *HIKNvrObj = (HIKNvr *)PtrHIKNvr;
DateTime select_time; DateTime select_time;
select_time.year() = year; select_time.year() = year;
@@ -58,17 +58,18 @@ char* CheckTimeRegionWithMonth(void* PtrHIKNvr,int year,int month){
std::vector<int> available_date_vec; std::vector<int> available_date_vec;
nRet = HIKNvrObj->CheckTimeRegionWithMonth(select_time, available_date_vec); nRet = HIKNvrObj->CheckTimeRegionWithMonth(select_time, available_date_vec);
if (nRet == 0) if (nRet == 0) {
{
res = HIKNvrObj->TimeToJson(select_time, &available_date_vec).dump(); res = HIKNvrObj->TimeToJson(select_time, &available_date_vec).dump();
}else{
res = "";
} }
char* cString = new char[res.size() + 1]; char *cString = new char[res.size() + 1];
std::strcpy(cString,res.c_str()); std::strcpy(cString, res.c_str());
return cString; return cString;
} }
char* CheckTimeRegionWithDay(void* PtrHIKNvr,int year,int month,int day){ char *CheckTimeRegionWithDay(void *PtrHIKNvr, int year, int month, int day) {
auto* HIKNvrObj = (HIKNvr*)PtrHIKNvr; auto *HIKNvrObj = (HIKNvr *)PtrHIKNvr;
DateTime select_time; DateTime select_time;
select_time.year() = year; select_time.year() = year;
select_time.month() = month; select_time.month() = month;
@@ -76,11 +77,17 @@ char* CheckTimeRegionWithDay(void* PtrHIKNvr,int year,int month,int day){
std::string res; std::string res;
std::vector<TimeRecord> available_time_vec; std::vector<TimeRecord> available_time_vec;
int nRet = HIKNvrObj->CheckTimeRegionWithDay(select_time, available_time_vec); int nRet = HIKNvrObj->CheckTimeRegionWithDay(select_time, available_time_vec);
if (nRet == 0) if (nRet == 0) {
{ res = HIKNvrObj->TimeToJsonInDay(select_time, &available_time_vec).dump();
res = HIKNvrObj->TimeToJsonInDay(select_time, &available_time_vec).dump(); }else{
res = "";
} }
char* cString = new char[res.size() + 1]; char *cString = new char[res.size() + 1];
std::strcpy(cString,res.c_str()); std::strcpy(cString, res.c_str());
return cString; return cString;
}
int NvrUTCDiff(void *PtrHIKNvr) {
auto *HIKNvrObj = (HIKNvr *)PtrHIKNvr;
return HIKNvrObj->GetNvrUTCDiff();
} }

25
main.go
View File

@@ -1,25 +0,0 @@
package main
import "fmt"
func main() {
SdkInitState := DVR_Init()
println(SdkInitState)
//BallCamera := NewHIKBallCamera()
//res := BallCamera.Login("192.168.211.49", "8000", "admin", "Max123456", "BuKongQiu")
//if !res {
// fmt.Println("Login Failed")
// //return
//}
//var P, T, Z float32
//println(BallCamera.PTZGet(&P, &T, &Z))
Nvr := NewHIKNvr()
res := Nvr.Login("192.168.211.124", "8000", "admin", "guanyaokeji8520", 1)
if !res {
fmt.Println("Login Failed")
return
}
fmt.Println(Nvr.CheckTimeRegionWithMonth(2024, 10))
fmt.Println(Nvr.CheckTimeRegionWithDay(2024, 10, 8))
}

View File

@@ -1,12 +0,0 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023 The Ebitengine Authors
//go:build darwin || freebsd || linux
package main
import "github.com/ebitengine/purego"
func openLibrary(name string) (uintptr, error) {
return purego.Dlopen(name, purego.RTLD_NOW|purego.RTLD_GLOBAL)
}

View File

@@ -1,13 +0,0 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023 The Ebitengine Authors
package main
import "syscall"
func openLibrary(name string) (uintptr, error) {
// Use [syscall.LoadLibrary] here to avoid external dependencies (#270).
// For actual use cases, [golang.org/x/sys/windows.NewLazySystemDLL] is recommended.
handle, err := syscall.LoadLibrary(name)
return uintptr(handle), err
}

View File

@@ -1,377 +1,381 @@
#include "HIKBallCamera.h" #include "HIKBallCamera.h"
#include "FormatTrans.h"
#include <vector> #include <cstring>
#include <sstream>
#include "FormatTrans.h"
HIKBallCamera::HIKBallCamera(){ #include <vector>
#include <sstream>
};
HIKBallCamera::HIKBallCamera(){
struct PTZ{
float P; };
float T;
float Z; struct PTZ{
}; float P;
float T;
PTZ PTZDATA; float Z;
};
std::vector<std::string> velocity = {"0a","14","1e","28","32","3c","ff"};
PTZ PTZDATA;
bool HIKBallCamera::InitBallCamera(std::string ip, std::string port, std::string username, std::string password, std::string BallMachineType)
{ std::vector<std::string> velocity = {"0a","14","1e","28","32","3c","ff"};
int res = Login(ip, port, username, password);
if (res != 0){ bool HIKBallCamera::InitBallCamera(std::string ip, std::string port, std::string username, std::string password, std::string BallMachineType)
std::cout << "Incorrect Login" << std::endl; {
return false; int res = Login(ip, port, username, password);
} if (res != 0){
std::cout << "Incorrect Login error code:" << res << std::endl;
m_Channel = DeviceInfo.byStartChan; return false;
this->BallMachineType = BallMachineType; }
//建立透明通道 m_Channel = DeviceInfo.byStartChan;
NET_DVR_SERIALSTART_V40 struSerialParam = { 0 }; this->BallMachineType = BallMachineType;
struSerialParam.dwSize = sizeof(struSerialParam);
struSerialParam.dwSerialType = 2;//1:232串口2:485串口 if (BallMachineType == "BuKongQiu"){
struSerialParam.bySerialNum = 1;//串口编号设备支持多个RS232串口时有效 NET_DVR_SERIALSTART_V40 struSerialParam = { 0 };
lTranHandle = NET_DVR_SerialStart_V40(LoginID, &struSerialParam, sizeof(struSerialParam), g_fSerialDataCallBack, NULL);//设置回调函数获取透传数据 struSerialParam.dwSize = sizeof(struSerialParam);
if (lTranHandle < 0) struSerialParam.dwSerialType = 2;//1:232串口2:485串口
{ struSerialParam.bySerialNum = 1;//串口编号设备支持多个RS232串口时有效
printf("NET_DVR_SerialStart error, %d\n", NET_DVR_GetLastError()); lTranHandle = NET_DVR_SerialStart_V40(LoginID, &struSerialParam, sizeof(struSerialParam), g_fSerialDataCallBack, NULL);//设置回调函数获取透传数据
NET_DVR_Logout(LoginID); if (lTranHandle < 0)
NET_DVR_Cleanup(); {
return false; printf("NET_DVR_SerialStart error, %d\n", NET_DVR_GetLastError());
} NET_DVR_Logout(LoginID);
NET_DVR_Cleanup();
return true; return false;
} }
}
//回调透传数据函数的外部实现 return true;
void CALLBACK HIKBallCamera::g_fSerialDataCallBack(LONG lSerialHandle, LONG lChannel, char *pRecvDataBuffer, DWORD dwBufSize, void *pUser) }
{
std::string type = charToHex(pRecvDataBuffer[3]); //回调透传数据函数的外部实现
if (type=="59"){ void CALLBACK HIKBallCamera::g_fSerialDataCallBack(LONG lSerialHandle, LONG lChannel, char *pRecvDataBuffer, DWORD dwBufSize, void *pUser)
PTZDATA.P = float(hexadecimalToDecimal(charToHex(pRecvDataBuffer[4])+charToHex(pRecvDataBuffer[5])))/100.0; {
}else if (type == "5B"){ std::string type = charToHex(pRecvDataBuffer[3]);
PTZDATA.T = float(hexadecimalToDecimal(charToHex(pRecvDataBuffer[4])+charToHex(pRecvDataBuffer[5])))/100.0; if (type=="59"){
}else if (type == "5D"){ PTZDATA.P = float(hexadecimalToDecimal(charToHex(pRecvDataBuffer[4])+charToHex(pRecvDataBuffer[5])))/100.0;
PTZDATA.Z = float(hexadecimalToDecimal(charToHex(pRecvDataBuffer[4])+charToHex(pRecvDataBuffer[5])))/100.0; }else if (type == "5B"){
} PTZDATA.T = float(hexadecimalToDecimal(charToHex(pRecvDataBuffer[4])+charToHex(pRecvDataBuffer[5])))/100.0;
} }else if (type == "5D"){
PTZDATA.Z = float(hexadecimalToDecimal(charToHex(pRecvDataBuffer[4])+charToHex(pRecvDataBuffer[5])))/100.0;
bool HIKBallCamera::PtzControl(int command, int stop, int speed) }
{ }
bool Ret = false;
//use HIK SDK to control the ball camera bool HIKBallCamera::PtzControl(int command, int stop, int speed)
Ret = NET_DVR_PTZControlWithSpeed_Other(LoginID,m_Channel, command, stop, speed); {
bool Ret = false;
//get the error code //use HIK SDK to control the ball camera
if(!Ret) Ret = NET_DVR_PTZControlWithSpeed_Other(LoginID,m_Channel, command, stop, speed);
{
std::cout << "PTZ control failed! Error code: " << NET_DVR_GetLastError() << std::endl; //get the error code
return false; if(!Ret)
} {
return true; std::cout << "PTZ control failed! Error code: " << NET_DVR_GetLastError() << std::endl;
} return false;
}
bool HIKBallCamera::PtzControlLeft(int speed,int state) return true;
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 04 "+velocity[speed - 1]+" 00"; bool HIKBallCamera::PtzControlLeft(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 04 "+velocity[speed - 1]+" 00";
}else{ buf = buf +" "+ verify(buf);
return PtzControl(PAN_LEFT, state, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(PAN_LEFT, state, speed);
bool HIKBallCamera::PtzControlRight(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 02 "+velocity[speed - 1]+" 00"; bool HIKBallCamera::PtzControlRight(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 02 "+velocity[speed - 1]+" 00";
}else{ buf = buf +" "+ verify(buf);
return PtzControl(PAN_RIGHT, 0, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(PAN_RIGHT, state, speed);
bool HIKBallCamera::PtzControlUp(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 08 00 "+velocity[speed - 1]; bool HIKBallCamera::PtzControlUp(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 08 00 "+velocity[speed - 1];
}else{ buf = buf +" "+ verify(buf);
return PtzControl(TILT_UP, 0, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(TILT_UP, state, speed);
bool HIKBallCamera::PtzControlDown(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 10 00 "+velocity[speed - 1]; bool HIKBallCamera::PtzControlDown(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 10 00 "+velocity[speed - 1];
}else{ buf = buf +" "+ verify(buf);
return PtzControl(TILT_DOWN, 0, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(TILT_DOWN, state, speed);
bool HIKBallCamera::PtzControlZoomIn(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
SerialSend(PrepareHexString("ff 01 00 20 00 00 21")); bool HIKBallCamera::PtzControlZoomIn(int speed,int state)
return true; {
}else{ if (BallMachineType=="BuKongQiu") {
return PtzControl(ZOOM_IN, 0, speed); SerialSend(PrepareHexString("ff 01 00 20 00 00 21"));
} return true;
} }else{
return PtzControl(ZOOM_IN, state, speed);
bool HIKBallCamera::PtzControlZoomOut(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
SerialSend(PrepareHexString("ff 01 00 40 00 00 41")); bool HIKBallCamera::PtzControlZoomOut(int speed,int state)
return true; {
}else{ if (BallMachineType=="BuKongQiu") {
return PtzControl(ZOOM_OUT, 0, speed); SerialSend(PrepareHexString("ff 01 00 40 00 00 41"));
} return true;
} }else{
return PtzControl(ZOOM_OUT, state, speed);
}
bool HIKBallCamera::PtzControlFocusAdd(int speed,int state){ }
if (BallMachineType=="BuKongQiu") {
std::cout << "ff 01 01 00 00 00 02" << std::endl;
SerialSend(PrepareHexString("ff 01 01 00 00 00 02")); bool HIKBallCamera::PtzControlFocusAdd(int speed,int state){
return true; if (BallMachineType=="BuKongQiu") {
}else{ std::cout << "ff 01 01 00 00 00 02" << std::endl;
return PtzControl(ZOOM_OUT, 1, speed); SerialSend(PrepareHexString("ff 01 01 00 00 00 02"));
} return true;
} }else{
return PtzControl(FOCUS_FAR, state, speed);
bool HIKBallCamera::PtzControlFocusSub(int speed,int state){ }
if (BallMachineType=="BuKongQiu") { }
std::cout << "ff 01 00 80 00 00 81" << std::endl;
SerialSend(PrepareHexString("ff 01 00 80 00 00 81")); bool HIKBallCamera::PtzControlFocusSub(int speed,int state){
return true; if (BallMachineType=="BuKongQiu") {
}else{ std::cout << "ff 01 00 80 00 00 81" << std::endl;
return PtzControl(ZOOM_OUT, 1, speed); SerialSend(PrepareHexString("ff 01 00 80 00 00 81"));
} return true;
} }else{
return PtzControl(FOCUS_NEAR, state, speed);
bool HIKBallCamera::PtzControlStop(){ }
SerialSend(PrepareHexString("ff 01 00 00 00 00 01")); }
return true;
} bool HIKBallCamera::PtzControlStop(){
SerialSend(PrepareHexString("ff 01 00 00 00 00 01"));
return true;
bool HIKBallCamera::PtzControlUpLeft(int speed,int state) }
{
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 0c "+velocity[speed - 1]+" " + velocity[speed - 1]; bool HIKBallCamera::PtzControlUpLeft(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 0c "+velocity[speed - 1]+" " + velocity[speed - 1];
}else{ buf = buf +" "+ verify(buf);
return PtzControl(UP_LEFT, state, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(UP_LEFT, state, speed);
bool HIKBallCamera::PtzControlUpRight(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 0a "+velocity[speed - 1]+" " + velocity[speed - 1]; bool HIKBallCamera::PtzControlUpRight(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 0a "+velocity[speed - 1]+" " + velocity[speed - 1];
}else{ buf = buf +" "+ verify(buf);
return PtzControl(UP_RIGHT, 0, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(UP_RIGHT, state, speed);
bool HIKBallCamera::PtzControlDownLeft(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 14 "+velocity[speed - 1]+" " + velocity[speed - 1]; bool HIKBallCamera::PtzControlDownLeft(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 14 "+velocity[speed - 1]+" " + velocity[speed - 1];
}else{ buf = buf +" "+ verify(buf);
return PtzControl(DOWN_LEFT, 0, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(DOWN_LEFT, state, speed);
bool HIKBallCamera::PtzControlDownRight(int speed,int state) }
{ }
if (BallMachineType=="BuKongQiu") {
std::string buf = "ff 01 00 12 "+velocity[speed - 1]+" " + velocity[speed - 1]; bool HIKBallCamera::PtzControlDownRight(int speed,int state)
buf = buf +" "+ verify(buf); {
SerialSend(PrepareHexString(buf)); if (BallMachineType=="BuKongQiu") {
return true; std::string buf = "ff 01 00 12 "+velocity[speed - 1]+" " + velocity[speed - 1];
}else{ buf = buf +" "+ verify(buf);
return PtzControl(DOWN_RIGHT, 0, speed); SerialSend(PrepareHexString(buf));
} return true;
} }else{
return PtzControl(DOWN_RIGHT, state, speed);
std::string addSpacesEveryTwoWords(const std::string& hex) { }
std::ostringstream result; }
int len = hex.length(); std::string addSpacesEveryTwoWords(const std::string& hex) {
// 如果十六进制字符串的长度是奇数,则在前面添加一个 0 std::ostringstream result;
std::string paddedHex = (len % 2 == 1) ? "0" + hex : hex;
// 遍历字符串,每两个字符分割一次 int len = hex.length();
for (size_t i = 0; i < paddedHex.length(); i += 2) { // 如果十六进制字符串的长度是奇数,则在前面添加一个 0
if (i != 0) { std::string paddedHex = (len % 2 == 1) ? "0" + hex : hex;
result << " "; // 遍历字符串,每两个字符分割一次
} for (size_t i = 0; i < paddedHex.length(); i += 2) {
result << paddedHex.substr(i, 2); if (i != 0) {
} result << " ";
return result.str(); }
} result << paddedHex.substr(i, 2);
std::string padding(const std::string& hex){ }
if (hex.length()==2){ return result.str();
return "00 "+hex; }
} else{ std::string padding(const std::string& hex){
return hex; if (hex.length()==2){
} return "00 "+hex;
} } else{
return hex;
}
// PTZ 跳转到指定位置 }
bool HIKBallCamera::PtzGotoPut(int Action, float P, float T, float Z)
{
if (BallMachineType=="BuKongQiu"){ // PTZ 跳转到指定位置
std::string pHex = decimalToHexadecimal(P * 100); bool HIKBallCamera::PtzGotoPut(int Action, float P, float T, float Z)
pHex = padding(addSpacesEveryTwoWords(pHex)); {
std::string tHex = decimalToHexadecimal(T * 100); if (BallMachineType=="BuKongQiu"){
tHex = padding(addSpacesEveryTwoWords(tHex)); std::string pHex = decimalToHexadecimal(P * 100);
std::string zHex = decimalToHexadecimal(Z * 100); pHex = padding(addSpacesEveryTwoWords(pHex));
zHex = padding(addSpacesEveryTwoWords(zHex)); std::string tHex = decimalToHexadecimal(T * 100);
std::string pBuf = "ff 01 00 4b "+ pHex; tHex = padding(addSpacesEveryTwoWords(tHex));
std::string tBuf = "ff 01 00 4d "+ tHex; std::string zHex = decimalToHexadecimal(Z * 100);
std::string zBuf = "ff 01 00 4f "+ zHex; zHex = padding(addSpacesEveryTwoWords(zHex));
pBuf = pBuf+" "+verify(pBuf); std::string pBuf = "ff 01 00 4b "+ pHex;
tBuf = tBuf+" "+verify(tBuf); std::string tBuf = "ff 01 00 4d "+ tHex;
zBuf = zBuf+" "+verify(zBuf); std::string zBuf = "ff 01 00 4f "+ zHex;
switch (Action) { pBuf = pBuf+" "+verify(pBuf);
case 1: tBuf = tBuf+" "+verify(tBuf);
SerialSend(PrepareHexString(pBuf)); // 设置 P zBuf = zBuf+" "+verify(zBuf);
SerialSend(PrepareHexString(tBuf)); // 设置 T switch (Action) {
SerialSend(PrepareHexString(zBuf)); // 设置 Z case 1:
break; SerialSend(PrepareHexString(pBuf)); // 设置 P
case 2: SerialSend(PrepareHexString(tBuf)); // 设置 T
SerialSend(PrepareHexString(pBuf)); // 设置 P SerialSend(PrepareHexString(zBuf)); // 设置 Z
break; break;
case 3: case 2:
SerialSend(PrepareHexString(tBuf)); // 设置 T SerialSend(PrepareHexString(pBuf)); // 设置 P
break; break;
case 4: case 3:
SerialSend(PrepareHexString(zBuf)); // 设置 Z SerialSend(PrepareHexString(tBuf)); // 设置 T
break; break;
case 5: case 4:
SerialSend(PrepareHexString(pBuf)); // 设置 P SerialSend(PrepareHexString(zBuf)); // 设置 Z
SerialSend(PrepareHexString(tBuf)); // 设置 T break;
break; case 5:
default: SerialSend(PrepareHexString(pBuf)); // 设置 P
break; SerialSend(PrepareHexString(tBuf)); // 设置 T
} break;
return true; default:
}else{ break;
NET_DVR_PTZPOS ptzPosCurrent; }
ptzPosCurrent.wPanPos = DEC2HEX(P); return true;
ptzPosCurrent.wTiltPos = DEC2HEX(T); }else{
ptzPosCurrent.wAction = 5; NET_DVR_PTZPOS ptzPosCurrent;
ptzPosCurrent.wPanPos = DEC2HEX(P);
bool b = NET_DVR_SetDVRConfig(LoginID, NET_DVR_SET_PTZPOS, m_Channel, &ptzPosCurrent, sizeof(NET_DVR_PTZPOS)); ptzPosCurrent.wTiltPos = DEC2HEX(T);
return b; ptzPosCurrent.wZoomPos = DEC2HEX(Z);
} ptzPosCurrent.wAction = Action;
}
bool HIKBallCamera::SerialSend(const std::string& hex){ bool b = NET_DVR_SetDVRConfig(LoginID, NET_DVR_SET_PTZPOS, m_Channel, &ptzPosCurrent, sizeof(NET_DVR_PTZPOS));
char m_DataBuf[50]; return b;
int m_DataLen; }
int len = hex.length(); }
m_DataLen = len<1024 ? len : 1024; bool HIKBallCamera::SerialSend(const std::string& hex){
memcpy(m_DataBuf,hex.c_str(),m_DataLen); char m_DataBuf[50];
return NET_DVR_SerialSend(lTranHandle,1, m_DataBuf, m_DataLen); int m_DataLen;
} int len = hex.length();
m_DataLen = len<1024 ? len : 1024;
bool HIKBallCamera::PtzGet(float* posP, float* posT, float* posZ) { memcpy(m_DataBuf,hex.c_str(),m_DataLen);
if (BallMachineType=="BuKongQiu"){ return NET_DVR_SerialSend(lTranHandle,1, m_DataBuf, m_DataLen);
SerialSend(PrepareHexString("ff 01 00 51 00 00 52")); }
SerialSend(PrepareHexString("ff 01 00 53 00 00 54"));
SerialSend(PrepareHexString("ff 01 00 55 00 00 56")); bool HIKBallCamera::PtzGet(float* posP, float* posT, float* posZ) {
SLEEP(1); if (BallMachineType=="BuKongQiu"){
*posP = PTZDATA.P; SerialSend(PrepareHexString("ff 01 00 51 00 00 52"));
*posT = PTZDATA.T; SerialSend(PrepareHexString("ff 01 00 53 00 00 54"));
*posZ = PTZDATA.Z; SerialSend(PrepareHexString("ff 01 00 55 00 00 56"));
return true; SLEEP(1);
}else{ *posP = PTZDATA.P;
NET_DVR_PTZPOS ptzPosCurrent; *posT = PTZDATA.T;
DWORD dwtmp; *posZ = PTZDATA.Z;
bool b = NET_DVR_GetDVRConfig(LoginID, NET_DVR_GET_PTZPOS, m_Channel, &ptzPosCurrent, sizeof(NET_DVR_PTZPOS),&dwtmp); return true;
float P = HEX2DEC(ptzPosCurrent.wPanPos); }else{
float T = HEX2DEC(ptzPosCurrent.wTiltPos); NET_DVR_PTZPOS ptzPosCurrent;
float Z = HEX2DEC(ptzPosCurrent.wZoomPos); DWORD dwtmp;
posP = &P; bool b = NET_DVR_GetDVRConfig(LoginID, NET_DVR_GET_PTZPOS, m_Channel, &ptzPosCurrent, sizeof(NET_DVR_PTZPOS),&dwtmp);
posT = &T; float P = HEX2DEC(ptzPosCurrent.wPanPos);
posZ = &Z; float T = HEX2DEC(ptzPosCurrent.wTiltPos);
return b; float Z = HEX2DEC(ptzPosCurrent.wZoomPos);
} *posP = P;
} *posT = T;
*posZ = Z;
bool HIKBallCamera::CmdSwitch(int direction,int speed,int state){ return b;
bool Res = false; }
switch (direction) { }
case PTZ_LEFT:
Res = PtzControlLeft(speed,state); bool HIKBallCamera::CmdSwitch(int direction,int speed,int state){
break; bool Res = false;
case PTZ_RIGHT: switch (direction) {
Res = PtzControlRight(speed,state); case PTZ_LEFT:
break; Res = PtzControlLeft(speed,state);
case PTZ_UP: break;
Res = PtzControlUp(speed,state); case PTZ_RIGHT:
break; Res = PtzControlRight(speed,state);
case PTZ_DOWN: break;
Res = PtzControlDown(speed,state); case PTZ_UP:
break; Res = PtzControlUp(speed,state);
case PTZ_UP_LEFT: break;
Res = PtzControlUpLeft(speed,state); case PTZ_DOWN:
break; Res = PtzControlDown(speed,state);
case PTZ_UP_RIGHT: break;
Res = PtzControlUpRight(speed,state); case PTZ_UP_LEFT:
break; Res = PtzControlUpLeft(speed,state);
case PTZ_DOWN_LEFT: break;
Res = PtzControlDownLeft(speed,state); case PTZ_UP_RIGHT:
break; Res = PtzControlUpRight(speed,state);
case PTZ_DOWN_RIGHT: break;
Res = PtzControlDownRight(speed,state); case PTZ_DOWN_LEFT:
break; Res = PtzControlDownLeft(speed,state);
case PTZ_ZOOM_IN: break;
Res = PtzControlZoomIn(speed,state); case PTZ_DOWN_RIGHT:
break; Res = PtzControlDownRight(speed,state);
case PTZ_ZOOM_OUT: break;
Res = PtzControlZoomOut(speed,state); case PTZ_ZOOM_IN:
break; Res = PtzControlZoomIn(speed,state);
case PTZ_Focus_Far: break;
Res = PtzControlFocusSub(speed,state); case PTZ_ZOOM_OUT:
break; Res = PtzControlZoomOut(speed,state);
case PTZ_Focus_Near: break;
Res = PtzControlFocusAdd(speed,state); case PTZ_Focus_Far:
break; Res = PtzControlFocusSub(speed,state);
} break;
return Res; case PTZ_Focus_Near:
} Res = PtzControlFocusAdd(speed,state);
break;
bool HIKBallCamera::StopBus(int direction) { }
if (BallMachineType=="BuKongQiu"){ return Res;
return PtzControlStop(); }
}
return CmdSwitch(direction,0,1); bool HIKBallCamera::StopBus(int direction) {
} if (BallMachineType=="BuKongQiu"){
return PtzControlStop();
bool HIKBallCamera::StartBus(int direction, int speed) { }
return CmdSwitch(direction,speed,0); return CmdSwitch(direction,0,1);
} }
bool HIKBallCamera::StartBus(int direction, int speed) {
return CmdSwitch(direction,speed,0);
}

View File

@@ -1,37 +1,36 @@
#include "HIKBase.h" #include "HIKBase.h"
#include <memory> #include <memory>
#include <cstring> #include <cstring>
#include <chrono> #include <chrono>
HIKBase::HIKBase() HIKBase::HIKBase()
{ {
memset(&DeviceInfo, 0, sizeof(DeviceInfo)); memset(&DeviceInfo, 0, sizeof(DeviceInfo));
} }
HIKBase::~HIKBase() = default; HIKBase::~HIKBase() = default;
int HIKBase::Login(std::string ip, std::string port, std::string username, std::string password) int HIKBase::Login(std::string ip, std::string port, std::string username, std::string password)
{ {
Ip = ip; Ip = ip;
Port = port; Port = port;
Username = username; Username = username;
Password = password; Password = password;
LoginID = NET_DVR_Login_V30((char *)Ip.c_str(), atoi(Port.c_str()), (char *)Username.c_str(), (char *)Password.c_str(), &DeviceInfo); LoginID = NET_DVR_Login_V30((char *)Ip.c_str(), atoi(Port.c_str()), (char *)Username.c_str(), (char *)Password.c_str(), &DeviceInfo);
std::cout << LoginID <<std::endl; return NET_DVR_GetLastError();
return LoginID; }
}
void HIKBase::Logout()
void HIKBase::Logout() {
{ if (LoginID >= 0)
if (LoginID >= 0) {
{ NET_DVR_Logout(LoginID);
NET_DVR_Logout(LoginID); LoginID = -1;
LoginID = -1; }
} }
}
bool HK_DVR_Init(){
bool HK_DVR_Init(){ return NET_DVR_Init();
return NET_DVR_Init();
} }

View File

@@ -27,15 +27,16 @@ bool HIKNvr::InitNvr(std::string ip, std::string port, std::string username, std
return false; return false;
} }
bool HIKNvr::GetNvrUTCDiff(){ int HIKNvr::GetNvrUTCDiff(){
NET_DVR_NETAPPCFG struNAC = {0}; NET_DVR_NETAPPCFG struNAC = {0};
DWORD ZoneSize = 0; DWORD ZoneSize = 0;
NET_DVR_GetDVRConfig(LoginID, NET_DVR_GET_NETAPPCFG, 0, &struNAC, sizeof(NET_DVR_NETAPPCFG), &ZoneSize); if (NET_DVR_GetDVRConfig(LoginID, NET_DVR_GET_NETAPPCFG, 0, &struNAC, sizeof(NET_DVR_NETAPPCFG), &ZoneSize)){
return 5000;
};
int nDiffHour = struNAC.struNtpClientParam.cTimeDifferenceH; int nDiffHour = struNAC.struNtpClientParam.cTimeDifferenceH;
int nDiffMin = struNAC.struNtpClientParam.cTimeDifferenceM; int nDiffMin = struNAC.struNtpClientParam.cTimeDifferenceM;
nDiffTotalMin = (nDiffHour < 0 ? -1 : 1) * (abs(nDiffHour) * 60 + nDiffMin); nDiffTotalMin = (nDiffHour < 0 ? -1 : 1) * (abs(nDiffHour) * 60 + nDiffMin);
return true; return (nDiffHour < 0 ? -1 : 1) * (abs(nDiffHour) * 60 + nDiffMin);
} }
/** /**

View File

@@ -42,7 +42,7 @@ public:
//though input SelectTime get the time region //though input SelectTime get the time region
bool GetTimeRegion(DateTime select_time,int value ,DateTime &time_start,DateTime &time_end); bool GetTimeRegion(DateTime select_time,int value ,DateTime &time_start,DateTime &time_end);
bool GetNvrUTCDiff(); int GetNvrUTCDiff();
int nDiffTotalMin; int nDiffTotalMin;
public: public: