增加vad 鉴权代码,可使用正式版本了
authorhcj <1224667075@qq.com>
Mon, 17 Nov 2025 08:27:13 +0000 (16:27 +0800)
committerhcj <1224667075@qq.com>
Mon, 17 Nov 2025 08:27:13 +0000 (16:27 +0800)
code/sdk/zhihui/ai_old/websocket_server_example.cpp
code/sdk/zhihui/dmp/dmp_dev_authentication.c
code/sdk/zhihui/dmp/dmp_http.c
code/sdk/zhihui/imsl/CMakeLists.txt
code/sdk/zhihui/imsl/include/transport.h [new file with mode: 0644]
code/sdk/zhihui/imsl/lib/libimslkws.a
code/sdk/zhihui/imsl/lib/libimslnn.a
code/sdk/zhihui/imsl/lib/libimslvad.a
code/sdk/zhihui/imsl/src/imsl_system_adapter.c
code/sdk/zhihui/imsl/src/vad_server.c

index 06c0a0c..dae0ae3 100644 (file)
@@ -98,12 +98,15 @@ void websocket_event_callback(const ws_event_data_t *event_data)
             printf("WebSocket connected: type=%d\n", event_data->server_type);
             switch (event_data->server_type)
             {
-                  case WS_SERVER_TYPE_CHAT:
+                case WS_SERVER_TYPE_CHAT:
+                    if(g_chat_ai_type==1)
+                    {
+                        send_ai_system_message(g_chat_server->client);
+                    }
+                    break;
+                default:
+                    break;
 
-                if(g_chat_ai_type==1)
-                {
-                    send_ai_system_message(g_chat_server->client);
-                }
 
             }
             break;
index c2734ab..e0043ac 100644 (file)
@@ -17,6 +17,7 @@
 #include "mbedtls/md5.h"
 #include <stdio.h>
 #include <string.h>
+#include <ctype.h>
 #include "mbedtls/aes.h"
 #include "mbedtls/cipher.h"
 #include "dev_authentication.h"
@@ -66,10 +67,11 @@ bool dmp_read_dev_token(char *outdata)
 {
     time_t timestamp;
     timestamp = time(NULL);
-    if(aut_login_time==0 || timestamp - aut_login_time > 60 * 60 )
+    if(aut_login_time==0 || timestamp - aut_login_time > 60 * 60 || strlen(data_token)<10)
     {
         return false;
     }
+    printf("dmp_read_dev_token %s\r\n",data_token);
      memcpy(outdata,data_token,strlen(data_token));
      return true;
 }
@@ -367,7 +369,7 @@ bool dmp_aut_active(void)//设备激活
     unsigned char deviceId[6] = {0};
     unsigned int len = 6;
 
-    char deviceId_temp[20] = {0};
+    char deviceId_temp[50] = {0};
 
 #if DMP_DEVICE_ID_SOURCE == 0
     // 使用蓝牙地址
@@ -378,9 +380,9 @@ bool dmp_aut_active(void)//设备激活
 #elif DMP_DEVICE_ID_SOURCE == 1
     // 使用 IMEI
     char *imei = cat1_api_runtime_get_cat1_imei();
+    
     if (imei != NULL && strlen(imei) > 0) {
-        strncpy(deviceId_temp, imei, sizeof(deviceId_temp) - 1);
-        deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+        strncpy(deviceId_temp, imei, strlen(imei));
     } else {
         sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
     }
@@ -388,8 +390,7 @@ bool dmp_aut_active(void)//设备激活
     // 使用 ICCID
     char *iccid = cat1_api_runtime_get_cat1_iccid();
     if (iccid != NULL && strlen(iccid) > 0) {
-        strncpy(deviceId_temp, iccid, sizeof(deviceId_temp) - 1);
-        deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+        strncpy(deviceId_temp, iccid, strlen(iccid));
     } else {
         sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
     }
@@ -397,6 +398,9 @@ bool dmp_aut_active(void)//设备激活
     // 默认使用固定值
     sprintf(deviceId_temp, "%s", "898604B719259031337");
 #endif
+    for (size_t i = 0; i < sizeof(deviceId_temp) && deviceId_temp[i] != '\0'; ++i) {
+        deviceId_temp[i] = (char)toupper((unsigned char)deviceId_temp[i]);
+    }
 
 
      time_t timestamp;
@@ -519,7 +523,7 @@ bool dmp_aut_login(void)//登录
         }
     }
     memcpy(dev_pass, data_pass, strlen(data_pass));
-    printf("dev_sign_in 2");
+    printf("dev_sign_in 2 %s\r\n",dev_pass);
     int count = 5;
     char *encrypt_data = NULL;
     char *response_data =NULL;
@@ -538,7 +542,7 @@ bool dmp_aut_login(void)//登录
 
     // 登录数据
     unsigned char deviceId[6] = {0};
-    char deviceId_temp[20] = {0};
+    char deviceId_temp[50] = {0};
 
 #if DMP_DEVICE_ID_SOURCE == 0
     // 使用蓝牙地址
@@ -549,9 +553,9 @@ bool dmp_aut_login(void)//登录
 #elif DMP_DEVICE_ID_SOURCE == 1
     // 使用 IMEI
     char *imei = cat1_api_runtime_get_cat1_imei();
+    
     if (imei != NULL && strlen(imei) > 0) {
-        strncpy(deviceId_temp, imei, sizeof(deviceId_temp) - 1);
-        deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+        strncpy(deviceId_temp, imei, strlen(imei));
     } else {
         sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
     }
@@ -559,8 +563,7 @@ bool dmp_aut_login(void)//登录
     // 使用 ICCID
     char *iccid = cat1_api_runtime_get_cat1_iccid();
     if (iccid != NULL && strlen(iccid) > 0) {
-        strncpy(deviceId_temp, iccid, sizeof(deviceId_temp) - 1);
-        deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+        strncpy(deviceId_temp, iccid, strlen(iccid));
     } else {
         sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
     }
@@ -569,6 +572,11 @@ bool dmp_aut_login(void)//登录
     sprintf(deviceId_temp, "%s", "898604B719259031337");
 #endif
 
+    for (size_t i = 0; i < sizeof(deviceId_temp) && deviceId_temp[i] != '\0'; ++i) {
+        deviceId_temp[i] = (char)toupper((unsigned char)deviceId_temp[i]);
+    }
+
+
    
     printf("2时间戳: %ld\n", (long)timestamp);
     long long timestamp_ms = (long long)timestamp * 1000;
@@ -719,6 +727,7 @@ bool dmp_read_dev_token_save(char *indata)
 
     if(strlen(token_str)>=0 && data_token!=NULL )
     {
+        printf("dmp_read_dev_token_save %s\r\n",token_str);
         memcpy(data_token,token_str,strlen(token_str));
          cJSON_Delete(data);
         return true;
index 25f8ed0..64e1ccd 100644 (file)
@@ -89,7 +89,7 @@ int dmp_http_post(char *post_buf,char *url,char *put_buf)
     }
     free(req_buf);
     free(rsp_buf);
-    return ret;
+    return client.responseCode;
 }
 
 
@@ -131,5 +131,5 @@ int dmp_http_get(char *post_buf,char *url,char *put_buf)
     }
     free(req_buf);
     free(rsp_buf);
-    return ret;
+    return client.responseCode;
 }
\ No newline at end of file
index d5521d3..5129f80 100644 (file)
@@ -17,6 +17,12 @@ set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/include  # 包含imsl_vad.h和imsl_kws.h的目录
 )
 
+set(PRIVATE_HEADER
+    ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include
+    ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include
+)
+# 
+
 # 公共宏定义(可选)
 set(PUBLIC_DEFINES
     # 例如:IMSL_LN_ENABLE=1
@@ -30,9 +36,6 @@ if(DEFINED MINI_MP3)
 endif()
 
 # 私有头文件路径(仅当前组件内部使用)
-set(PRIVATE_HEADER
-    # 如无特殊私有头文件,可留空
-)
 
 # 私有宏定义(可选)
 set(PRIVATE_DEFINES
diff --git a/code/sdk/zhihui/imsl/include/transport.h b/code/sdk/zhihui/imsl/include/transport.h
new file mode 100644 (file)
index 0000000..daa1dbc
--- /dev/null
@@ -0,0 +1,59 @@
+//==========================================================================\r
+// transport.h - 传输层抽象接口\r
+//==========================================================================\r
+#ifndef TRANSPORT_H\r
+#define TRANSPORT_H\r
+\r
+// #include "http_config.h"\r
+#include <stdint.h>\r
+#include <stddef.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+// 传输层错误码\r
+typedef enum {\r
+    TRANSPORT_OK = 0,\r
+    TRANSPORT_ERROR_INIT = -1,\r
+    TRANSPORT_ERROR_CONNECT = -2,\r
+    TRANSPORT_ERROR_SEND = -3,\r
+    TRANSPORT_ERROR_RECV = -4,\r
+    TRANSPORT_ERROR_TIMEOUT = -5,\r
+    TRANSPORT_ERROR_DISCONNECTED = -6,\r
+    TRANSPORT_ERROR_INVALID_PARAM = -7\r
+} transport_error_t;\r
+\r
+// 传输层接口结构体\r
+typedef struct {\r
+    // 初始化传输层\r
+    int (*init)(void);\r
+    \r
+    // 连接到指定主机和端口\r
+    int (*connect)(const char* host, uint16_t port);\r
+    \r
+    // 发送数据\r
+    int (*send)(const uint8_t* data, uint16_t len);\r
+    \r
+    // 接收数据,返回实际接收的字节数\r
+    int (*recv)(uint8_t* buffer, uint16_t max_len);\r
+    \r
+    // 断开连接\r
+    int (*disconnect)(void);\r
+    \r
+    // 检查连接状态\r
+    int (*is_connected)(void);\r
+    \r
+    // 获取系统时间戳(毫秒)\r
+    uint32_t (*get_tick)(void);\r
+    \r
+    // 延时函数(毫秒)\r
+    void (*delay)(uint32_t ms);\r
+    \r
+} transport_interface_t;\r
+\r
+// 全局传输接口指针\r
+extern transport_interface_t* g_transport;\r
+\r
+// 注册传输接口\r
+void transport_register(transport_interface_t* transport);\r
+\r
+#endif // TRANSPORT_H
\ No newline at end of file
index 6c07435..5184e2f 100644 (file)
Binary files a/code/sdk/zhihui/imsl/lib/libimslkws.a and b/code/sdk/zhihui/imsl/lib/libimslkws.a differ
index 0f73723..8accb13 100644 (file)
Binary files a/code/sdk/zhihui/imsl/lib/libimslnn.a and b/code/sdk/zhihui/imsl/lib/libimslnn.a differ
index 293b4e0..a0f4521 100644 (file)
Binary files a/code/sdk/zhihui/imsl/lib/libimslvad.a and b/code/sdk/zhihui/imsl/lib/libimslvad.a differ
index a57546a..dcc0129 100644 (file)
@@ -4,8 +4,24 @@
  * @copyright Copyright (c) 2023-2023. All rights reserved.
  */
 
-#include <stddef.h>
-#include <stdlib.h>
+#include <time.h>
+
+#include "lwip/sockets.h"
+#include "lwip/netdb.h"
+#include "lwip/inet.h"
+#include "imsl_vad.h"
+#include "transport.h"
+
+// #include "cmsis_os2.h"
+
+#ifndef htons
+static inline u16_t htons(u16_t n)
+{
+    return ((n & 0xFF) << 8) | ((n & 0xFF00) >> 8);
+}
+#endif
+
+// #include <sys/time.h>
 
 /**
  * @brief 初始化系统堆内存
@@ -34,3 +50,228 @@ void sys_free(void *ptr)
 {
     free(ptr);
 }
+
+
+#define HTTP_DEBUG(...) printf(__VA_ARGS__)
+
+// 临时定义缺失的宏和类型(替代transport.h)
+// #define TRANSPORT_OK            0
+// #define TRANSPORT_ERROR_CONNECT -1
+// #define TRANSPORT_ERROR_SEND    -2
+// #define TRANSPORT_ERROR_RECV    -3
+// #define TRANSPORT_ERROR_NOT_CONNECTED -4
+// #define TRANSPORT_ERROR_DISCONNECTED  -5
+
+// 传输层接口结构体定义
+// typedef struct {
+//     int (*init)(void);
+//     int (*connect)(const char* host, uint16_t port);
+//     int (*send)(const uint8_t* data, uint16_t len);
+//     int (*recv)(uint8_t* buffer, uint16_t max_len);
+//     int (*disconnect)(void);
+//     int (*is_connected)(void);
+//     uint32_t (*get_tick)(void);
+//     void (*delay)(uint32_t delay_ms);
+// } transport_interface_t;
+
+static int sock = -1;
+static int is_connected_flag = 0;
+
+static void imp_delay(uint32_t delay_ms) {
+    msleep(delay_ms);
+}
+
+static int imp_init(void) {
+    return TRANSPORT_OK;
+}
+
+static int imp_disconnect() {
+    if (sock >= 0) {
+        HTTP_DEBUG("sock close, sock : %d", sock);
+        lwip_close(sock);
+        sock = -1;
+    }
+    is_connected_flag = 0;
+
+    return TRANSPORT_OK;
+}
+
+static int imp_connect(const char* host, uint16_t port) {
+    // 检查是否已连接,避免重复连接
+    if (is_connected_flag) {
+        HTTP_DEBUG("Already connected, disconnecting first");
+        imp_disconnect();
+    }
+
+    // 提取纯主机名(处理带协议前缀的情况)
+    const char* host_start = host;
+    if (strncmp(host, "http://", 7) == 0) {
+        host_start = host + 7;
+    } else if (strncmp(host, "https://", 8) == 0) {
+        host_start = host + 8;
+        // 对于HTTPS,这里仅处理非加密连接,实际项目中需使用TLS
+        port = 80;
+        HTTP_DEBUG("Warning: HTTPS specified but using port 80 for non-encrypted connection");
+    }
+
+    // 提取主机名和端口(如果存在)
+    char clean_host[256] = {0};
+    uint16_t resolved_port = port;
+    
+    const char* colon_pos = strchr(host_start, ':');
+    const char* slash_pos = strchr(host_start, '/');
+    
+    if (colon_pos && (!slash_pos || colon_pos < slash_pos)) {
+        // 提取主机部分
+        strncpy(clean_host, host_start, colon_pos - host_start);
+        
+        // 提取端口部分
+        const char* port_start = colon_pos + 1;
+        const char* port_end = slash_pos ? slash_pos : (host_start + strlen(host_start));
+        char port_str[16] = {0};
+        strncpy(port_str, port_start, port_end - port_start);
+        resolved_port = atoi(port_str);
+        
+        if (resolved_port <= 0 || resolved_port > 65535) {
+            HTTP_DEBUG("Invalid port specified: %s, using default: %d", port_str, port);
+            resolved_port = port;
+        }
+    } else if (slash_pos) {
+        // 有路径但无端口号
+        strncpy(clean_host, host_start, slash_pos - host_start);
+    } else {
+        // 无端口和路径
+        strncpy(clean_host, host_start, strlen(host_start));
+    }
+    
+    HTTP_DEBUG("Connecting to: %s:%d", clean_host, resolved_port);
+
+    // 创建套接字
+    sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
+    if (sock < 0) {
+        HTTP_DEBUG("Socket creation failed: %d", errno);
+        return TRANSPORT_ERROR_CONNECT;
+    }
+
+    // 解析地址(优先使用inet_pton,失败时使用gethostbyname)
+    struct sockaddr_in server_addr;
+    memset(&server_addr, 0, sizeof(server_addr));
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_port = htons(resolved_port);
+
+    // 尝试直接解析IP地址
+    if (inet_pton(AF_INET, clean_host, &server_addr.sin_addr) <= 0) {
+        // 解析失败,尝试域名解析
+        HTTP_DEBUG("Hostname resolution: %s", clean_host);
+        struct hostent* he = gethostbyname(clean_host);
+        if (!he) {
+            HTTP_DEBUG("Hostname resolution failed: %s", clean_host);
+            close(sock);
+            sock = -1;
+            return TRANSPORT_ERROR_CONNECT;
+        }
+        // memcpy(&server_addr.sin_addr, he->h_addr, he->h_length);
+        server_addr.sin_addr = *(struct in_addr*)he->h_addr;
+        HTTP_DEBUG("clean_host: %s,ip: %s\n", clean_host,inet_ntoa(server_addr.sin_addr));
+    }
+
+    // 连接服务器
+    if (lwip_connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
+        HTTP_DEBUG("Connection failed: %d", errno);
+        close(sock);
+        sock = -1;
+        return TRANSPORT_ERROR_CONNECT;
+    }
+
+    // 连接成功
+    is_connected_flag = 1;
+    HTTP_DEBUG("Connected to %s:%d (socket: %d)", clean_host, resolved_port, sock);
+    return TRANSPORT_OK;
+}
+
+
+static int imp_send(const uint8_t* data, uint16_t len) {
+    int send_len = lwip_send(sock, data, len, 0);
+    return send_len;
+
+}
+
+static int imp_recv(uint8_t* buffer, uint16_t max_len) {
+    int recv_len = lwip_recv(sock, buffer, max_len, 0);//默认0是阻塞接收      //MSG_DONTWAIT 无阻塞
+    // int recv_len = recvfrom(sock, buffer, max_len, 0, NULL, NULL);
+    HTTP_DEBUG("recv_len=%d,%s\n",recv_len,buffer);
+    return recv_len;
+}
+
+
+static int imp_is_connected() {
+    if (sock < 0 || !is_connected_flag) {
+        return 0;
+    }
+
+    int error = 0;
+    socklen_t len = sizeof(error);
+    if (lwip_getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
+        is_connected_flag = 0;
+        return 0;
+    }
+
+    if (error != 0) {
+        is_connected_flag = 0;
+        imp_disconnect();
+        return 0;
+    }
+
+    return 1;
+}
+
+uint32_t get_system_time_ms(void) {
+    struct timespec ts;
+    // 获取系统实时时间(CLOCK_REALTIME对应UTC时间,自1970-01-01起)
+    if (clock_gettime(CLOCK_REALTIME, &ts) != 0) {
+        return 0;  // 出错时返回0(可根据需求调整错误处理)
+    }
+    // 转换为毫秒:秒数*1000 + 纳秒数/1000000
+    return (uint32_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
+}
+
+
+static uint32_t imp_get_tick() 
+{
+    return get_system_time_ms();
+    // return aos_get_tickcount();
+}
+
+ transport_interface_t  imp_transport= {
+    .init = imp_init,
+    .connect = imp_connect,
+    .send = imp_send,
+    .recv = imp_recv,
+    .disconnect = imp_disconnect,
+    .is_connected = imp_is_connected,
+    .get_tick = imp_get_tick,
+    .delay = imp_delay
+    };
+
+
+
+int test_func(void)
+{
+    //  transport_interface_t  imp_transport_test= {
+    // .init = imp_init,
+    // .connect = imp_connect,
+    // .send = imp_send,
+    // .recv = imp_recv,
+    // .disconnect = imp_disconnect,
+    // .is_connected = imp_is_connected,
+    // .get_tick = imp_get_tick,
+    // .delay = imp_delay
+    // };
+
+    // transport_register(&imp_transport_test);
+
+
+
+  
+    return 0;
+}
index a9ef0dd..348679a 100644 (file)
@@ -146,13 +146,14 @@ static errcode_t vad_process_pcm_data(const int16_t *pcm_data, size_t sample_cou
 
     if(dmp_auth==0)
     {
-        char dmp_token[64];
+        char dmp_token[64]={0};
         if(dmp_read_dev_token(dmp_token))
         {
             struct AuthInfo auth_info;
+            memset(&auth_info,0,sizeof(auth_info));
             strcpy(auth_info.dmp_token, dmp_token);
             int ret =auth_vad(&auth_info);
-            printf("vad_process_pcm_data %d\r\n",ret);
+            printf("vad_process_pcm_data %d %s\r\n",ret,auth_info.dmp_token);
             dmp_auth=1;
         }
         else
@@ -388,7 +389,12 @@ static void vad_queue_create(void)
                g_vad_server.queue_id, VAD_QUEUE_MSG_SIZE);
     }
 }
+extern int dmp_log_level;
 
+extern imsl_nn_printf_func imsl_nn_printf;
+
+
+  
 /**
  * @brief 初始化 VAD 处理任务
  */
@@ -398,7 +404,10 @@ errcode_t vad_server_init(vad_status_callback_t callback)
         IMSL_INFO("[VAD_SERVER] Already initialized\n");
         return ERRCODE_SUCC;
     }
-    
+    dmp_log_level=10086;
+    imsl_nn_printf = printf;
+
+
     IMSL_INFO("[VAD_SERVER] Initializing VAD server (optimized - no buffer)...\n");
     
     /* 初始化状态 */
@@ -425,7 +434,7 @@ errcode_t vad_server_init(vad_status_callback_t callback)
         IMSL_ERROR("[VAD_SERVER] Error: Failed to initialize VAD library\n");
         return ERRCODE_FAIL;
     }
-    IMSL_INFO("[VAD_SERVER] VAD library initialized (mode=%d)\n", vad_ret);
+    printf("[VAD_SERVER] VAD library initialized (mode=%d)\n", vad_ret);
     
     /* 创建 VAD 处理任务(使用扩展内存) */
     app_task_definition_ext_t task_cfg = {