Merge #2695 into sdk650pathc0423 from refs/changes/2695/head 2742/target/1
author胡传军 <1224667075@qq.com>
Fri, 14 Nov 2025 02:59:31 +0000 (02:59 +0000)
committeraliyun3243248791 <accounts_67aaf52ad497cd558d73ac32@mail.teambition.com>
Fri, 14 Nov 2025 02:59:31 +0000 (02:59 +0000)
Code review from 胡传军

* refs/changes/2695/head: (9 commits squashed)

  - 协议内容修改

  - Merge branch &#39;sdk650pathc0423&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423

  - 650入库修改

  - 650入库修改

  - Merge branch &#39;sdk650pathc0423&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423

  - Merge branch &#39;sdk650pathc0423&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423

  - lnppp版本vad增加

  - Merge branch &#39;sdk650pathc0423&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423

  - Merge branch &#39;sdk650pathc0423&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423

Signed-off-by: aliyun8003852482 <1224667075@qq.com>
Merged-by: 薛文强 <accounts_67aaf52ad497cd558d73ac32@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/2695
14 files changed:
code/sdk/application/brandy/brandy_standard/service_init.c
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp
code/sdk/build/config/target_config/brandy/config.py
code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c
code/sdk/zhihui/ai_old/websocket_server_example.cpp
code/sdk/zhihui/config/include/ConfigModel.h
code/sdk/zhihui/config/include/ConfigModelC.h
code/sdk/zhihui/config/src/ConfigModel.cpp
code/sdk/zhihui/dmp/dmp_dev_authentication.c
code/sdk/zhihui/imsl/CMakeLists.txt
code/sdk/zhihui/imsl/src/vad_server.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c
code/sdk/zhihui/utils/custom_utils.c

index 0c7b0c8..6ed3503 100644 (file)
 #include "imsl_at_cmd.h"\r
 #endif\r
 \r
+#ifdef SUPPORT_ZHIHUI_DMP\r
+#include "dmp_api_at.h"\r
+#endif\r
+\r
 static void register_at_service(void)\r
 {\r
 #ifdef SUPPORT_AT_GRAPHIC\r
@@ -279,6 +283,13 @@ static void register_at_service(void)
     at_cmd_add_moudle(imsl_vad_table, imsl_vad_cmd_count);\r
 #endif\r
 \r
+\r
+#ifdef SUPPORT_ZHIHUI_DMP\r
+    uint32_t dmp_api_cmd_count;\r
+    at_cmd_table_t *dmp_api_table = get_dmp_api_cmd_table(&dmp_api_cmd_count);\r
+    at_cmd_add_moudle(dmp_api_table, dmp_api_cmd_count);\r
+#endif\r
+\r
 }\r
 \r
 #ifdef CONFIG_OTA_UPDATE_SUPPORT\r
index 151a06a..339eca9 100644 (file)
     // 录音结束处理函数
     void ThunderBirdModel::HandleAudioRecordingEnd()
     {
-        return ;//需要vad的时候在处理
+        // return ;//需要vad的时候在处理
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioRecordingEnd: 录音结束");
         
         // 获取当前视图状态
index 2d342f6..40bd6a5 100644 (file)
@@ -1534,6 +1534,8 @@ target = {
                         #VAD 相关配置
                         "imsl",
                         "minimp3",
+                        "dmp",
+                        
 
                           "nativeabilityfwk",
                           "custom_utils",
index 25328b6..c1b8192 100644 (file)
@@ -62,6 +62,7 @@ extern "C" {
 #include "cat1_utils.h"
 #include "cmsis_os.h"
 
+#include "ConfigModelC.h"
 static uint8_t g_skip_cat1_service_udp_transfer = 0;
 static f_cat1_msg_callback g_cat1_msg_callback_func=NULL;
 #define PEER_IP "172.16.1.2"
@@ -114,9 +115,13 @@ enum UDP_COMMAND_HEAD {
     UDP_MSG_WATCH_REPLY_ACK = 0xAC,//
     // UDP_MSG_WATCH_REPLY_HANGUP = 0x21,//
 };
+
+void udp_send_msg_toCat1(uint8_t cmd,char *content);
+
 /** 0: old format 1字节cmd, 1: new format 2字节cmd */
 static uint8_t g_msg_format_type = 0;
 // void watch_replay_cat1_ANSWER(void);
+void cat1_get_DEV_ID(void);
 
 static char ble_buffer[20] = {0};
 
@@ -137,6 +142,37 @@ void ble_get_cat1_at_msg(char *buffer,uint8_t len)
     memcpy_s(buffer,len,ble_buffer,strlen(ble_buffer));
 }
 
+void send_ble_mac_toCat1(void)//发送BLE mac地址 to CAT1
+{
+    errcode_t ret = 0;
+    uint8_t btaddr[6] = {0};
+    char btaddr_str[64] = {0};
+    uint32_t len = 6;
+    ret = uapi_get_nv_btaddr((uint8_t *)btaddr, &len);
+    sprintf_s((char *)btaddr_str,64,"%02X:%02X:%02X:%02X:%02X:%02X", btaddr[0], btaddr[1], btaddr[2], btaddr[3], btaddr[4], btaddr[5]);
+    udp_send_msg_toCat1(UDP_MSG_SEND_BLE_MAC_TO_CAT1,btaddr_str);
+}
+void send_dmp_factory_flag(void)//发送入库出厂标识
+{
+    printf("send_dmp_factory_flag\r\n");
+    char send_str[10] = {0};
+    int state = Get_Dmp_Factory_Status();
+    sprintf_s((char *)send_str,10, "%d", state);
+    udp_send_msg_toCat1(UDP_MSG_RECV_DMP_FACTORY,send_str);//发送和接收同一个指令
+}
+
+
+void send_volte_switch_toCat1(void)//发送VOLTE->CAT1
+{
+    bool Cat1_4G =cm_poweron_cat1_on_bootup_flag();
+    if (Cat1_4G == 0)
+        return;
+
+    bool volte = get_volte_switch();
+    char send_str[5] = {0};
+    sprintf_s((char *)send_str,5, "%d", volte);
+    udp_send_msg_toCat1(UDP_MSG_SEND_VOLTE_SWITCH,send_str);
+}
 
 
 f_cat1_msg_callback g_msg_callback_func=NULL;
@@ -306,6 +342,8 @@ static osTimerId_t g_timer_time_answer = NULL;
 
 static osTimerId_t g_timer_time_Dial = NULL;
 
+
+
 /**如果 
  * g_python_updated == 0 && 
  * g_py_ver >= PY_SRV_VER_SUPORT_PY_OTA_MINI_VER &&
@@ -444,6 +482,16 @@ void udp_send_msg_toCat1(uint8_t cmd,char *content)
     }
 }
 
+void get_software_version_toCat1(void)//发送固件版本到cat1
+{
+    char version_buf[128] = {0};
+    uint32_t version_len = 128;
+    uapi_get_buildversion((uint8_t *)version_buf, version_len);
+    printf("version_buf %s\r\n",version_buf);
+    udp_send_msg_toCat1(UDP_MSG_GET_SOFTWARE_VESION,version_buf);
+    return;
+}
+
 #define BOOTMSG_HEADER_STR "BOOTUP"
 #define BOOTMSG_HEADER_STR_LEN strlen(BOOTMSG_HEADER_STR)
 #define NETSTAT_HEADER_STR "imei:"
@@ -1286,6 +1334,15 @@ void cat1_start_tcp_ota_init(void)
 }
 
 
+void send_dmp_mode_toCat1(uint8_t on)//设置
+{   
+    cat1_print_dbg("set_telecom_dmp_switch_toCat1 on:%d\r\n",on);
+    char buf[10] ={0};
+    sprintf_s(buf,10,"%d",on);
+    udp_send_msg_toCat1(UDP_MSG_SET_TELECON_DMP_SWITCH,buf);//1开启 0关闭
+}
+
+
 
 /**
  * @brief 发送指令给Cat1,输入 CMD_4G_T , cmd_buf 为指令所需参数.
@@ -1373,10 +1430,10 @@ static int udp_packet_parse(char *rx_buffer, int len)
 
         switch (cmd) {
         case UDP_MSG_COMMING_CALL:
-        #ifdef SUPPORT_DMP
+        // #ifdef SUPPORT_DMP
             if (get_volte_switch() == false) //如果VOLTE开关没有开启则不接CAT1的来电功能
                 break;
-        #endif
+        // #endif
             index = cat1_handle_call_incomming(msg_buffer);
             // uapi_save_runtime_log(RUNTIME_LOG_CAT1_UDP_MSG_COMMING);
             break;
@@ -1446,7 +1503,7 @@ static int udp_packet_parse(char *rx_buffer, int len)
 #endif 
 
                 if(g_msg_format_type == 0) break;  //下面指令只有新格式才支持,因此返回
-                #if 0
+                #if 1
                 int stateOld = get_dmp_change_mode_old();
                 int stateNew = get_dmp_change_mode_toCat1();//0 stateOld = 0 0-1
                 if (stateNew == 0){//关闭入库功能 把恢复出厂标识清0
@@ -1466,12 +1523,11 @@ static int udp_packet_parse(char *rx_buffer, int len)
                     }else {
                         get_software_version_toCat1();
                         send_ble_mac_toCat1();
-                        send_dmp_cm_address_toCat1();
                         send_volte_switch_toCat1();
                         send_dmp_factory_flag();
                     }
                 }
-            #endif
+                #endif
        
             }
             if(strstr(msg_buffer,"callanswer_success")!=NULL)
@@ -1529,9 +1585,9 @@ static int udp_packet_parse(char *rx_buffer, int len)
             break;
         case UDP_MSG_RECV_DMP_FACTORY:
             //  uapi_save_runtime_log(RUNTIME_LOG_CAT1_UDP_MSG_RECV_DMP);
-        #ifdef SUPPORT_DMP
+        // #ifdef SUPPORT_DMP
             set_dmp_china_mobile_factory_flag(msg_buffer);
-        #endif
+        // #endif
             break;
         case UDP_MSG_RECV_CAT1_SMS_CONTENT://接收单条短信内容
         case UDP_MSG_SMS:
index 1caf9c5..fe325e6 100644 (file)
@@ -433,7 +433,11 @@ bool chat_url_callback(ws_server_type_t type, char *url_buf, uint32_t url_size,
     } else {
         char device_id[128] = {0};
         get_cmai_dev_id(device_id);
+        #ifdef BOARD_N9
+        char *product_id = "1980099696668815362";
+        #else
         char *product_id = "1927646275585744898";
+        #endif
         
         // 根据全局AI类型选择不同的URL
         if (g_chat_ai_type == 1) { // AI_TYPE_JIU
index 8130443..93a348a 100644 (file)
@@ -323,7 +323,7 @@ namespace OHOS
             {ConfigDataType::DATATYPE_BOOL,    "classicbt_service_on",     "true"  },// CONFIGMODEL_ITEM_CLASSIC_BT_SERVICE_ON, //关机前经典蓝牙服务状态,启动时仍然恢复其当时状态
             {ConfigDataType::DATATYPE_INT,     "screen_brightness",         "155"    },//CONFIGMODEL_ITEM_SCREEN_BRIGHTNESS_VALUE,   //屏幕亮度
             {ConfigDataType::DATATYPE_INT,     "screenoff_timeout_value",    "5000"  },//CONFIGMODEL_ITEM_SCREEN_OFF_TIMEOUT_VALUE,   //屏幕自动息屏时间 默认 5秒 5000ms
-        #if defined(SUPPORT_CHINA_MOBILE_DMP) || defined(SUPPORT_A5133_SERVICE) //移动入库软件要求默认开启4G
+        #if defined(SUPPORT_CHINA_MOBILE_DMP) || defined(SUPPORT_A5133_SERVICE) ||  defined(SUPPORT_CHINA_MOBILE_AI_REGULATION)  //移动入库软件要求默认开启4G
             {ConfigDataType::DATATYPE_BOOL,    "cat1_service_on",          "true" },//CONFIGMODEL_ITEM_CAT1_SERVICE_ON, // 关机前Cat1 Service启动着,则重启仍然启动,反之亦然
         #else
             {ConfigDataType::DATATYPE_BOOL,    "cat1_service_on",          "false" },//CONFIGMODEL_ITEM_CAT1_SERVICE_ON, // 关机前Cat1 Service启动着,则重启仍然启动,反之亦然
@@ -410,6 +410,9 @@ namespace OHOS
             #elif defined(SUPPORT_CHINA_MOBILE_DMP)   //移动入库     
             {ConfigDataType::DATATYPE_INT,     "dmp_change_mode",              "2"           },//CONFIGMODEL_ITEM_DMP_CHANGE_MODE 入库切换模式 默认值 1
             {ConfigDataType::DATATYPE_INT,     "dmp_change_mode_old",       "2"           },//CONFIGMODEL_ITEM_DMP_CHANGE_MODE_OLD 默认值 1 要和新默认值一致
+            #elif defined(SUPPORT_CHINA_MOBILE_AI_REGULATION)   //移动入库   
+                {ConfigDataType::DATATYPE_INT,     "dmp_change_mode",          "3"           },//CONFIGMODEL_ITEM_DMP_CHANGE_MODE 入库切换模式 默认值 1
+            {ConfigDataType::DATATYPE_INT,     "dmp_change_mode_old",       "3"           },//CONFIGMODEL_ITEM_DMP_CHANGE_MODE_OLD 默认值 1 要和新默认值一致
             #else  //关闭入库功能
             {ConfigDataType::DATATYPE_INT,     "dmp_change_mode",              "0"           },//CONFIGMODEL_ITEM_DMP_CHANGE_MODE 入库切换模式 默认值 1
             {ConfigDataType::DATATYPE_INT,     "dmp_change_mode_old",       "0"           },//CONFIGMODEL_ITEM_DMP_CHANGE_MODE_OLD 默认值 1 要和新默认值一致
index 52ce2ba..c6dbc6d 100644 (file)
@@ -175,6 +175,19 @@ void cm_set_dmp_data_pass(const char *data_pass);
 size_t cm_get_dmp_data_pass(char *buf, size_t buf_size);
 
 
+int get_dmp_change_mode_old(void);
+
+int get_dmp_change_mode_toCat1(void);//获取切换模式TO CAT1
+
+void set_dmp_change_mode_old(uint8_t mode);//获取切换模式TO CAT1;
+
+void set_dmp_china_mobile_factory_flag(char *msg);
+
+int Get_Dmp_Factory_Status(void);
+
+bool get_volte_switch(void);//
+
+//设置factory状态
 #ifdef __cplusplus
 #if __cplusplus
 }
index 19822b9..c8e1706 100644 (file)
@@ -1657,6 +1657,23 @@ void cm_set_A2DP_switch(bool value)
     OHOS::ConfigModel::GetInstance()->set_condigData_Bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_A2DP,value);
 }
 
+int get_dmp_change_mode_old(void)//获取切换模式TO CAT1
+{
+    int state = OHOS::ConfigModel::GetInstance()->GetDmpChangeModeOld();
+    return state;
+}
+
+int get_dmp_change_mode_toCat1(void)//获取切换模式TO CAT1
+{
+    int state = OHOS::ConfigModel::GetInstance()->GetDmpChangeMode();
+    return state;
+}
+
+void set_dmp_change_mode_old(uint8_t mode)//获取切换模式TO CAT1
+{
+    OHOS::ConfigModel::GetInstance()->SetDmpChangeModeOld(mode);
+    return;
+}
 
 // stop play music
 void mmi_stop_music_play(void)
@@ -1729,7 +1746,23 @@ size_t cm_get_dmp_data_pass(char *buf, size_t buf_size)
     return copy_len;
 }
 
+void set_dmp_china_mobile_factory_flag(char *msg)//设置factory状态
+{
+    printf("set_dmp_china_mobile_factory_flag:%s\r\n",msg);
+    int state = atoi(msg);
+    OHOS::ConfigModel::GetInstance()->SetDmpFactoryStatus(state);
+}
 
+int Get_Dmp_Factory_Status(void)//设置factory状态
+{
+   return OHOS::ConfigModel::GetInstance()->GetDmpFactoryStatus();
+}
+
+bool get_volte_switch(void)//
+{
+    bool volte = OHOS::ConfigModel::GetInstance()->GetVoLTE_Call();
+    return volte;
+}
 
 #ifdef __cplusplus
 #if __cplusplus
index ec04cc5..c2734ab 100644 (file)
@@ -477,10 +477,17 @@ bool dmp_aut_active(void)//设备激活
     if(ret==200)
     {   
         dmp_read_dev_pass_save(out_buf);
+        cJSON_free(json_string);
+        return true;  
     }
+    else
+    {
+        cJSON_free(json_string);
+        return false;  
 
-    cJSON_free(json_string);
-    return true;  
+    }
+
+   
 
 }
 
@@ -495,16 +502,22 @@ bool dmp_aut_login(void)//登录
      time_t timestamp;
     timestamp = time(NULL);
 
-    if(timestamp - aut_login_time < 60 * 60 )
-    {
-        return true;
-    }
-
     char dev_pass[64]={0};  
     // 若内存中无 data_pass,则尝试从配置中加载
     if (strlen(data_pass) == 0) {
         (void)cm_get_dmp_data_pass(data_pass, sizeof(data_pass));
     }
+    if(strlen(data_pass) == 0)
+    {
+        if(dmp_aut_active())//设备激活
+        {
+            (void)cm_get_dmp_data_pass(data_pass, sizeof(data_pass));
+        }
+        else
+        {
+            return false;
+        }
+    }
     memcpy(dev_pass, data_pass, strlen(data_pass));
     printf("dev_sign_in 2");
     int count = 5;
index 215df74..d5521d3 100644 (file)
@@ -20,7 +20,7 @@ set(PUBLIC_HEADER
 # 公共宏定义(可选)
 set(PUBLIC_DEFINES
     # 例如:IMSL_LN_ENABLE=1
-    ENABLE_VAD_SERVER=0
+    ENABLE_VAD_SERVER=1
 )
 
 # 根据 MINI_MP3 宏添加 MP3 解码支持
index 1b5e272..a9ef0dd 100644 (file)
@@ -127,6 +127,7 @@ static void vad_mp3_pcm_callback(const int16_t *pcm_data, int samples, int chann
 }
 #endif
 
+static uint8_t dmp_auth=0;
 /**
  * @brief 处理 PCM 数据,直接送给 VAD(简化版)
  * @note VAD 库支持可变长度输入(推荐 < 100ms),无需固定切分
@@ -140,6 +141,35 @@ static errcode_t vad_process_pcm_data(const int16_t *pcm_data, size_t sample_cou
     }
     
     pcm_call_count++;
+
+    LOGIN_SUCC:
+
+    if(dmp_auth==0)
+    {
+        char dmp_token[64];
+        if(dmp_read_dev_token(dmp_token))
+        {
+            struct AuthInfo auth_info;
+            strcpy(auth_info.dmp_token, dmp_token);
+            int ret =auth_vad(&auth_info);
+            printf("vad_process_pcm_data %d\r\n",ret);
+            dmp_auth=1;
+        }
+        else
+        {
+            if(dmp_aut_login())
+            {
+                goto LOGIN_SUCC;
+            }
+            else
+            {
+                 return ERRCODE_FAIL;
+            }
+        }  
+    }
+
+
+
     
     /* 检查数据长度是否合理(VAD 推荐 < 100ms)*/
     const size_t MAX_SAMPLES_PER_CALL = 1600;  // 100ms @ 16kHz
index d3d362d..8c51528 100644 (file)
@@ -857,6 +857,7 @@ static void ai_binary_message_handler(const uint8_t *raw_data, uint32_t timestam
     
     // 记录接收数据的时间
     g_last_binary_data_tick = osKernelGetTickCount();
+    g_vad_cooldown_active = false;
     
     if (!is_chat_id_matched() && g_audio_playback_active) {
         LN_WS_WARN("Chat ID not matched\n");
index d2e8787..3929090 100644 (file)
@@ -1195,7 +1195,11 @@ void Get_AI_DEV_ID_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalDat
 
         cJSON *dataJSON = cJSON_CreateObject();
         cJSON_AddStringToObject(dataJSON,"device_id",device_id);
+        #ifdef BOARD_N9
+        cJSON_AddStringToObject(dataJSON,"product_id","1980099696668815362");
+        #else
         cJSON_AddStringToObject(dataJSON,"product_id","1927646275585744898");
+        #endif
         char *json_format = cJSON_PrintUnformatted(dataJSON);
         cJSON_Delete(dataJSON);
 
index 63b6202..1435c69 100644 (file)
@@ -2029,13 +2029,16 @@ errcode_t uapi_get_buildversion(uint8_t *para, uint32_t para_len)
  (void)sprintf_s(str, VER_STR_MAX, "V%s",
                     get_version_string());
 
+
 #else
 
             #if defined(SUPPORT_TELECOM_DMP)
             #if defined(SUPPORT_CHINA_MOBILE_DMP)
-            #error  SUPPORT_TELECOM_DMP  SUPPORT_CHINA_MOBILE_DMP Cannot define at same time!
+            #error  SUPPORT_TELECOM_DMP  SUPPORT_CHINA_MOBILE_DMP SUPPORT_CHINA_MOBILE_AI_REGULATION Cannot define at same time!
             #endif
             (void)sprintf_s(str, VER_STR_MAX, "V%s_%s_CT",
+            #elif defined(SUPPORT_CHINA_MOBILE_AI_REGULATION)
+            (void)sprintf_s(str, VER_STR_MAX, "V%s_%s_CM_AI",
             #elif defined(SUPPORT_CHINA_MOBILE_DMP)          
             (void)sprintf_s(str, VER_STR_MAX, "V%s_%s_CM",
             #else