使CGO的代码更加的跨平台

This commit is contained in:
kunmeng
2025-08-08 14:13:25 +08:00
parent 0ad3f0da28
commit 180be5ffc8

54
Core.go
View File

@@ -14,7 +14,22 @@ package HikSDK
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <arpa/inet.h> #include <stdint.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
void sleep_seconds(int seconds) {
#ifdef _WIN32
Sleep(seconds * 1000); // Sleep 参数是毫秒
#else
sleep(seconds); // sleep 参数是秒
#endif
}
#include "HCNetSDK.h" #include "HCNetSDK.h"
typedef struct DEVICEINFO typedef struct DEVICEINFO
@@ -145,16 +160,33 @@ struct SerialData
struct SerialData serialData; struct SerialData serialData;
// 自定义 ntohs 函数(仅适用于小端平台)
uint16_t my_ntohs(uint16_t netshort) {
return (netshort >> 8) | (netshort << 8);
}
void CALLBACK g_fSerialDataCallBack(LONG lSerialHandle, char *pRecvDataBuffer, DWORD dwBufSize, DWORD dwUser) void CALLBACK g_fSerialDataCallBack(LONG lSerialHandle, char *pRecvDataBuffer, DWORD dwBufSize, DWORD dwUser)
{ {
char type = pRecvDataBuffer[3]; char type = pRecvDataBuffer[3];
printf("type: %x\n", type); printf("type: %x\n", type);
if (type == 0x59){
serialData.p = (float)ntohs(*(uint16_t*)(pRecvDataBuffer + 4))/100.0f; uint16_t raw_value;
}else if (type == 0x5b){ memcpy(&raw_value, pRecvDataBuffer + 4, sizeof(uint16_t));
serialData.t = (float)ntohs(*(uint16_t*)(pRecvDataBuffer + 4))/100.0f; float converted = (float)my_ntohs(raw_value) / 100.0f;
}else if (type == 0x5d){
serialData.z = (float)ntohs(*(uint16_t*)(pRecvDataBuffer + 4))/100.0f; switch (type) {
case 0x59:
serialData.p = converted;
break;
case 0x5b:
serialData.t = converted;
break;
case 0x5d:
serialData.z = converted;
break;
default:
// 未知类型
break;
} }
} }
@@ -165,13 +197,13 @@ void GetPTZPOS(LONG lUserID)
char z[7] = {0xff, 0x01, 0x00, 0x55, 0x00, 0x00, 0x56}; char z[7] = {0xff, 0x01, 0x00, 0x55, 0x00, 0x00, 0x56};
LONG lTranHandle = NET_DVR_SerialStart(lUserID, 2,g_fSerialDataCallBack,6); LONG lTranHandle = NET_DVR_SerialStart(lUserID, 2,g_fSerialDataCallBack,6);
LONG lSerialChan = 0; LONG lSerialChan = 0;
sleep(1); sleep_seconds(1);
NET_DVR_SerialSend(lTranHandle, lSerialChan, p, 7); NET_DVR_SerialSend(lTranHandle, lSerialChan, p, 7);
sleep(1); sleep_seconds(1);
NET_DVR_SerialSend(lTranHandle, lSerialChan, t, 7); NET_DVR_SerialSend(lTranHandle, lSerialChan, t, 7);
sleep(1); sleep_seconds(1);
NET_DVR_SerialSend(lTranHandle, lSerialChan, z, 7); NET_DVR_SerialSend(lTranHandle, lSerialChan, z, 7);
sleep(1); sleep_seconds(1);
NET_DVR_SerialStop(lTranHandle); NET_DVR_SerialStop(lTranHandle);
} }