diff --git a/Core.go b/Core.go index bc7e5f5..4842cf1 100644 --- a/Core.go +++ b/Core.go @@ -14,7 +14,22 @@ package HikSDK #include #include #include -#include +#include + +#ifdef _WIN32 + #include +#else + #include +#endif + +void sleep_seconds(int seconds) { +#ifdef _WIN32 + Sleep(seconds * 1000); // Sleep 参数是毫秒 +#else + sleep(seconds); // sleep 参数是秒 +#endif +} + #include "HCNetSDK.h" typedef struct DEVICEINFO @@ -145,16 +160,33 @@ struct 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) { char type = pRecvDataBuffer[3]; printf("type: %x\n", type); - if (type == 0x59){ - serialData.p = (float)ntohs(*(uint16_t*)(pRecvDataBuffer + 4))/100.0f; - }else if (type == 0x5b){ - serialData.t = (float)ntohs(*(uint16_t*)(pRecvDataBuffer + 4))/100.0f; - }else if (type == 0x5d){ - serialData.z = (float)ntohs(*(uint16_t*)(pRecvDataBuffer + 4))/100.0f; + + uint16_t raw_value; + memcpy(&raw_value, pRecvDataBuffer + 4, sizeof(uint16_t)); + float converted = (float)my_ntohs(raw_value) / 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}; LONG lTranHandle = NET_DVR_SerialStart(lUserID, 2,g_fSerialDataCallBack,6); LONG lSerialChan = 0; - sleep(1); + sleep_seconds(1); NET_DVR_SerialSend(lTranHandle, lSerialChan, p, 7); - sleep(1); + sleep_seconds(1); NET_DVR_SerialSend(lTranHandle, lSerialChan, t, 7); - sleep(1); + sleep_seconds(1); NET_DVR_SerialSend(lTranHandle, lSerialChan, z, 7); - sleep(1); + sleep_seconds(1); NET_DVR_SerialStop(lTranHandle); }