Kaynağa Gözat

使CGO的代码更加的跨平台

kunmeng 1 hafta önce
ebeveyn
işleme
180be5ffc8
1 değiştirilmiş dosya ile 43 ekleme ve 11 silme
  1. 43 11
      Core.go

+ 43 - 11
Core.go

@@ -14,7 +14,22 @@ package HikSDK
 #include <stddef.h>
 #include <string.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"
 
 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);
 }