增加血压数据协议上传 1909/1 1909/head 1910/target/1 1911/target/1
authorpenglei <1624952103@qq.com>
Tue, 1 Jul 2025 08:50:13 +0000 (16:50 +0800)
committerpenglei <1624952103@qq.com>
Tue, 1 Jul 2025 08:50:13 +0000 (16:50 +0800)
31 files changed:
code/sdk/application/brandy/brandy_standard/service_init.c
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/fd230app/nativeui/producttest/src/testPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/producttest/src/testView.cpp
code/sdk/application/wearable/fd230app/nativeui/producttest/src/testcat1.cpp
code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c
code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h
code/sdk/drivers/peripheral/bp/bn02/bn02.c
code/sdk/drivers/peripheral/bp/bn02/bn02.h
code/sdk/drivers/peripheral/bp/service/bp_at_cmd.c
code/sdk/drivers/peripheral/bp/service/bp_ble_service.c
code/sdk/drivers/peripheral/bp/service/bp_ble_service.h
code/sdk/drivers/peripheral/bp/service/bp_service.c
code/sdk/drivers/peripheral/bp/service/bp_service.h
code/sdk/drivers/peripheral/bp/service/bp_tcp_server.c
code/sdk/drivers/peripheral/bp/service/bp_tcp_server.h
code/sdk/drivers/peripheral/config/include/ConfigModelC.h
code/sdk/drivers/peripheral/config/src/ConfigModel.cpp
code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h
code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h
code/sdk/drivers/peripheral/cywee/service/cywee_service.c
code/sdk/drivers/peripheral/cywee/src/main_dml.c
code/sdk/drivers/peripheral/ppg/hal/ppg_hal.c
code/sdk/drivers/peripheral/ppg/pah8009/CMakeLists.txt
code/sdk/drivers/peripheral/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c
code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah800x_main.c
code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah_800x_config.h
code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp
code/sdk/drivers/peripheral/utils/custom_runtime.c
code/sdk/drivers/peripheral/utils/custom_save_runtime.c
code/sdk/drivers/peripheral/utils/custom_utils.c

index d6ce281..cd96528 100755 (executable)
@@ -72,6 +72,9 @@
 #ifdef SUPPORT_AT_CAT1\r
 #include "cat1_at_cmd.h"\r
 #endif\r
+#ifdef SUPPORT_AT_BP\r
+#include "bp_at_cmd.h"\r
+#endif\r
 \r
 #include "log_file.h"\r
 #ifdef CONFIG_OTA_UPDATE_SUPPORT\r
@@ -170,6 +173,11 @@ static void register_at_service(void)
     at_cmd_table_t *rtc_table = get_rtc_cmd_table(&rtc_cmd_count);\r
     at_cmd_add_moudle(rtc_table, rtc_cmd_count);\r
 #endif\r
+#ifdef SUPPORT_AT_BP\r
+    uint32_t bp_cmd_count;\r
+    at_cmd_table_t *bp_table = get_bp_cmd_table(&bp_cmd_count);\r
+    at_cmd_add_moudle(bp_table, bp_cmd_count);\r
+#endif\r
 }\r
 \r
 #ifdef CONFIG_OTA_UPDATE_SUPPORT\r
index dbded9e..5d9ba25 100755 (executable)
@@ -512,15 +512,7 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
     uapi_Ai_send_service_init();\r
     \r
 #ifdef ENABLE_CUSTOM_I2C\r
-\r
     custom_i2c_init(I2C_BUS_2);\r
-\r
-#ifdef ENABLE_BN02\r
-    // custom_i2c_init(I2C_BUS_0);\r
-    // uapi_bp_service_init();\r
-    // uapi_bp_tcp_server_init();\r
-#endif\r
-\r
     #ifdef ROTARYENCODER_MIXO\r
         uapi_mixo_service_init();\r
     #endif\r
@@ -537,6 +529,11 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
         uapi_cywee_service_init();\r
     #endif \r
 \r
+    #ifdef ENABLE_BN02\r
+        custom_i2c_init(I2C_BUS_0);\r
+        uapi_bp_service_init();\r
+        uapi_bp_tcp_server_init();\r
+    #endif\r
 #endif\r
 \r
 #ifdef ENABLE_GYRO\r
index aa56fc4..970d02f 100644 (file)
@@ -286,8 +286,7 @@ namespace OHOS
         }\r
         if(strcmp(view.GetViewId(),"start") == 0)\r
         { \r
-            if(uapi_dev_runtime_get_cat1_powerstat())\r
-                uapi_set4GCapability(false);\r
+            uapi_set4GCapability(false);\r
             #ifdef FD230\r
                 factorytest_start_aging_test();\r
             #endif\r
index 23b1757..e5b8e14 100644 (file)
@@ -916,8 +916,7 @@ namespace OHOS
          }  \r
         display_api->set_auto_timeout_function(false);\r
 \r
-        if(!uapi_dev_runtime_get_factory_test_status_flag())\r
-            uapi_set4GCapability(true);\r
+        uapi_set4GCapability(true);\r
 \r
         start_custom_ble_service();\r
     }\r
index a0ff0cd..f6d47e6 100644 (file)
@@ -275,9 +275,7 @@ namespace OHOS
         }
         testcat1ScrollView->Add(label_1_cat1vison_1);
 
-
-
-        power_on_cat1();
+        uapi_set4GCapability(true);
 
         cat1_getsignal();
         cat1_getver();
index 48ba468..a709153 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-17 14:31:08\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-06-13 16:15:04\r
+ * @LastEditTime: 2025-07-01 16:30:09\r
  * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
  * @Description: \r
  * \r
@@ -2217,7 +2217,12 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size)
 \r
             }\r
             \r
-         }else{\r
+        }else if(header.header == BLE_TEST_BN02_HEADER)\r
+        {\r
+#ifdef ENABLE_BN02\r
+            bn02_parse_frame(buf,event_size);\r
+#endif\r
+        }else{\r
             printf("crc error!\r\n");\r
             return ERRCODE_FAIL;\r
         }\r
index 3a5d7ad..a2d2747 100644 (file)
@@ -43,7 +43,7 @@ extern "C" {
 // 3、大端模式。
 // 4、长耗时命令,先确认收到,执行完再返回结果。
 #define BLE_TEST_PROTOCOL_HEADER 0xFD
-
+#define BLE_TEST_BN02_HEADER 0x55
 
 //公共模式 子模式ID  模式切换
 #define BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE 0x01
index 11a95ef..7cbd15c 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2025-01-16 12:35:15\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-06-12 16:37:28\r
+ * @LastEditTime: 2025-07-01 15:17:47\r
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
 \r
 #define BN02_FILE "user/userdata/bn02.bin"\r
 \r
+#define MAX_CNT 48 * 5 * 60\r
+\r
 static int DATA_HANDLE = 1 << 24;\r
 \r
 static FILE *fp = NULL;\r
 \r
 static int data_cnt = 0;\r
+\r
+static uint8_t *bn02_data = NULL;\r
 // static int data[16 * 5 * 60] = {0};\r
 \r
 // int data = ((rxByte[i] & 0xff) << 16)\r
@@ -44,6 +48,7 @@ static int data_cnt = 0;
 // 其中:DATA_HANDLE = 2^24\r
 \r
 \r
+\r
 bool Bn02_write_reg(uint8_t data)\r
 {\r
        uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
@@ -157,30 +162,63 @@ void bn02_int_handle(void)
                if (reply_data[cnt] >= DATA_HANDLE / 2)\r
                        reply_data[cnt] -= DATA_HANDLE;\r
 \r
-               printf("111data[%d]:%d\n",cnt,reply_data[cnt]);\r
+               // printf("data[%d]:%d\n",cnt,reply_data[cnt]);\r
                // printf("0x%x 0x%x 0x%x 0x%x\n",i,bn02_buf[i],bn02_buf[i+1],bn02_buf[i+2],reply_data[cnt]);\r
        }\r
 \r
-    // if(bn02_get_ble_status())\r
-    // {\r
-    //     bn02_replymsg(reply_data,cnt,1);\r
-    // }\r
+       do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_DATA_UPLOAD,(void *)reply_data,cnt);\r
+\r
+       if(bn02_data && fp)\r
+       {\r
+               if(data_cnt >= MAX_CNT)\r
+               {\r
+                       if(fwrite(bn02_data,1,data_cnt,fp) != cnt)\r
+                               printf("bn02 fwrite failed\n");\r
+                       else\r
+                       {\r
+                               printf("bn02 fwrite succed data_cnt:%d\n",cnt);\r
+                               data_cnt = 0;\r
+                               memset(bn02_data,0,MAX_CNT);\r
+                       }\r
+\r
+               }\r
+               else\r
+               {\r
+                       printf("data_cnt:%d\n",data_cnt);\r
+                       memcpy_s(bn02_data + data_cnt,MAX_CNT - data_cnt,bn02_buf,48);\r
+\r
+                       // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)\r
+                       // {\r
+                       //     printf("222data[%d]:%d\n",i,tcp_data[i]);\r
+                       // }\r
+\r
+                       data_cnt += 48;\r
+               }\r
+       }\r
+\r
+       if(bn02_get_ble_status())\r
+               bn02_replymsg(bn02_buf,48,1);\r
 \r
        // if(fp)\r
        // {\r
-       //      data_cnt += cnt;\r
-       //      if(fwrite(bn02_buf,sizeof(int),cnt,fp) != cnt)\r
-       //              printf("bn02 fwrite failed\n");\r
+       //      if(data_cnt >= 16 * 5 * 60)\r
+       //      {\r
+\r
+       //      }\r
        //      else\r
-       //              printf("bn02 fwrite succed data_cnt:%d\n",cnt);\r
+       //      {\r
+       //              data_cnt += cnt;\r
+       //              if(fwrite(bn02_buf,sizeof(int),cnt,fp) != cnt)\r
+       //                      printf("bn02 fwrite failed\n");\r
+       //              else\r
+       //                      printf("bn02 fwrite succed data_cnt:%d\n",cnt);\r
+       //      }\r
+\r
        // }\r
 \r
 \r
        // printf("data_cnt:%d\n",data_cnt);\r
 \r
-       \r
-       do_bp_tcp_server_send_data((void *)reply_data,cnt);\r
-\r
        // if(data_cnt >= 16 * 5 * 60 && fp)\r
        // {\r
        //      int *data_array  = (int *)malloc(data_cnt * sizeof(int));\r
@@ -237,12 +275,22 @@ void bn02_start(void)
        Bn02_Power_Ctrl(1);\r
        bn02_int_init();\r
        Bn02_write_reg(BN02_START_CMD);\r
-       // data_cnt = 0;\r
-       // fp = fopen(BN02_FILE, "ab+");\r
-       // if(fp == NULL)\r
-       //      printf("open %s failed\n",BN02_FILE);\r
-       // else\r
-       //      printf("open %s succed\n",BN02_FILE);\r
+#if 0\r
+       if(bn02_data == NULL)\r
+       {\r
+               bn02_data = malloc(MAX_CNT);\r
+               if(bn02_data == NULL)\r
+                       printf("bn02_data malloc failed\n");\r
+       }\r
+\r
+       data_cnt = 0;\r
+       \r
+       fp = fopen(BN02_FILE, "ab+");\r
+       if(fp == NULL)\r
+               printf("open %s failed\n",BN02_FILE);\r
+       else\r
+               printf("open %s succed\n",BN02_FILE);\r
+#endif\r
 }\r
 \r
 void bn02_stop(void)\r
@@ -251,10 +299,18 @@ void bn02_stop(void)
        Bn02_write_reg(BN02_STOP_CMD);\r
        Bn02_Power_Ctrl(0);\r
 \r
-       bp_tcp_data_clean();\r
-       // if(fp)\r
-       // {\r
-       //      fclose(fp);\r
-       //      fp = NULL;\r
-       // }\r
+       // do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0);\r
+\r
+#if 0\r
+       if(fp != NULL)\r
+       {\r
+               fclose(fp);\r
+               fp = NULL;\r
+       }\r
+       if(bn02_data != NULL)\r
+       {\r
+               free(bn02_data);\r
+               bn02_data = NULL;\r
+       }\r
+#endif\r
 }\r
index c4216a9..497af30 100644 (file)
@@ -2,30 +2,18 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2025-01-16 12:35:15\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-16 14:55:48\r
+ * @LastEditTime: 2025-06-20 15:41:34\r
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.h\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
 #ifndef _BN02_H_\r
 #define _BN02_H_\r
 \r
-enum\r
-{\r
-\r
-       BN02_INT_HANDLE,\r
-       BN02_INIT_ENABLE,\r
-       BN02_START,\r
-       BN02_POWER_DISABLE,\r
-       BN02_STOP,\r
-};\r
-\r
 #define BN02_START_CMD  0x04\r
 #define BN02_STOP_CMD   0x08\r
 \r
 void bn02_int_handle(void);\r
-\r
 void bn02_start(void);\r
-\r
 void bn02_stop(void);\r
 \r
 #endif // _HRS3300_H_\r
index f9771b4..14ec573 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-23 15:11:01
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-16 18:02:23
+ * @LastEditTime: 2025-06-25 11:03:03
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/HP4570/service/bp_at_cmd.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -73,7 +73,7 @@ static uint32_t bn02_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
         //     PRINT("SKIP bptest start, already start\r\n");
         //     return 0;
         // }
-        do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
+        bp_start();
         g_bp_test_started = 1;
     }else if (start == 2){
         // if (g_bp_test_started == 0) 
@@ -81,7 +81,7 @@ static uint32_t bn02_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
         //     PRINT("SKIP bptest stop, already stopped\r\n");
         //     return 0;
         // }
-        do_bp_service_check_msg(BP_SERVICE_CMD_STOP_CHECK);
+        bp_stop();
         g_bp_test_started = 0 ;
     }else if (start == 3){
         // if (g_bp_test_started == 0) 
@@ -95,8 +95,40 @@ static uint32_t bn02_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
     }
     return ERRCODE_SUCC;
 }
+
+static uint32_t bp_sign(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+
+    tcp_sign_up();
+    
+    return ERRCODE_SUCC;
+}
+
+static uint32_t bp_get_active_code(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+
+    get_active_code();
+    
+    return ERRCODE_SUCC;
+}
+
+static uint32_t bp_login(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+
+    bp_tcp_login();
+    
+    return ERRCODE_SUCC;
+}
+
+
 static const at_cmd_table_t g_bp_cmd[] = {
     { (char *)"AT^BN02TEST",      bn02_test, (char *)"1" },
+    { (char *)"AT^BPSIGN",      bp_sign, (char *)"1" },
+    { (char *)"AT^BPACTIVE",      bp_get_active_code, (char *)"1" },
+    { (char *)"AT^BPLOGIN",      bp_login, (char *)"1" },
 };
 
 at_cmd_table_t *get_bp_cmd_table(uint32_t *cmd_count)
index 995dd8b..abb388e 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-02-14 10:30:21
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-05-26 15:39:37
+ * @LastEditTime: 2025-06-30 09:29:50
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -19,6 +19,7 @@
 
 static uint8_t ble_status = 0;
 
+#pragma pack(1)
 typedef struct ble_bp_data_t
 {
     uint8_t start_code; //0x55
@@ -29,7 +30,7 @@ typedef struct ble_bp_data_t
     uint8_t* data;
     uint8_t checksum; //验内容包括起始符、功能码、数据长度、标识、数据5个部分,取其和的最后8位作为校验和
 }ble_bp_data_t;
-
+#pragma pack()
 
 static ble_bp_data_t ble_bp_data = {0};
 
@@ -43,26 +44,32 @@ uint8_t bn02_calculate_checksum(ble_bp_data_t frame)
 {
     uint8_t checksum = 0;
     
+    // 1. 累加起始符
     checksum += frame.start_code;
     
+    // 2. 累加功能码
     checksum += frame.main_func_code;
     checksum += frame.sub_func_code;
     
+    // 3. 累加数据长度(2字节)
     checksum += (frame.data_length >> 8) & 0xFF; // 高字节
     checksum += frame.data_length & 0xFF;        // 低字节
     
+    // 4. 累加标识(2字节)
     checksum += (frame.flags >> 8) & 0xFF;       // 高字节
     checksum += frame.flags & 0xFF;              // 低字节
     
-
-    for (uint16_t i = 0; i < (frame.data_length - 2); i++) {
-        checksum += frame.data[i];
+    // 5. 累加数据部分(关键修正!)
+    // 数据部分的实际字节数 = 数据长度 - 标识长度(2B)
+    uint16_t data_bytes = frame.data_length - 2;
+    
+    // 按字节访问数据(强制转换为 uint8_t* 确保每次访问1字节)
+    for (uint16_t i = 0; i < data_bytes; i++) {
+        checksum += ((uint8_t*)frame.data)[i];
     }
-
-    checksum &= 0xFF;
     
-    // printf("checksum : 0x%x\n", checksum);
-    return checksum;
+    // 返回低8位
+    return checksum & 0xFF;
 }
 
 errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
@@ -76,25 +83,36 @@ errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
         ble_bp_data.sub_func_code = buf[2];
         ble_bp_data.data_length = (buf[3] << 8) + buf[4];
         ble_bp_data.flags = (buf[5] << 8) + buf[6];
+        
         ble_bp_data.data = &buf[7];
+        // if(buf[7] == 0)
+        // {
+        //     ble_bp_data.data = &tmp;
+        // }
+
+        // else if(buf[7] == 1)
+        // {
+        //     ble_bp_data.data = &tmp;
+        // }
 
-        // printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x, data : 0x%x\n",
-        // ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags,*ble_bp_data.data);
+
+
+        printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x, data : 0x%x\n",
+        ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags,*ble_bp_data.data);
 
         if(buf[8] != bn02_calculate_checksum(ble_bp_data))
             return ERRCODE_FAIL;
 
         ble_bp_data.sub_func_code += 0x80;
 
-        if(!(*ble_bp_data.data))
+        if(buf[7] == 0)
         {
-            do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
+            bp_start();
             ble_status = 1;
         }
-
-        else
+        else if(buf[7] == 1)
         {   
-            do_bp_service_check_msg(BP_SERVICE_CMD_STOP_CHECK);
+            bp_stop();
             ble_status = 0;
         }   
 
@@ -110,12 +128,19 @@ errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
 
 errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags)
 {
+    if(input_data == NULL || input_len == 0)
+        return ERRCODE_FAIL;
+
     errcode_t ret;
     ble_bp_data.data = input_data;
     ble_bp_data.data_length = input_len + 2;
 
-    if((ble_bp_data.flags & 0x3FFF) < (1 << 14)) 
-        ble_bp_data.flags++;
+    uint16_t current_seq = ble_bp_data.flags & 0x1FFF;  // 仅保留低13位
+    if (current_seq < (1 << 13) - 1) {                 // 避免溢出
+        ble_bp_data.flags = (ble_bp_data.flags & 0xE000) | (current_seq + 1);
+    } else {
+        ble_bp_data.flags = (ble_bp_data.flags & 0xE000) | 0;  // 重置为0
+    }
 
     if(flags) 
     {
@@ -124,15 +149,57 @@ errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags)
 
     ble_bp_data.checksum = bn02_calculate_checksum(ble_bp_data);
 
-    // printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x check_sum : 0x%x\n",
-    // ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags,ble_bp_data.checksum);
+    // printf("start_code : 0x%x, main_func_code : 0x%x, sub_func_code : 0x%x, data_length : 0x%x, flags : 0x%x\n",
+    // ble_bp_data.start_code,ble_bp_data.main_func_code,ble_bp_data.sub_func_code,ble_bp_data.data_length,ble_bp_data.flags);
+
+    // ble_bp_data.data = (int *)malloc(input_len * sizeof(int));
+    // if(ble_bp_data.data == NULL)
+    //     return -1;
+
+    // memcpy_s(ble_bp_data.data,input_len * sizeof(int),input_data,input_len * sizeof(int));
 
-    // for(int i = 0;i<48;i++)
+    // for(int i = 0;i<input_len;i++)
        // {
-       //      printf("reply:[%d]= 0x%x\n",i,ble_bp_data.data[i]);
+    //     if(i == input_len - 1)
+    //         printf("%d",ble_bp_data.data[i]);
+    //     else
+    //         printf("%d,",ble_bp_data.data[i]);
        // }
+    // printf("\n");
+    // printf("check_sum : 0x%x\n",ble_bp_data.checksum);
+    // printf("ble_bp_data:%d\n",sizeof(ble_bp_data));
+
+
+    // 分配缓冲区并按协议顺序组装数据
+    uint8_t* buffer = (uint8_t*)malloc(8 + input_len);
+    if (!buffer) return -1;
+
+    uint8_t* p = buffer;
+    *p++ = ble_bp_data.start_code;
+    *p++ = ble_bp_data.main_func_code;
+    *p++ = ble_bp_data.sub_func_code;
+
+    // 按大端序写入多字节字段
+    *p++ = (ble_bp_data.data_length >> 8) & 0xFF;
+    *p++ = ble_bp_data.data_length & 0xFF;
+    *p++ = (ble_bp_data.flags >> 8) & 0xFF;
+    *p++ = ble_bp_data.flags & 0xFF;
+
+    // 复制数据部分
+    memcpy(p, ble_bp_data.data, ble_bp_data.data_length - 2);
+    p += ble_bp_data.data_length - 2;
+
+    *p = ble_bp_data.checksum;  // 添加校验和
+    // printf("input_len:%d\n",input_len);
+    ret = ble_factorytest_server_send_input_report(buffer,8 + input_len);
+    // if(ble_bp_data.data == NULL)
+    // {
+    //     free(ble_bp_data.data);
+    //     ble_bp_data.data = NULL;
+    // }
+
+    free(buffer);
 
-    ret = ble_factorytest_server_send_input_report((uint8_t *)&ble_bp_data,sizeof(ble_bp_data));
     // printf("ret : 0x%x \n",ret);
     return ret;
 }
index ace1004..382779e 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-02-14 10:30:32
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-02-14 11:35:06
+ * @LastEditTime: 2025-06-27 18:30:31
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
index e8bf086..caf0f87 100644 (file)
@@ -122,6 +122,41 @@ void bp_int_callback(pin_t pin, uintptr_t param)
     do_bp_service_check_msg(BP_SERVICE_CMD_TIMER_CHECK);
 }
 
+static uint32_t begin_time = 0;
+static uint32_t end_time = 0;
+
+void bp_get_measure_time(uint32_t *b_time,uint32_t *e_time)
+{
+       if(b_time == NULL || e_time == NULL)
+               return;
+
+       *b_time = begin_time;
+       *e_time = end_time;
+}
+
+void bp_start(void)
+{
+    if(uapi_dev_runtime_get_bp_status_flag())
+       {
+               printf("bp service already started!\n");
+        return;
+       }
+    uapi_dev_runtime_set_bp_status(1);
+    do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
+    uapi_get_timestampe_ss(&begin_time);
+}
+
+void bp_stop(void)
+{
+    if(!uapi_dev_runtime_get_bp_status_flag())
+       {
+               printf("bp service already stop!\n");
+        return;
+       }
+    uapi_dev_runtime_set_bp_status(0);
+    do_bp_service_check_msg(BP_SERVICE_CMD_STOP_CHECK);
+    uapi_get_timestampe_ss(&end_time);
+}
 // void bp_service_service_resume(void)
 // {
 //     MMC_LOG("bp_service_service resume!\r\n");
index ba02c9a..028050f 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-23 15:11:01
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-16 17:39:43
+ * @LastEditTime: 2025-06-25 11:04:44
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/charge/HP4570/service/charge_service.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -34,6 +34,10 @@ extern "C" {
 errcode_t uapi_bp_service_init(void);
 void bp_int_callback(pin_t pin, uintptr_t param);
 
+void bp_start(void);
+void bp_stop(void);
+void bp_get_measure_time(uint32_t *b_time,uint32_t *e_time);
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index fc8fd94..cbabd1a 100644 (file)
 #include "custom_utils.h"
 #include "bp_tcp_server.h"
 #include "custom_runtime.h"
-// #include "custom_runtime.h"
-/***
- * 其他cmd在Header里定义,对外开放
-*/
+#include <dirent.h>
+#include "lwip/ip.h"
+#include "lwip/netif.h"
+#include "lwip/init.h"
+#include "lwip/inet_chksum.h"
 
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include <lwip/netdb.h>
+// #include <netinet/in.h>
+#include "lwip/inet.h"
+#include "lwip/ip_addr.h"
+#include "pm_definition.h"
+#include "mbedtls/md5.h"
+#include "mbedtls/base64.h"
+#include "cJSON.h"
+
+#define BID "hu4kZYyYMGO"
+#define KEY "tcUpJpeGpsIBXvjG"
+
+#define SERVER_HOST "iot.socket.thisiot.com"
+#define SERVER_PORT 9999
+// 6a0f3a4f7a5f1d9a4b7b8e5c6d7a8f9b
+// 89b67780ac2e2d554f25df8acfabae4f
 #define APP_KEY "d8d960b748738c2f29c676baa3f5be64"
-#define NAME "W9"
+#define NAME "海思鸿蒙血压手表"
 #define URL_HEADER "https://test.aicaring.com/api/v0"
 
-#define MAX_CNT 16 * 5 * 60
-static unsigned long g_app_queue= 0xFFFFFFFF;
+#define LOGIN_URL "/entrance/user/login"
+#define ACTIVE_URL "/sinklib/activation"
+#define CREATE_URL "/health/synthesis/create"
+
+
+
+#define MAX_CNT 16 * 5 * 60
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static int *tcp_data = NULL;
+static int tcp_data_cnt = 0;
+
+static int g_listen_sock = -1;
+
+static uint8_t LK_STATUS = 0;
+
+static int bp_sbp = 0;
+static int bp_dbp = 0;
+
+static char *imei = NULL;
+
+//激活码 zzzm3K72zxRRLPX2utu5vMZcM269/8/7ZGOHVvONFt7WPAlQT++RJjzzrHj5v5DdlnmeELWI1FUPVJb96/5mOA==
+
+#define BP_ACTIVE_CODE_FILE "/user/system/bp_active_code.bin"
+#define BP_REQUEST_CODE_FILE "/user/system/bp_request_code.bin"
+#define BP_TOKEN_FILE "/user/system/bp_token.bin"
+
+
+
+struct bp_ipaddr_t
+{
+    osSemaphoreId_t dns_done_sem;
+    ip_addr_t  ip;
+};
+
+void bp_get_data(int *sbp,int *dbp)
+{
+    *sbp = bp_sbp;
+    *dbp = bp_dbp;
+    bp_sbp = 0;
+    bp_dbp = 0;
+}
+
+static void bp_save_request_code(char *reqeust_code,int len)
+{
+    if(reqeust_code == NULL || len == 0)
+        return;
+
+    FILE *file = fopen(BP_REQUEST_CODE_FILE, "w");
+    if (!file) 
+    {
+        printf("%s open failed\n",BP_REQUEST_CODE_FILE);
+        return;
+    }
+
+    size_t bytes_written = fwrite(reqeust_code, 1, len, file);
+    if (bytes_written != len) 
+        printf(" %s fwrite failed\n",BP_REQUEST_CODE_FILE);
+    else
+        printf("reqeust_code: %s fwrite succed\n",reqeust_code);
+
+    fclose(file);
+}
+
+static void bp_save_active_code(char *active_code,int len)
+{
+    if(active_code == NULL || len == 0)
+        return;
+
+    FILE *file = fopen(BP_ACTIVE_CODE_FILE, "w");
+    if (!file) 
+    {
+        printf("%s open failed\n",BP_ACTIVE_CODE_FILE);
+        return;
+    }
+
+    size_t bytes_written = fwrite(active_code, 1, len, file);
+    if (bytes_written != len) 
+        printf(" %s fwrite failed\n",BP_ACTIVE_CODE_FILE);
+    else
+        printf("active_code: %s fwrite succed\n",active_code);
+
+    fclose(file);
+}
+
+static void bp_get_active_code(char *active_code,int len)
+{
+    if (active_code == NULL || len == 0) 
+    {
+        printf("active_code is NULL or len == 0\n");
+        return;
+    }
+
+    char *buffer = (char *)malloc(len);
+    if(buffer == NULL)
+        return;
+
+    FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+    if (!file) 
+    {
+        printf("open failed: %s\n", BP_ACTIVE_CODE_FILE);
+        return;
+    }
+
+    // 初始化缓冲区
+    memset(buffer, 0, len);
+
+    // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+    size_t bytes_read = fread(buffer, 1, len - 1, file);
+    if (bytes_read > 0) 
+    {
+        buffer[bytes_read] = '\0';
+        printf("active code: %s\n", buffer);
+    } else
+        printf("read active code failed\n");
+
+    memcpy_s(active_code,bytes_read,buffer,bytes_read);
+
+    free(buffer);
+    fclose(file);
+}
+
+static void bp_get_request_code(char *request_code,int len)
+{
+    if (request_code == NULL || len == 0) 
+    {
+        printf("request_code is NULL or len == 0\n");
+        return;
+    }
+
+    char *buffer = (char *)malloc(len);
+    if(buffer == NULL)
+        return;
+
+    FILE *file = fopen(BP_REQUEST_CODE_FILE, "r");
+    if (!file) 
+    {
+        printf("open failed: %s\n", BP_REQUEST_CODE_FILE);
+        return;
+    }
+
+    // 初始化缓冲区
+    memset(buffer, 0, len);
+
+    // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+    size_t bytes_read = fread(buffer, 1, len - 1, file);
+    if (bytes_read > 0) 
+    {
+        buffer[bytes_read] = '\0';
+        printf("active code: %s\n", buffer);
+    } else
+        printf("read active code failed\n");
+
+    memcpy_s(request_code,bytes_read,buffer,bytes_read);
+
+    free(buffer);
+    fclose(file);
+}
+
+static void bp_get_token(char *token,int len)
+{
+    if (token == NULL || len == 0) 
+    {
+        printf("token is NULL or len == 0\n");
+        return;
+    }
+
+    char *buffer = (char *)malloc(len);
+    if(buffer == NULL)
+        return;
+
+    FILE *file = fopen(BP_TOKEN_FILE, "r");
+    if (!file) 
+    {
+        printf("open failed: %s\n", BP_TOKEN_FILE);
+        return;
+    }
+
+    // 初始化缓冲区
+    memset(buffer, 0, len);
+
+    // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+    size_t bytes_read = fread(buffer, 1, len - 1, file);
+    if (bytes_read > 0) 
+    {
+        buffer[bytes_read] = '\0';
+        printf("token: %s\n", buffer);
+    } else
+        printf("read token failed\n");
+
+    memcpy_s(token,bytes_read,buffer,bytes_read);
+
+    free(buffer);
+    fclose(file);
+}
+
+static void bp_save_token(char *token,int len)
+{
+    if(token == NULL || len == 0)
+        return;
+
+    FILE *file = fopen(BP_TOKEN_FILE, "w");
+    if (!file) 
+    {
+        printf("%s open failed\n",BP_TOKEN_FILE);
+        return;
+    }
+
+    size_t bytes_written = fwrite(token, 1, len, file);
+    if (bytes_written != len) 
+        printf(" %s fwrite failed\n",BP_TOKEN_FILE);
+    else
+        printf("token: %s fwrite succed\n",token);
+
+    fclose(file);
+}
+
+static void dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) 
+{
+    struct bp_ipaddr_t *ip_sem = (struct bp_ipaddr_t *)arg;
+    char ip_str[20] = {0};
+    
+    // if (ipaddr == NULL) {
+    //     printf("DNS解析失败,IP地址为空\n");
+    //     (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+    //     return;
+    // }
+    
+    printf("hostname: %s, ", hostname);
+    
+    // 处理IPv4地址(现在ip4是包含addr成员的结构体)
+    if (IP_IS_V4(ipaddr)) {
+        u32_t ip_num = ipaddr->u_addr.ip4.addr;  // 直接获取32位地址
+        
+        // 分解为4字节打印
+        u8_t byte0 = (ip_num >> 24) & 0xFF;
+        u8_t byte1 = (ip_num >> 16) & 0xFF;
+        u8_t byte2 = (ip_num >> 8) & 0xFF;
+        u8_t byte3 = ip_num & 0xFF;
+        // printf("IPv4: %d.%d.%d.%d\n", byte0, byte1, byte2, byte3);
+        
+        // 转换为struct in_addr(已为网络字节序)
+        struct in_addr ipv4_addr;
+        ipv4_addr.s_addr = ip_num;
+        inet_ntop(AF_INET, &ipv4_addr, ip_str, sizeof(ip_str));
+        printf("ip: %s\n", ip_str);
+    }
+
+    // 复制IP地址到上下文
+    if(ipaddr->u_addr.ip4.addr != 0)
+        memcpy(&(ip_sem->ip), ipaddr, sizeof(ip_addr_t));
+    (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+}
+
+int tcp_socket_init(void) 
+{
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 0) {
+        uapi_pm_add_sleep_veto(PM_ID_CAT1);
+    }
+    
+    struct sockaddr_in server_addr;
+    struct bp_ipaddr_t ip_sem = {0};  // 定义信号量结构
+    int listen_socket = -1;
+    
+    // 创建信号量
+    ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
+
+    // 解析域名
+    dns_gethostbyname(SERVER_HOST, &(ip_sem.ip), dns_found, &ip_sem);
+
+    osSemaphoreAcquire(ip_sem.dns_done_sem, 1000 * 5);  // 等待 DNS 解析完成
+
+    memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4);
+    
+    // 创建套接字
+
+    listen_socket = socket(AF_INET, SOCK_STREAM, 0);
+    if(listen_socket < 0)
+    {
+        int err = errno;
+        printf("socket create errno: %d, reason: %s\n", err, strerror(err));
+        goto FAILED;
+    }
+    
+    
+    // 设置服务器地址
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_port = htons(SERVER_PORT);
+    
+    // 连接服务器
+    if (connect(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) 
+    {
+        printf("server_addr.sin_addr.s_addr:%d\n",server_addr.sin_addr.s_addr);
+        int err = errno;
+        printf("connect failed, errno: %d, reason: %s\n", err, strerror(err));
+        
+        goto FAILED;
+    }
+
+    
+    cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 1) {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+    
+    printf("socket init succed\n");
+    osSemaphoreDelete(ip_sem.dns_done_sem);  // 释放信号量
+
+    return listen_socket;
+    
+FAILED:
+    if (listen_socket >= 0) 
+    {
+        lwip_close(listen_socket);
+    }
+    if (ip_sem.dns_done_sem != NULL) 
+    {
+        osSemaphoreDelete(ip_sem.dns_done_sem);
+    }
+    cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (cnt == 1) 
+    {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+    return -1;
+}
+
+void tcp_recv_data_handler(const char *input, int input_len) 
+{
+    // 检查输入基本格式
+    if (input_len < 2 || input[0] != '[' || input[input_len-1] != ']') 
+    {
+        printf("解析失败: 格式错误(缺少方括号)\n");
+        return;
+    }
+    
+    // 移除首尾方括号
+    const char *data = input + 1;
+    size_t data_len = input_len - 2;
+    
+    // 查找逗号分隔符
+    const char *comma1 = memchr(data, ',', data_len);
+    const char *comma2 = comma1 ? memchr(comma1 + 1, ',', data_len - (comma1 - data + 1)) : NULL;
+    
+    // 解析头部字段(BID*IMEI*长度*指令)
+    const char *star1 = memchr(data, '*', data_len);
+    const char *star2 = star1 ? memchr(star1 + 1, '*', data_len - (star1 - data + 1)) : NULL;
+    const char *star3 = star2 ? memchr(star2 + 1, '*', data_len - (star2 - data + 1)) : NULL;
+    
+    if (!star1 || !star2 || !star3) 
+    {
+        printf("解析失败: 头部格式错误(缺少星号分隔符)\n");
+        return;
+    }
+    
+    // 提取头部各字段
+    const char *bid = data;
+    const char *imei = star1 + 1;
+    const char *len_str = star2 + 1;
+    const char *cmd = star3 + 1;
+    
+    size_t bid_len = star1 - data;
+    size_t imei_len = star2 - (star1 + 1);
+    size_t len_str_len = star3 - (star2 + 1);
+    size_t cmd_len = data_len - (star3 - data + 1);
+    
+    // 打印头部解析结果
+    // printf("BID: %.*s\n", (int)bid_len, bid);
+    // printf("IMEI: %.*s\n", (int)imei_len, imei);
+    // printf("内容长度: %.*s\n", (int)len_str_len, len_str);
+    // printf("指令: %.*s\n", (int)cmd_len, cmd);
+    
+    // 验证IMEI长度(假设为15位)
+    if (imei_len != 15) 
+    {
+        printf("解析失败: IMEI长度应为15位,实际: %zu位\n", imei_len);
+        return;
+    }
+    
+    // 解析内容长度(16进制转10进制)
+    uint32_t content_len = 0;
+    sscanf(len_str, "%x", &content_len);
+    printf("解析后的内容长度: %u\n", content_len);
+    
+    // 处理不同格式情况
+    if (comma1 && comma2) 
+    {
+        // 有两个逗号,完整格式
+        size_t status_len = comma2 - (comma1 + 1);
+        size_t base64_len = data_len - (comma2 - data + 1);
+        
+        printf("状态码: %.*s\n", (int)status_len, comma1 + 1);
+        
+        // 验证状态码
+        if (strncmp(comma1 + 1, "200", status_len) != 0) 
+        {
+            printf("解析失败: 状态码必须为200,实际: %.*s\n", (int)status_len, comma1 + 1);
+            return;
+        }
+        
+        // Base64解码
+        size_t decoded_len = (base64_len * 3) / 4 + 1;
+        unsigned char *decoded_data = malloc(decoded_len);
+        if (!decoded_data) 
+        {
+            printf("解析失败: 内存分配失败\n");
+            return;
+        }
+        
+        size_t actual_decoded_len = 0;
+        int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(comma2 + 1), base64_len);
+        
+        if (ret != 0)
+        {
+            printf("解析失败: Base64解码失败 (错误码: %d)\n", ret);
+            free(decoded_data);
+            return;
+        }
+        decoded_data[actual_decoded_len] = '\0';
+        
+        // 解析JSON数据
+        cJSON *json_data = cJSON_Parse((const char *)decoded_data);
+        free(decoded_data);
+        
+        if (!json_data) 
+        {
+            printf("解析失败: JSON解析失败,原始数据: %s\n", decoded_data);
+            return;
+        }
+        
+        // 打印JSON数据
+        printf("JSON数据: %s\n", cJSON_Print(json_data));
+        
+        // 提取关键JSON字段
+        cJSON *status = cJSON_GetObjectItem(json_data, "status");
+        cJSON *data_obj = cJSON_GetObjectItem(json_data, "data");
+        cJSON *activation_code = cJSON_GetObjectItem(data_obj, "activation_code");
+        cJSON *token = cJSON_GetObjectItem(data_obj, "token");
+        cJSON *sbp = cJSON_GetObjectItem(data_obj, "sbp");
+        cJSON *dbp = cJSON_GetObjectItem(data_obj, "dbp");
+        
+        if (status && cJSON_IsTrue(status) && data_obj) 
+        {
+            if (activation_code) 
+            {
+                printf("激活状态: 成功\n");
+                printf("激活码: %s\n", activation_code->valuestring);
+                bp_save_active_code(activation_code->valuestring, strlen(activation_code->valuestring));
+            }
+            if (token) 
+            {
+                printf("token: %s\n", token->valuestring);
+                bp_save_token(token->valuestring, strlen(token->valuestring));
+            }
+            
+            if (sbp && dbp) 
+            {
+                printf("sbp: %d\n", sbp->valueint);
+                bp_sbp = sbp->valueint;
+
+                printf("dbp: %d\n", dbp->valueint);
+                bp_dbp = dbp->valueint;
+
+                if (g_listen_sock >= 0) 
+                {
+                    lwip_close(g_listen_sock);
+                    g_listen_sock = -1;
+                    LK_STATUS = 0;
+                }
+
+            }
+        }
+        else 
+        {
+            cJSON *error_code = cJSON_GetObjectItem(json_data, "error_code");
+            cJSON *error_msg = cJSON_GetObjectItem(json_data, "error_message");
+            printf("激活状态: 失败\n");
+            printf("错误码: %s\n", error_code ? error_code->valuestring : "未知");
+            printf("错误信息: %s\n", error_msg ? error_msg->valuestring : "未知");
+        }
+        
+        cJSON_Delete(json_data);
+    } 
+    else 
+    {
+        // 无逗号或只有一个逗号,仅处理指令
+        // printf("格式: 仅指令,无状态码和Base64内容\n");
+        printf("指令处理: %.*s\n", (int)cmd_len, cmd);
+        
+        // 这里可以添加仅处理指令的逻辑
+        // bp_handle_command(cmd, cmd_len);  // 假设存在指令处理函数
+        if(strstr(cmd,"LK") != NULL)
+        {
+            printf("LK succed\n");
+            LK_STATUS = 1;
+        }
+
+    }
+}
+
+       
+int tcp_send(int listen_socket, const char *data, size_t size)
+{
+    if (data == NULL || size == 0)
+        return -1;
+
+    uint8_t retry = 0;
+    while(listen_socket < 0 && retry < 5)
+    {
+        retry++;
+        LOS_Msleep(2000);
+    }
+
+    if(listen_socket < 0)
+        return -1;
+
+    int ret = 0;
+
+    // const char *buffer = (const char *)data;
+    const char *buffer = (const char *)malloc(size);
+    if(buffer == NULL)
+        return -1;
+        
+    memcpy_s(buffer,size,(const char *)data,size);
+    // printf("size : %d\n",size);
+    // printf("strlen(buffer) : %d\n",strlen(buffer));
+    // printf("buffer : %s\n",buffer);
+
+    size_t total_sent = 0;
+
+    while (total_sent < size)
+    {
+        ssize_t sent = send(listen_socket, buffer + total_sent, size - total_sent, 0);
+        if (sent < 0) {
+            printf("errno : %d\n",errno);
+            // 处理错误情况
+            if (errno == EINTR) {
+                PRINT("被信号中断,继续尝试\n");
+                ret = -1;
+                continue;
+            } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+                PRINT("非阻塞模式下暂时无法发送,可选择等待或返回\n"); 
+                ret = -1;
+                goto FAILED;
+            } else if (errno == ENETUNREACH) {
+                PRINT("网络不可达,检查路由或远程主机状态\n");
+                ret = -1;
+                goto FAILED;
+            }
+            else {
+                PRINT("其他错误(如连接断开)\n"); 
+                ret = -1;
+                goto FAILED;
+            }
+        }
+        
+        total_sent += sent;
+    }
+    printf("tcp send succed size : %d\n",total_sent);
+    ret = 0;
+FAILED:
+
+    if(buffer != NULL)
+    {
+        free(buffer);
+        buffer = NULL;
+    }
+    return ret;
+}
+
+static int active_md5_sign(const char *data,int data_len,char*md5_str)
+{
+    char md5_buf[16]={0};
+
+    char *code_str = (const char*)malloc(data_len);
+    if(md5_str == NULL)
+        return -1;
+
+    memcpy_s(code_str,data_len,data,data_len);
+    mbedtls_md5_context ctx;
+
+    // 初始化MD5上下文
+    mbedtls_md5_init(&ctx);
+
+    // 开始计算MD5哈希
+    mbedtls_md5_starts(&ctx);
+    // 更新要计算哈希的数据
+    mbedtls_md5_update(&ctx, (const unsigned char *)code_str, data_len);
+
+    // 完成哈希计算
+    mbedtls_md5_finish(&ctx, (unsigned char *)md5_buf);
+
+    // printf("md5_buf\r\n");
+    // for (int i = 0; i < 16; i++) {
+    //     printf("%02X\n", (uint8_t)md5_buf[i]);
+    // }
+    // printf("md5_buf end\r\n");
+
+    // 清理MD5上下文
+    mbedtls_md5_free(&ctx);
+    for (int i = 0; i < 16; i++) 
+        sprintf(&md5_str[i * 2], "%02x", (uint8_t)md5_buf[i]);
+
+    md5_str[32] = '\0';
+
+    free(code_str);
+
+    return 0;
+}
+
+static void calculate_md5(const char* input, char* md5_str) 
+{
+    mbedtls_md5_context md5;
+    unsigned char md5_digest[16] = {0};
+    int i;
+
+    // printf("input:%s\n",input);
+    
+    mbedtls_md5_init(&md5);
+    mbedtls_md5_starts(&md5);
+    mbedtls_md5_update(&md5, (const unsigned char*)input, strlen(input));
+    mbedtls_md5_finish(&md5, md5_digest);
+    mbedtls_md5_free(&md5);
+    
+    // 转换为十六进制字符串
+    for (i = 0; i < 16; i++) {
+        sprintf(md5_str + i*2, "%02x", md5_digest[i]);
+    }
+    md5_str[32] = '\0';  // 确保字符串终止
+}
+
+int tcp_sign_up(void)
+{
+    int ret = -1;
+    char len_str[5] = {0};
+    sprintf(len_str, "%04x", 2);
+
+    // 获取IMEI
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
+    // printf("imei:%s\n", imei);
+
+    // 精确计算head_str长度:BID + * + IMEI + * + len_str + * + LK + \0
+    int head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("LK") + 1;
+    char *head_str = (char *)malloc(head_len);
+    if(head_str == NULL) 
+    {
+        printf("head_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(head_str, head_len, "%s*%s*%s*LK", BID,imei,len_str);
+    head_len = strlen(head_str);  // 重新计算实际长度
+
+    char md5_str[33] = {0};  // MD5为32字符+1终止符
+
+    // 计算code_str长度:head_str + KEY + \0
+    int code_len = head_len + strlen(KEY) + 1;
+    char *code_str = (char *)malloc(code_len);
+    if(code_str == NULL) 
+    {
+        printf("code_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    code_len = strlen(code_str);
+
+    if(active_md5_sign(code_str, code_len, md5_str) != 0) 
+    {
+        printf("active_md5_sign failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    // 计算send_str长度:[ + md5_str + head_str + ] + \0
+    int send_len = 1 + strlen(md5_str) + strlen(head_str) + 1 + 1;
+    char *send_str = (char *)malloc(send_len);
+    if(send_str == NULL) 
+    {
+        printf("send_str malloc failed\n");
+        ret = -1;
+        goto FAILED;
+    }
+
+    snprintf(send_str, send_len, "[%s%s]", md5_str, head_str);
+    send_len = strlen(send_str);
+    
+    // 打印调试信息
+    // printf("md5_str:%s\n", md5_str);
+    // printf("md5_len:%zu\n", strlen(md5_str));
+    // printf("head_len:%d\n", head_len);
+    // printf("head_str:%s\n", head_str);
+    // printf("send_len : %d\n", send_len);
+    // printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    tcp_send(g_listen_sock, send_str, send_len);
+
+FAILED:
+    // 释放资源
+    if(head_str != NULL)
+    {
+        free(head_str);
+        head_str = NULL;
+    }
+    if(code_str != NULL)
+    {
+        free(code_str);
+        code_str = NULL;
+    }
+    if(send_str != NULL)
+    {
+        free(send_str);
+        send_str = NULL;
+    }
+
+    return ret;
+}
+
+void get_request_code(char *req_code)
+{
+    uint32_t req_code_len = 0;
+    char* fact = "hunandongni";                // 获取厂商名字(不超过32个字节的字符串)
+    const unsigned int fact_len = strlen(fact);
+
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            return;
+        }
+    }
+
+    const unsigned int imei_len = strlen(imei);
+    request_validation((unsigned char*)fact, fact_len, (unsigned char*)imei, imei_len, (unsigned char*)req_code, &req_code_len);
+    printf("req_code:%s\n",req_code);
+    printf("req_code_len:%d\n",req_code_len);
+}
+
+/**
+ * 计算cnt个int数据转换为字符串并添加逗号后的Base64编码长度
+ * @param cnt int数据个数
+ * @return Base64编码后的长度,失败返回-1
+ */
+int calculate_base64_length(int cnt) 
+{
+    if (cnt <= 0)
+        return -1;
+    
+    // 1. 计算int数组转换为字符串的最大可能长度
+    // int的最大字符串长度:11个字符(如"-2147483648")
+    // 每个int后加一个逗号(最后一个int除外)
+    int str_length = cnt * 11 + (cnt - 1);
+    
+    // 2. 计算Base64编码长度
+    // Base64编码规则:每3字节明文→4字节编码,不足3字节用'='填充
+    int base64_length = (str_length * 4 + 2) / 3;
+    
+    // 3. 确保编码长度足够容纳终止符
+    base64_length += 1;  // 预留终止符空间
+    
+    return base64_length;
+}
+
+void upload_bp_data(int *data, int cnt)
+{
+#if 0
+    if (data == NULL || cnt == 0 || LK_STATUS == 0)
+    {
+        printf("数据为空或服务器未登录\n");
+        return;
+    }
+
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    char *tail_encode_str = NULL;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+    uint32_t begin_time = 0;
+    uint32_t end_time = 0;
+    
+    printf("upload_bp_data\n");
+
+
+/*########################################################################################################*/
+    uint8_t retry = 0;
+    const char *imei = uapi_dev_runtime_get_cat1_imei();
+    while ((imei == NULL || strlen(imei) == 0) && retry < 10) {
+        retry++;
+        LOS_Msleep(2000);
+        imei = uapi_dev_runtime_get_cat1_imei();
+    }
+
+    if (imei == NULL || strlen(imei) == 0) {
+        printf("获取IMEI失败\n");
+        goto FAILED;
+    }
+
+    printf("imei:%s\n", imei);
+
+    // 分配JSON缓冲区
+    char *json_data = (char *)malloc(512);
+    if (json_data == NULL) {
+        printf("json_data malloc failed\n");
+        goto FAILED; 
+    }
+    printf("json_data malloc succed\n");
+
+    // 获取测量时间
+    bp_get_measure_time(&begin_time, &end_time);
+    char *begin_time_str = (char *)malloc(64);
+    char *end_time_str = (char *)malloc(64);
+    if (begin_time_str == NULL || end_time_str == NULL)
+        goto FAILED;
+    uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':',  DATE_TIME_DEFULL);
+    uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+    printf("begin_time_str:%s\n", begin_time_str);
+    printf("end_time_str:%s\n", end_time_str);
+
+    // 构建JSON数据前缀部分
+    temp_len = 0;
+    memset(json_data, 0, 512);
+    
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    // temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", imei);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_mode\":\"%d\",", 1);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_type\":\"%d\",", 7);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"end_time\":\"%s\",", end_time_str);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"ppg_data\":[");
+    
+    if(temp_len > 512)
+        goto FAILED;
+
+    // // 后续Base64编码和数据发送逻辑...
+    // encode_len = 512 * 2;
+    // printf("encode_len : %d\n", encode_len);
+    // encode_str = (char *)malloc(encode_len);
+    // if (encode_str == NULL) {
+    //     printf("encode_str 分配失败\n");
+    //     goto FAILED;
+    // }
+    // printf("encode_str 分配成功\n");
+
+    // memset(encode_str, 0, encode_len);
+
+    // mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+    //                       (const unsigned char*)json_data, strlen(json_data));
+
+    // printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    // encode_str[output_len] = '\0';
+    // printf("encode_str : %s\n",encode_str);
+
+    char token[64] = {0};
+    bp_get_token(token, 64);
+    printf("bp_get_token:%s\n", token);
+    retry = 0;
+    while(strlen(token) == 0  && retry < 10) 
+    {
+        bp_tcp_login();
+        LOS_Msleep(500);
+        bp_get_token(token, 64);
+    }
+
+    // 构建content部分
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + strlen(token) + 1 + 1 + output_len + 1 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str);
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+
+    // 后续Base64编码和数据发送逻辑...
+    encode_len = data_len * 3 / 2;
+    printf("encode_len : %d\n", encode_len);
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) {
+        printf("encode_str 分配失败\n");
+        goto FAILED;
+    }
+    printf("encode_str 分配成功\n");
+
+    memset(encode_str, 0, encode_len);
+
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                          (const unsigned char*)json_data, strlen(json_data));
+
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    encode_str[output_len] = '\0';
+    printf("encode_str : %s\n",encode_str);
+
+    
+    snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str);
+
+    // 完成JSON数据,添加ppg_fs字段
+    temp_len = 0;
+    memset(json_data, 0, 512);
+    temp_len += snprintf(json_data + temp_len, 512 - temp_len,  "\"ppg_fs\":\"%d\"}", 81);
+    tail_encode_str = (char *)malloc(32);
+    memset(tail_encode_str, 0, 32);
+    mbedtls_base64_encode((unsigned char*)tail_encode_str, 32, &output_len, 
+                    (const unsigned char*)json_data, strlen(json_data));
+
+    if(output_len > 32)
+        goto FAILED;
+    tail_encode_str[output_len] = '\0';
+
+    // 计算数据长度并格式化为16进制
+    // data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str));
+    printf("data_len : %d\n",data_len);
+    // 计算head_str长度
+    // head_len = strlen(BID) + 1 + strlen("864430010001091") + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str 分配失败\n");
+        goto FAILED;
+    }
+
+    // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str, md5_str);
+    if (strlen(md5_str) == 0) {
+        printf("MD5签名失败\n");
+        goto FAILED;
+    }
+
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s", md5_str, head_str,data_str);
+    send_len = strlen(send_str);
+    printf("send_len : %d\n", send_len);
+    printf("send_str : %s\n", send_str);
+
+    tcp_send(g_listen_sock, send_str, send_len);
+
+/*########################################################################################################*/
+
+    // 分块发送ppg_data
+    int ppg_block = 0;
+    int ppg_offset = 0;  // 已处理的int数量
+    int total_ints = cnt;  // 总int数量
+
+    while (ppg_offset < total_ints) {
+        LOS_Msleep(100);
+        temp_len = 0;  // 当前块的字符串长度
+        int ints_in_block = 0;   // 当前块包含的int数量
+        
+        memset(json_data, 0, 512);
+        
+        // 计算当前块最多能容纳多少个int
+        while (temp_len < 512 - 12 && ppg_offset < total_ints) {
+            int num = data[ppg_offset];
+            int written = 0;
+            
+            // 如果不是最后一个int,添加数字和逗号
+            if (ppg_offset < total_ints - 1) {
+                written = snprintf(
+                    json_data + temp_len,
+                    512 - temp_len,
+                    "%d,", num
+                );
+            }
+            // 最后一个int,添加数字但不添加逗号
+            else {
+                written = snprintf(
+                    json_data + temp_len,
+                    512 - temp_len,
+                    "%d", num
+                );
+            }
+            
+            if (written < 0 || written >= 512 - temp_len) {
+                break;  // 空间不足,结束当前块
+            }
+            
+            temp_len += written;
+            ppg_offset++;
+            ints_in_block++;
+        }
+        
+        // 最后一个块需要添加JSON数组结束符号
+        if (ppg_offset == total_ints && temp_len > 0) {
+            json_data[temp_len++] = ']';
+        }
+        
+        // 发送当前块
+        if (temp_len > 0) {
+            memset(encode_str, 0, encode_len);
+            mbedtls_base64_encode(
+                (unsigned char*)encode_str,
+                encode_len,
+                &output_len,
+                (const unsigned char*)json_data,
+                temp_len
+            );
+            
+            tcp_send(g_listen_sock, encode_str, output_len);
+            printf("已发送ppg数据块 %d,包含 %d 个int,字符串长度: %d encode_str:%s\n", 
+                ppg_block, ints_in_block, temp_len,encode_str);
+        }
+        
+        ppg_block++;
+    }
+    memset(send_str,0,send_len);
+    send_len = strlen(tail_encode_str) + 1;
+    snprintf(send_str, send_len, "%s]", tail_encode_str);
+    printf("send_len : %d\n", send_len);
+    printf("tail_encode_str : %s\n", tail_encode_str);
+    //发送最终数据
+    tcp_send(g_listen_sock, send_str, send_len);
+    
+    ret = 0;  // 成功
+
+FAILED:
+
+    if (tail_encode_str != NULL) {
+        free(tail_encode_str);
+        tail_encode_str = NULL;
+    }
+    if (begin_time_str != NULL) {
+        free(begin_time_str);
+        begin_time_str = NULL;
+    }
+    if (end_time_str != NULL) {
+        free(end_time_str);
+        end_time_str = NULL;
+    }
+    if (json_data != NULL) {
+        free(json_data);
+        json_data = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
+        send_str = NULL;
+    }
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    printf("free\n");
+
+#else
+    if (data == NULL || cnt == 0)
+        return;
+
+    uint8_t pm_cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (pm_cnt == 0) {
+        uapi_pm_add_sleep_veto(PM_ID_CAT1);
+    }
+
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+    uint32_t begin_time = 0;
+    uint32_t end_time = 0;
+
+       char *encode_header_str = NULL;
+    char *header_json = NULL;
+    int encode_header_len = 0;
+
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
+
+
+    printf("imei:%s\n", imei);
+
+    // 获取测量时间
+    bp_get_measure_time(&begin_time, &end_time);
+    char *begin_time_str = (char *)malloc(64);
+    char *end_time_str = (char *)malloc(64);
+    if (begin_time_str == NULL || end_time_str == NULL)
+        goto FAILED;
+    uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':',  DATE_TIME_DEFULL);
+    uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+    // printf("begin_time_str:%s\n", begin_time_str);
+    // printf("end_time_str:%s\n", end_time_str);
+
+    // 构建JSON数据前缀部分
+    header_json = (char *)malloc(256);
+    if(header_json == NULL)
+        goto FAILED;
+
+    char token[64] = {0};
+    bp_get_token(token, 64);
+
+    if (strlen(token) == 0) 
+    {
+        printf("token get failed\n");
+        goto FAILED;
+    }
+
+    temp_len = 0;
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"token\",");
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"}", token);
+       temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+    if(temp_len > 256)
+    {
+        goto FAILED;
+    }
+
+       encode_header_len = temp_len * 3 / 2;
+       encode_header_str = (char *)malloc(encode_header_len);
+       if(NULL == encode_header_str)
+       {
+               printf("encode_header_str malloc failed\n");
+               goto FAILED;
+       }
+
+       memset(encode_header_str,0, encode_header_len);
+    size_t output_header_len = 0;
+       if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+       {
+        printf("encode_header_str base64 encode failed\n");
+               goto FAILED;
+       }       
+
+    // 分配JSON缓冲区
+    int json_len = 512 + calculate_base64_length(cnt);
+    char *json_data = (char *)malloc(json_len);
+    if (json_data == NULL) 
+    {
+        printf("json_data malloc failed\n");
+        goto FAILED; 
+    }
+    // printf("json_data malloc succed\n");
+
+    temp_len = 0;
+    memset(json_data, 0, json_len);
+    
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    // temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", imei);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_mode\":\"%d\",", 1);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_type\":\"%d\",", 7);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"end_time\":\"%s\",", end_time_str);
+    temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"ppg_data\":[");
+
+    for(int i = 0; i < cnt; i++)
+    {
+        if(i == (cnt - 1))
+        {
+            temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d],", data[i]);
+        }
+        else
+        {
+            temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d,", data[i]);
+        }
+    }
+
+       temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\"}", 81);
+
+    if(temp_len > json_len)
+        goto FAILED;
+
+    // 后续Base64编码和数据发送逻辑...
+    encode_len = temp_len * 3 / 2;
+    // printf("encode_len : %d\n", encode_len);
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) 
+    {
+        printf("encode_str malloc failed\n");
+        goto FAILED;
+    }
+
+    memset(encode_str, 0, encode_len);
+
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                          (const unsigned char*)json_data, strlen(json_data));
+
+    // printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    encode_str[output_len] = '\0';
+    // printf("encode_str : %s\n",encode_str);
+
+    // 构建content部分
+    // ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + 1 + output_header_len + 1 + output_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) 
+    {
+        printf("data_str malloc failed\n");
+        goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+
+    snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, encode_header_str, encode_str);
+
+    sprintf(len_str, "%04x", strlen(data_str) + 8);
+    // printf("data_len : %d\n",data_len);
+
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) 
+    {
+        printf("head_str malloc failed\n");
+        goto FAILED;
+    }
+
+    // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) 
+    {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    // printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str, md5_str);
+    if (strlen(md5_str) == 0)
+     {
+        printf("MD5 sign failed\n");
+        goto FAILED;
+    }
+
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) 
+    {
+        printf("send_str malloc failed\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str,data_str);
+    send_len = strlen(send_str);
+    // printf("send_len : %d\n", send_len);
+    // printf("send_str : %s\n", send_str);
+
+    ret = tcp_send(g_listen_sock, send_str, send_len);
+    if(ret != 0)
+    {
+        printf("tcp_send failed\n");
+        goto FAILED;
+    }
+
+
+    // int offset = 0;
+    // while (offset < send_len) 
+    // {
+    //     size_t chunk_len = (send_len - offset > 1024) ? 1024 : send_len - offset;
+    //     // printf("send_str %zu: %.1024s\n", offset / 1024 + 1, send_str + offset);
+    //     printf("%.1024s\n",send_str + offset);
+    //     offset += chunk_len;
+    // }
+
+    LOS_Msleep(3000);
+
+FAILED:
+    
+    if (encode_header_str != NULL) 
+    {
+        free(encode_header_str);
+        encode_header_str = NULL;
+    }
+
+    if (header_json != NULL) 
+    {
+        free(header_json);
+        header_json = NULL;
+    }
+
+    if (begin_time_str != NULL)
+    {
+        free(begin_time_str);
+        begin_time_str = NULL;
+    }
+
+    if (end_time_str != NULL) 
+    {
+        free(end_time_str);
+        end_time_str = NULL;
+    }
+
+    if (json_data != NULL) 
+    {
+        free(json_data);
+        json_data = NULL;
+    }
+
+    if (send_str != NULL) 
+    {
+        free(send_str);
+        send_str = NULL;
+    }
+
+    if (code_str != NULL)
+    {
+        free(code_str);
+        code_str = NULL;
+    }
+
+    if (head_str != NULL) 
+    {
+        free(head_str);
+        head_str = NULL;
+    }
+
+    if (data_str != NULL) 
+    {
+        free(data_str);
+        data_str = NULL;
+    }
+
+    if (encode_str != NULL) 
+    {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    pm_cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (pm_cnt == 1) {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
 
-static int *tcp_data = NULL;
-static int tcp_data_cnt = 0;
+    // printf("free\n");
+#endif
+}
 
-const char base64_table[] = 
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "abcdefghijklmnopqrstuvwxyz"
-    "0123456789+/";
-
-// {
-// "app_key": "1db74281ece314ba6bbc2b553222cd84",
-// "name": "RH303"
-// "firm": "魔方",
-// "device_code": "DA:19:72:F3:0A:89",
-// "model": "T11",
-// "sensor": {"model": "VC32", "fs": 100},
-// “sinklib_version": "v0.3.0.072522",
-// "request_code":
-// "6+m78fFJkFKu1mzhhL4jKRJTEhJMwvSJFlJhWIgRC8wfyB0HFw8JMURNQ6c3MP/U"
-// }
-
-int base64_encode(char *out, size_t out_len, size_t *out_size, const char *in, size_t in_len)
+int bp_tcp_login(void)
 {
-    if (out == NULL || out_len == 0 || out_size == NULL || in == NULL || in_len == 0) {
-        return -1;
-    }
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
     
-    // 计算Base64编码后的最大长度: (in_len + 2) / 3 * 4
-    size_t max_out_len = (in_len + 2) / 3 * 4;
+    char len_str[5] = {0};
+    char md5_str[33] = {0};
+    // char json_data[1024] = {0};
     
-    // 检查输出缓冲区是否足够
-    if (max_out_len + 1 > out_len) {  // +1 for null terminator
-        return -2;
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
+        }
+        
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
+
+    printf("imei:%s\n", imei);
+
+    char *json_data = (char *)malloc(512);
+    if(json_data == NULL)
+        goto FAILED; 
+
+    memset(json_data,0,512);
+
+    char birthday[32] = {0};
+    snprintf(birthday,32,"%d-%d-%d",2002,1,10);
+
+    // 构建JSON数据
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account_type\":\"%d\",", 1);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account\":\"%s\",", "1624952103@qq.com");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", "penglei");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"password\":\"%s\",", "12345678");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"gender\":\"%d\",", 1); //性别['1': 男, '2': 女, '3':未知]
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"birthday\":\"%s\",", birthday);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"height\":\"%d\",", 173);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"weight\":\"%d\"}", 100);
+
+    if(temp_len > 512)
+        goto FAILED;
+
+    printf("temp_len:%d\n",temp_len);
+    printf("json_data : %s\n", json_data);
+    printf("json_data_len : %d\n", strlen(json_data));
+
+    // encode_len = (temp_len * 4 + 2) / 3 + 1;
+    encode_len = temp_len * 2;
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) {
+        printf("encode_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(encode_str, 0, encode_len);
+
+    // 执行Base64编码
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                             (const unsigned char*)json_data, strlen(json_data));
+                             
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    // 确保Base64编码字符串以NULL结尾
+    encode_str[output_len] = '\0';
+    printf("encode_str: %s\n", encode_str);
+
+    // 构建content部分
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(LOGIN_URL) + 1 + 1 + output_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str 分配失败\n");
+        goto FAILED;
     }
+    memset(data_str, 0, data_len);
+    snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER, LOGIN_URL, encode_str);
+
+    // 计算数据长度并格式化为16进制
+    data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8);
+
+    // 计算head_str长度
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+    // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
     
-    uint32_t value = 0;
-    size_t i = 0, j = 0;
-    uint8_t bytes_remaining = 0;
+    head_len = strlen(head_str);
+
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_str:%s\n", code_str);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str,md5_str);
+    if(strlen(md5_str) == 0)
+    {
+        printf("MD5签名失败\n");
+        goto FAILED;
+    }
+    // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+    //     printf("MD5签名失败\n");
+    //     goto FAILED;
+    // }
+
+    // 构建发送字符串
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1;  // [ + md5 + head + data + ] + \0
+    printf("计算的send_len : %d\n", send_len);
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+    send_len = strlen(send_str);
+    printf("实际send_len : %d\n", send_len);
+
+    // 打印调试信息
+    printf("md5_str:%s\n", md5_str);
+    printf("md5_len:%zu\n", strlen(md5_str));
+    printf("head_len:%d\n", head_len);
+    printf("head_str:%s\n", head_str);
+    printf("data_len:%d\n", data_len);
+    printf("data_str:%s\n", data_str);
+    printf("send_len : %d\n", send_len);
+    printf("send_str : %s\n", send_str);
+
+    // 发送数据
+    tcp_send(g_listen_sock, send_str, send_len);
+
+    ret = 0;  // 成功
+
+FAILED:
+    if (json_data != NULL) {
+        free(json_data);
+        json_data = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
+        send_str = NULL;
+    }
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    return ret;
+}
+
+int get_active_code(void)
+{
+    int ret = -1;
+    char *data_str = NULL;
+    int data_len = 0;
+    char *encode_str = NULL;
+    int encode_len = 0;
+    char *head_str = NULL;
+    int head_len = 0;
+    char *code_str = NULL;
+    int code_len = 0;
+    char *send_str = NULL;
+    int send_len = 0;
+    uint32_t output_len = 0;
+    int temp_len = 0;
     
-    *out_size = 0;
+    char len_str[5] = {0};
+    char btaddr_str[64] = {0};
+    char req_code[128] = {0};
+    char md5_str[33] = {0};
+    // char json_data[1024] = {0};
     
-    // 按3字节分组处理
-    while (i < in_len) {
-        // 读取3字节
-        value = 0;
-        bytes_remaining = 0;
-        
-        for (int k = 0; k < 3 && i < in_len; k++) {
-            value = (value << 8) | (uint8_t)in[i++];
-            bytes_remaining++;
+    if(imei == NULL)
+    {
+        uint8_t retry = 0;
+        while((imei == NULL || strlen(imei) == 0) && retry < 10)
+        {
+            retry++;
+            LOS_Msleep(2000);
+            imei = uapi_dev_runtime_get_cat1_imei();
         }
         
-        // 编码为4个Base64字符
-        switch (bytes_remaining) {
-            case 3:
-                out[j++] = base64_table[(value >> 18) & 0x3F];
-                out[j++] = base64_table[(value >> 12) & 0x3F];
-                out[j++] = base64_table[(value >> 6) & 0x3F];
-                out[j++] = base64_table[value & 0x3F];
-                break;
-                
-            case 2:
-                out[j++] = base64_table[(value >> 10) & 0x3F];
-                out[j++] = base64_table[(value >> 4) & 0x3F];
-                out[j++] = base64_table[(value << 2) & 0x3F];
-                out[j++] = '=';  // 填充等号
-                break;
-                
-            case 1:
-                out[j++] = base64_table[(value >> 2) & 0x3F];
-                out[j++] = base64_table[(value << 4) & 0x3F];
-                out[j++] = '=';  // 填充等号
-                out[j++] = '=';  // 填充等号
-                break;
-        }
-    }
-    
-    out[j] = '\0';  // 字符串终止符
-    *out_size = j;
-    return 0;
-}
-
-void get_request_code(char *req_code)
-{
-    uint32_t req_code_len = 0;
-    char* fact = "zhihuishixun";                // 获取厂商名字(不超过32个字节的字符串)
-    const unsigned int fact_len = strlen(fact);
-    char* imei = uapi_dev_runtime_get_cat1_imei();        // 获取设备号(12个字节字符串)
-    const unsigned int imei_len = strlen(imei);
-    request_validation((unsigned char*)fact, fact_len, (unsigned char*)imei, imei_len, (unsigned char*)req_code, &req_code_len);
-    printf("req_code:%s\n",req_code);
-}
+        if (imei == NULL || strlen(imei) == 0) 
+        {
+            printf("IMEI get failed\n");
+            ret = -1;
+            goto FAILED;
+        }
+    }
 
-void get_active_code(void)
-{
-#if 0
-       char * data_ptr = NULL;
-       uint32_t data_len = 0;
-       char * encode_str = NULL;
-       uint32_t encode_len = 0;
-       uint32_t output_len = 0;
-       int temp_len = 0;
-       int json_data_len = 256;
-       char * json_data = NULL;
+    printf("imei:%s\n", imei);
 
-       json_data = malloc(json_data_len);
-       if(json_data == NULL)
-           goto FAILED;
-    memset(json_data,0,json_data_len);
+    char *json_data = (char *)malloc(512);
+    if(json_data == NULL)
+        goto FAILED; 
 
-       temp_len += sprintf(json_data + temp_len, "{\"app_key\":\"%s\",", APP_KEY);
-    temp_len += sprintf(json_data + temp_len, "{\"name\":\"%s\",", NAME);
-       temp_len += sprintf(json_data + temp_len, "\"firm\":\"%s\",", "HENGAI");
+    memset(json_data,0,512);
 
-    uint8_t btaddr[6] = {0};
-    uint32_t len = 6;
-    uapi_get_nv_btaddr(btaddr, &len);
-    uint8_t btaddr_str[64] = {0};
-    sprintf((char *)btaddr_str, "%02X:%02X:%02X:%02X:%02X:%02X", btaddr[0], btaddr[1], btaddr[2], btaddr[3], btaddr[4], btaddr[5]);
+    bp_get_request_code(req_code,128);
+    printf("bp_get_request_code:%s\n",req_code);
+    if(strlen(req_code) == 0)
+    {
+        get_request_code(req_code);
+        bp_save_request_code(req_code,strlen(req_code));
+    }
 
-    temp_len += sprintf(json_data + temp_len, "\"device_code\":\"%s\",", btaddr_str);
-    temp_len += sprintf(json_data + temp_len, "\"model\":\"%s\",", "T11");
-    temp_len += sprintf(json_data + temp_len, "\"sensor\":{\"model\":\"VC32\",\"fs\":%d},", 100);
-    temp_len += sprintf(json_data + temp_len, "\"sensor\":{\"model\":\"VC32\",\"fs\":%d},", 100);
-    temp_len += sprintf(json_data + temp_len, "\"sinklib_version\":\"%s\",", "v0.5.3.060325");
+    // get_request_code(req_code);
+    // 构建JSON数据
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", NAME);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"firm\":\"%s\",", "湖南懂你");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"device_code\":\"%s\",", imei);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"model\":\"%s\",", "WATCH C2-C3-C5");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sensor\":{\"model\":\"DN06\",\"fs\":%d},", 81);
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sinklib_version\":\"%s\",", "v0.5.3.060325");
+    temp_len += snprintf(json_data + temp_len,512-temp_len, "\"request_code\":\"%s\"}", req_code);
 
+    if(temp_len > 512)
+        goto FAILED;
 
-    char req_code[64] = {0};
-    get_request_code(req_code);
-    temp_len += sprintf(json_data + temp_len, "\"request_code\":\"%s\"}", req_code);
+    printf("temp_len:%d\n",temp_len);
+    printf("json_data : %s\n", json_data);
+    printf("json_data_len : %d\n", strlen(json_data));
 
-       printf("temp_len:%d\n",temp_len);
+    // encode_len = (temp_len * 4 + 2) / 3 + 1;
+    encode_len = temp_len * 2;
+    encode_str = (char *)malloc(encode_len);
+    if (encode_str == NULL) {
+        printf("encode_str 分配失败\n");
+        goto FAILED;
+    }
+    memset(encode_str, 0, encode_len);
 
-       // base64 body
-       encode_len = temp_len * 3 / 2;
-       encode_str = malloc(encode_len);
+    // 执行Base64编码
+    mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len, 
+                             (const unsigned char*)json_data, strlen(json_data));
+                             
+    printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+    // 确保Base64编码字符串以NULL结尾
+    encode_str[output_len] = '\0';
+    printf("encode_str: %s\n", encode_str);
 
-       if(encode_str == NULL)
+    // 构建content部分
+    data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(ACTIVE_URL) + 1 + 1 + output_len + 1;
+    data_str = (char *)malloc(data_len);
+    if (data_str == NULL) {
+        printf("data_str 分配失败\n");
         goto FAILED;
+    }
+    memset(data_str, 0, data_len);
+    snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER,ACTIVE_URL, encode_str);
 
-    memset(encode_str,0,encode_len);
+    // 计算数据长度并格式化为16进制
+    data_len = strlen(data_str);
+    sprintf(len_str, "%04x", data_len + 8);
 
-       if(0 != base64_encode(encode_str, encode_len, &output_len, json_data, temp_len))
-               goto FAILED;
+    // 计算head_str长度
+    head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+    head_str = (char *)malloc(head_len);
+    if (head_str == NULL) {
+        printf("head_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+    // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+    
+    head_len = strlen(head_str);
 
-       
-       // content
-       data_len = output_len + 128;
-       data_ptr = malloc(data_len);
-       if(data_ptr == NULL)
-               goto FAILED;
+    // 计算MD5
+    code_len = head_len + strlen(KEY) + 1;
+    code_str = (char *)malloc(code_len);
+    if (code_str == NULL) {
+        printf("code_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(code_str, code_len, "%s%s", head_str, KEY);
+    printf("code_str:%s\n", code_str);
+    printf("code_len:%d\n", code_len);
+
+    calculate_md5(code_str,md5_str);
+    if(strlen(md5_str) == 0)
+    {
+        printf("MD5签名失败\n");
+        goto FAILED;
+    }
+    // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+    //     printf("MD5签名失败\n");
+    //     goto FAILED;
+    // }
 
-    memset(data_ptr,0,data_len);
+    // 构建发送字符串
+    send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1;  // [ + md5 + head + data + ] + \0
+    printf("计算的send_len : %d\n", send_len);
+    send_str = (char *)malloc(send_len);
+    if (send_str == NULL) {
+        printf("send_str 分配失败\n");
+        goto FAILED;
+    }
+    snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+    send_len = strlen(send_str);
+    printf("实际send_len : %d\n", send_len);
 
-       sprintf(data_ptr, "[XT*YYYYYYYYYYYYYYY*%s*TCP_HTTP,POST,%s%s,,%s", URL_HEADER, "/sinklib/activation/feedback", encode_str);
-       data_len = strlen(data_ptr);
+    // 打印调试信息
+    printf("md5_str:%s\n", md5_str);
+    printf("md5_len:%zu\n", strlen(md5_str));
+    printf("head_len:%d\n", head_len);
+    printf("head_str:%s\n", head_str);
+    printf("data_len:%d\n", data_len);
+    printf("data_str:%s\n", data_str);
+    printf("send_len : %d\n", send_len);
+    printf("send_str : %s\n", send_str);
 
-    char *send_str = NULL;
-    int send_len = data_len + 64;
-    send_str = malloc(send_len);
-       if(send_str == NULL)
-               goto FAILED;
+    // 发送数据
+    tcp_send(g_listen_sock, send_str, send_len);
 
-       
-    char len_str[4] = {0};
-    sprintf(len_str, "%04x", data_len+8);
-    sprintf(send_str, "[XT*YYYYYYYYYYYYYYY*%s*TCP_HTTP%s]", len_str, data_ptr);
-    send_len = strlen(send_str);
+    ret = 0;  // 成功
 
-       mmi_protocol_fzd_action_tcp_http(data_ptr, data_len);
-       
 FAILED:
-    if(NULL != send_str)
-    {
-        lv_mem_free(send_str);
+    if (json_data != NULL) {
+        free(json_data);
+        json_data = NULL;
+    }
+    if (send_str != NULL) {
+        free(send_str);
         send_str = NULL;
     }
-       if(NULL != json_data)
-       {
-               lv_mem_free(json_data);
-               json_data = NULL;
-       }
-       if(NULL != encode_str)
-       {
-               lv_mem_free(encode_str);
-               encode_str = NULL;
-       }
-       if(NULL != data_ptr)
-       {
-               lv_mem_free(data_ptr);
-               data_ptr = NULL;
-       }
-#endif
+    if (code_str != NULL) {
+        free(code_str);
+        code_str = NULL;
+    }
+    if (head_str != NULL) {
+        free(head_str);
+        head_str = NULL;
+    }
+    if (data_str != NULL) {
+        free(data_str);
+        data_str = NULL;
+    }
+    if (encode_str != NULL) {
+        free(encode_str);
+        encode_str = NULL;
+    }
+
+    return ret;
+}
+
+void bp_check_active_code(char *active_code)
+{
+    char buffer[128] = {0};
+    int buffer_size = 128;
+    FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+    if (file) 
+    {
+        memset(buffer, 0, buffer_size);
+        size_t bytes_read = fread(buffer, 1, buffer_size - 1, file);
+        if (bytes_read > 0) 
+        {
+            buffer[bytes_read] = '\0';
+            fclose(file);
+            printf("成功读取文件内容\n");
+            memcpy_s(active_code,bytes_read,buffer,bytes_read);
+            return ;
+        } else {
+            printf("文件为空\n");
+            fclose(file);
+        }
+    } else {
+        printf("无法打开文件读取(可能不存在): %s\n", BP_ACTIVE_CODE_FILE);
+    }
+
+    fclose(file);
 }
 
 void bp_tcp_data_clean(void)
@@ -226,23 +1886,33 @@ void bp_tcp_data_clean(void)
         tcp_data = NULL;
         tcp_data_cnt = 0;
     }
+    // if (g_listen_sock >= 0) 
+    // {
+    //     lwip_close(g_listen_sock);
+    //     g_listen_sock = -1;
+    // }
 }
 
-void do_bp_tcp_server_send_data(int *data,uint32_t len)
+void do_bp_tcp_server_send_data(int cmd,int *data,uint32_t len)
 {
-    if(data == NULL || len == 0)
+    if((data == NULL || len == 0) && cmd == BP_TCP_SERVICE_CMD_DATA_UPLOAD)
         return;
 
     errcode_t ret;
     bp_tcp_data_mail_t send_data = {0};
-    send_data.len = len;
-    send_data.data = (int *)malloc(len * sizeof(int));
-    if(send_data.data == NULL)
+    send_data.cmd = cmd;
+    if(len && data)
     {
-        PRINT("malloc failed\n");
-        return;
+        send_data.len = len;
+        send_data.data = (int *)malloc(len * sizeof(int));
+        if(send_data.data == NULL)
+        {
+            PRINT("malloc failed\n");
+            return;
+        }
+        memcpy_s(send_data.data,len * sizeof(int),data,len * sizeof(int));
     }
-    memcpy_s(send_data.data,len * sizeof(int),data,len * sizeof(int));
+
     uint32_t send_len = sizeof(send_data);
 
     ret = osal_msg_queue_write_copy(g_app_queue, (void *)&send_data,
@@ -251,196 +1921,91 @@ void do_bp_tcp_server_send_data(int *data,uint32_t len)
         PRINT("Error bp Check MSG 0x send failed! err=0x%x! \r\n", ret);
     }
 
-    free(send_data.data);
+    if(send_data.data != NULL)
+        free(send_data.data);
 }
 
-// 数据开头标识:[
-// bid(需要登录后台申请)
-// 设备号0
-// 协议模块分割符:*
-// 消息内容(开头是命令,后面有内容用消息分割符逗号分割,没有则不需要逗号)
-// 消息长度(十六进制,4个字节,最大支持FFFF)
-// 消息分割符:,
-// 数据结尾标识:]
+// unsigned char buf[14100] = {0};    // 算法库计算过程中所需要的缓存
 
-
-
-void tcp_data_parse(char *rx_buffer, int len)
+//int activate_algorithm(const unsigned char req_code[], const unsigned int req_code_len,const unsigned char key_code[], const unsigned int key_code_len);
+void bp_activate_algorithm(void)
 {
-    if (len == 0 || rx_buffer == NULL || strlen(rx_buffer) != len)
+#if 0
+    char req_code[128] = {0};
+    char active_code[128] = {0};
+    bp_get_request_code(req_code,128);
+    bp_get_active_code(active_code,128);
+    if(strlen(req_code) == 0 || strlen(active_code) == 0)
     {
-        printf("len  = 0 or rx_buffer == NULL, format error !\n");
+        printf("read req_code or active_code failed\n");
         return;
     }
-
-    // printf("rx_buffer %s\n", rx_buffer);
-    // printf("rx_buffer %d\n", strlen(rx_buffer));
-    // printf("format error ! header:%c len:%d\n", rx_buffer[0], len);
-    // printf("format error ! tail:%c \n", rx_buffer[len-1]);
-
-    if (!(rx_buffer[0] == '[' && rx_buffer[len-1] == ']'))
+    int ret = activate_algorithm((const unsigned char*)req_code,strlen(req_code),(const unsigned char*)active_code,strlen(active_code));
+    printf("activate_algorithm ret : %d\n",ret);
+    if(ret == 1)
     {
-        printf("format error ! header:%c,tail:%c\n", 
-               (unsigned char)rx_buffer[0], 
-               (unsigned char)rx_buffer[len-1]);
-        return;
+        printf("activate_algorithm succed\n");
     }
-
-    // 解析BID
-    char *bid_start = &rx_buffer[1];
-    char *bid_end = strchr(bid_start, '*');
-    if (bid_end == NULL) 
+    ret = init_algorithm(buf, 8000);
+    printf("init_algorithm ret:%d\n",ret);
+    if(ret == 0)
     {
-        printf("Missing module delimiter\n");
-        return;
+        printf("init_algorithm succed\n");
     }
+#endif
+}
 
-    int bid_len = bid_end - bid_start;
-    char bid[20] = {0};
-    strncpy(bid, bid_start, bid_len);
-    bid[bid_len] = '\0';
-    
-    // 解析设备号
-    char *device_start = bid_end + 1;
-    char *device_end = strchr(device_start, '*');
-    if (device_end == NULL) {
-        printf("Missing module delimiter *\n");
-        return;
-    }
-    int device_len = device_end - device_start;
-    char device_id[64] = {0};
-    strncpy(device_id, device_start, device_len);
-    device_id[device_len] = '\0';
-    
-    // 解析长度字段 (4个十六进制字符 = 2字节)
-    char *len_start = device_end + 1;
-    char *len_end = strchr(len_start, '*');
-    if (len_end == NULL) {
-        printf("Missing module delimiter *\n");
-        return;
-    }
-    
-    // 验证长度格式
-    int len_len = len_end - len_start;
-    if (len_len != 4) {  // 4个十六进制字符
-        printf("Invalid length format (expected 4 characters, got %d)\n", len_len);
-        return;
+void bp_tcp_init(void)
+{ 
+    // printf("bp_tcp_init \n");
+
+    uint8_t retry = 0;
+
+    uint8_t pm_cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (pm_cnt == 0) {
+        uapi_pm_add_sleep_veto(PM_ID_CAT1);
     }
-    
-    // 转换长度字符串为整数
-    uint16_t total_length;  // 使用16位整数存储2字节长度
-    sscanf(len_start, "%4hx", &total_length);  // 注意这里用%4hx,匹配4个十六进制字符
-    
-    // 解析命令和内容
-    char *cmd_start = len_end + 1;
-    char *content_start = strchr(cmd_start, ',');
-    
-    if (content_start != NULL) 
-    {
-        // 有内容的情况: [BID*DEVICE*LEN*COMMAND,CONTENT]
-        int cmd_len = content_start - cmd_start;
-        char command[64] = {0};
-        strncpy(command, cmd_start, cmd_len);
-        command[cmd_len] = '\0';
-        
-        // 解析内容 (不包括逗号)
-        int content_len = &rx_buffer[len-1] - content_start - 1;  // 不包含逗号
-        char content[128] = {0};
-        strncpy(content, content_start + 1, content_len);  // 从逗号后一位开始复制
-        content[content_len] = '\0';
-        
-        // 验证总长度 (从命令开始到消息结束的长度)
-        int actual_total_length = cmd_len + content_len + 1;  // +1 是因为内容的逗号也计入总长度
-        if (actual_total_length != total_length) {
-            printf("Length mismatch: declared %u, actual %d\n", 
-                   total_length, actual_total_length);
-            return;
-        }
-        
-        // 移除内容中的所有逗号
-        char filtered_content[128] = {0};
-        int j = 0;
-        for (int i = 0; content[i] != '\0'; i++) {
-            if (content[i] != ',') {
-                filtered_content[j++] = content[i];
-            }
-        }
-        
-        // 打印解析结果
-        printf("Parsed successfully:\n");
-        printf("BID: %s\n", bid);
-        printf("Device ID: %s\n", device_id);
-        printf("Command: %s\n", command);
-        printf("Content: %s\n", filtered_content);  // 打印不包含逗号的内容
-
-        if (strcmp(command, "blood") == 0) {
-            printf("blood start\n");
-#ifdef ENABLE_BN02
-            do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
-#endif
-        }
-    } 
-    else
+
+    while (LK_STATUS == 0 && retry < 5) 
     {
-        // 无内容的情况: [BID*DEVICE*LEN*COMMAND]
-        int cmd_len = &rx_buffer[len-1] - cmd_start;
-        char command[64] = {0};
-        strncpy(command, cmd_start, cmd_len);
-        command[cmd_len] = '\0';
-        
-        // 验证命令长度 (无内容时,长度字段表示命令长度)
-        if (cmd_len != total_length) {
-            printf("Command length mismatch: declared %u, actual %d\n", 
-                   total_length, cmd_len);
-            return;
-        }
-        
-        // 打印解析结果
-        printf("Parsed successfully:\n");
-        printf("BID: %s\n", bid);
-        printf("Device ID: %s\n", device_id);
-        printf("Command: %s\n", command);
-        printf("No content\n");
-
-
-        if (strcmp(command, "blood") == 0) {
-            printf("blood start\n");
-#ifdef ENABLE_BN02
-            do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
-#endif
-        }
+        retry++;
+        LOS_Msleep(2000);
+        tcp_sign_up();
     }
-}
 
-static void bp_tcp_server_recv_task(void const *arg)
-{
-    // char rx_buffer[512];
-    // char tx_buffer[256];
+    if(LK_STATUS == 0 ) 
+    {
+        printf("LK failed\n");
+        goto FAILED;
+    }
+    // printf("retry : %d\n");
 
-    // socklen_t addrLen = sizeof(filesourceAddr);
-    while (1) {
+    retry = 0;
+    char token[64] = {0};
+    bp_get_token(token, 64);
+    while(strlen(token) == 0 && retry < 5) 
+    {
+        printf("bp_get_token:%s\n", token);
+        retry++;
+        bp_tcp_login();
+        LOS_Msleep(2000);
+        bp_get_token(token, 64);
+    }
 
-    //         // printf("recv ENTER\r\n");
-            
-       //              memset(rx_buffer, 0, sizeof(rx_buffer));
-    //         int len = recvfrom(g_listen_sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&filesourceAddr, &addrLen);
-    //         // Error occured during receiving
-    //         printf("file recv len:%d rx_buffer:%s\r\n",len,rx_buffer);
-    //         if (len < 0) {
-    //             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len < 0 , recv failed: errno %d\n", errno);
-    //             // break;
-    //             continue;
-    //         } else if (len == 0) {
-    //             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len == 0\n");
-    //             // break;
-    //             continue;
-    //         }
-    //         // Data received
-    //         rx_buffer[len] = '\0'; // Null-terminate whatever we received and treat like a string
-    //         // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Received %d bytes, rx_buffer: %s\n", len, rx_buffer);
-    //         tcp_data_parse(rx_buffer, len);
+    if (strlen(token) == 0) 
+    {
+        printf("token get failed\n");
+        goto FAILED;
+    }
+    else
+        printf("token get succed\n");
 
-        }
+FAILED:
+    pm_cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+    if (pm_cnt == 1) {
+        uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+    }
+    
 }
 
 static void tcp_data_handler(int *data,int len)
@@ -454,26 +2019,32 @@ static void tcp_data_handler(int *data,int len)
             return;
         }
     }
-    // printf("len:%d\n",len);
-    memcpy_s(tcp_data + tcp_data_cnt,len * sizeof(int),data,len * sizeof(int));
-
-    // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)
-    // {
-    //     printf("222data[%d]:%d\n",i,tcp_data[i]);
-    // }
-
-    tcp_data_cnt += len;
-
-
 
     if(tcp_data_cnt >= MAX_CNT)
     {
+        printf("tcp_data_cnt : %d\n",tcp_data_cnt);
+        bp_stop();
         // for(int i = 0; i < tcp_data_cnt; i ++)
         // {
         //     printf("data[%d]:%d\n",i,tcp_data[i]);
         // }
+        // memset((void*)tcp_data,0,MAX_CNT * sizeof(int));
+        LOS_Msleep(1000);
+        upload_bp_data(tcp_data,tcp_data_cnt);
         tcp_data_cnt = 0;
-        memset((void*)tcp_data,0,MAX_CNT * sizeof(int));
+        bp_tcp_data_clean();
+    }
+    else
+    {
+        printf("tcp_data_cnt:%d\n",tcp_data_cnt);
+        memcpy_s(tcp_data + tcp_data_cnt,len * sizeof(int),data,len * sizeof(int));
+
+        // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++)
+        // {
+        //     printf("222data[%d]:%d\n",i,tcp_data[i]);
+        // }
+
+        tcp_data_cnt += len;
     }
 }
 
@@ -492,25 +2063,103 @@ static void bp_tcp_server_send_task(void const *arg)
             continue;
         }
 
-        tcp_data_handler((int *)mail.data,mail.len);
-        // for(int i = 0; i < mail.len; i ++)
+        if(mail.cmd == BP_TCP_SERVICE_CMD_DATA_UPLOAD)
+        {
+            tcp_data_handler((int *)mail.data,mail.len);
+        }
+        else if(mail.cmd == BP_TCP_SERVICE_CMD_SERVER_INIT)
+        {
+            bp_tcp_init();
+        }
+        else if(mail.cmd == BP_TCP_SERVICE_CMD_SERVER_DEINIT)
+        {
+            bp_tcp_data_clean();
+        }
+        
+    }
+}
+
+
+void bp_tcp_server_recv_task(void *pvParameters)
+{
+    char rx_buffer[512] = {0};
+    uint8_t retry = 0;
+    while (1)
+    {
+        if(!uapi_dev_runtime_get_bp_status_flag())
+        {
+            LOS_Msleep(1000);
+            continue;
+        }
+        if (!uapi_cat1_get_power_stat())
+        {
+            PRINT("wating cat1 power on\n");
+            LOS_Msleep(2000);
+            continue;
+        }
+        if (g_listen_sock < 0) 
+        {
+            g_listen_sock = tcp_socket_init();
+            if (g_listen_sock < 0)
+            {
+                PRINT("wating tcp socket init\n");
+                LOS_Msleep(1000);
+                continue;
+            }
+            else
+                do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_INIT,NULL,0);
+        }
+
+        // if (tcp_socket_init() != 0) 
         // {
-        //     printf("222data[%d]:%d\n",i,mail.data[i]);
+        //     PRINT("wating tcp socket init\n");
+        //     LOS_Msleep(100);
+        //     continue;
         // }
-        
+
+        // PRINT("tcp socket init succed\n");
+
+        // get_active_code();
+        // if(tcp_sign_up() != 0)
+        // {
+        //     LOS_Msleep(1000);
+        //     continue;
+        // }
+
+        // printf("tcp_sign_up\n");
+
+        // 接收数据
+        memset(rx_buffer, 0, sizeof(rx_buffer));
+        int len = recv(g_listen_sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
+        if (len > 0) 
+        {
+            rx_buffer[len] = '\0';
+            printf("recv len : %d\n",len);
+            PRINT("Received %d bytes: %s\n", len, rx_buffer);
+            tcp_recv_data_handler(rx_buffer,len);
+            // 解析数据
+            
+            // tcp_data_parse(rx_buffer, len);
+        }
+
+        // 关闭客户端连接
+        // close(g_listen_sock);
     }
+
+    // 关闭监听套接字
+    // close(g_listen_sock);
 }
 
 void create_bp_tcp_queue(void)
 {
 
-    if (osal_msg_queue_create("bp_tcp_service_queue", APP_BOARD_MSG_COUNT, &g_app_queue,
+    if (osal_msg_queue_create("bp_tcp_service_queue", 24, &g_app_queue,
                               0, sizeof(bp_tcp_data_mail_t)) != ERRCODE_SUCC) {
         PRINT("[bp][service] app create mail fail\n");
     }
 }
 
-#define BP_BOARD_TASK_SIZE   0x1000
+#define BP_TCP_BOARD_TASK_SIZE   0x2000
 errcode_t uapi_bp_tcp_server_init(void)
 {
     PRINT("uapi_bp_tcp_server_init !\r\n");
@@ -518,15 +2167,31 @@ errcode_t uapi_bp_tcp_server_init(void)
     app_task_definition_t taskcfg={0};
     taskcfg.create_queue_handle = create_bp_tcp_queue;
     taskcfg.attr.name="bp_tcp_server_send_task";
-    taskcfg.attr.priority = osPriorityBelowNormal4;
-    taskcfg.attr.stack_size = BP_BOARD_TASK_SIZE;
+    taskcfg.attr.priority = osPriorityNormal;
+    taskcfg.attr.stack_size = BP_TCP_BOARD_TASK_SIZE;
     taskcfg.func = bp_tcp_server_send_task;
     taskcfg.use_mem = USE_EXTEND_MEM;
     
     errcode_t ret=uapi_create_osThread_custom(&taskcfg);
     if(ret != ERRCODE_SUCC)
     {
-        PRINT("create bp_service failed %d!\r\n",ret);
+        PRINT("create bp_send_service failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    memset(&taskcfg,0,sizeof(taskcfg));
+
+    taskcfg.create_queue_handle = NULL;
+    taskcfg.attr.name="bp_tcp_server_recv_task";
+    taskcfg.attr.priority = osPriorityNormal;
+    taskcfg.attr.stack_size = BP_TCP_BOARD_TASK_SIZE;
+    taskcfg.func = bp_tcp_server_recv_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    ret=uapi_create_osThread_custom(&taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create bp_recv_service failed %d!\r\n",ret);
         return ERRCODE_FAIL;
     }
 
index b20a90a..6f224d7 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-02-14 10:30:32
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-06-12 17:17:47
+ * @LastEditTime: 2025-06-30 09:23:22
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -21,15 +21,24 @@ extern "C" {
 #include "errcode.h"
 
 typedef struct {
+    int cmd;
     int *data;
     uint32_t len;
 } bp_tcp_data_mail_t;
 
+#define BP_TCP_SERVICE_CMD_DATA_UPLOAD 0x1
+#define BP_TCP_SERVICE_CMD_SERVER_INIT 0x2
+#define BP_TCP_SERVICE_CMD_SERVER_DEINIT 0x3
 
-void do_bp_tcp_server_send_data(int *data,uint32_t len);
-void tcp_data_parse(char *rx_buffer, int len);
+void do_bp_tcp_server_send_data(int cmd,int *data,uint32_t len);
+void tcp_recv_data_handler(const char *input, int input_len) ;
 void bp_tcp_data_clean(void);
 void test_algorithm(void);
+int get_active_code(void);
+int tcp_sign_up(void);
+int bp_tcp_login(void);
+void bp_activate_algorithm(void);
+void bp_get_data(int *sbp,int *dbp);
 
 #ifdef __cplusplus
 #if __cplusplus
index 8e6291b..009b033 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-04-17 09:32:03
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-09-23 17:37:53
+ * @LastEditTime: 2025-06-23 17:05:10
  * @FilePath: /FD230/code/sdk/drivers/peripheral/config/include/ConfigModelC.h
  */
 #ifndef _CONFIG_MODEL_C_H_
@@ -96,6 +96,8 @@ void cm_set_hour_show_model(uint8_t showtype);
 
 uint8_t cm_get_vibmod(void);
 
+uint8_t cm_get_bind_status(void);
+
 //cywee 获取用户信息
 void get_user_info_from_config_model(int user_info[5]);
 
index 401cbbc..9832096 100644 (file)
@@ -1445,6 +1445,15 @@ uint8_t cm_get_vibmod(void)
     vibmod = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_VIBRATOR_SWITCH);
     return vibmod;
 }
+
+uint8_t cm_get_bind_status(void)
+{
+    uint8_t status = 0;
+    status = !OHOS::ConfigModel::GetInstance()->get_configData_bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART);
+    return status;
+}
+
+
 void cm_set_hour_show_model(uint8_t showtype)
 {
     OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_24HOUR,showtype);
index 4a86e89..cf4b326 100644 (file)
@@ -582,6 +582,9 @@ void cywee_reset_history_daily_data(void);
 void cywee_check_acc(void);
 
 void cywee_custom_save_wear_data(void);
+
+void cywee_gnss_update(void);
+
 #pragma pack()
 
 
index 4f78419..409bffd 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-03-26 20:29:58
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-10-28 20:02:18
+ * @LastEditTime: 2025-07-01 11:08:15
  * @FilePath: /FD230/code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h
  * @Description: 
  * 
@@ -97,6 +97,9 @@ extern "C" {
 
 #define CYWEE_SERVICE_CMD_CHECK_ACC 0x36
 
+#define CYWEE_SERVICE_CMD_GNSS_UPDATE 0x37
+
+
 errcode_t uapi_cywee_service_init(void);
 void uapi_cywee_service_deinit(void);
 
index b40f7a2..accec4d 100644 (file)
@@ -400,6 +400,7 @@ static void cywee_service_check_task(void const *arg)
                 cywee_set_sedentary_switch(0);
                 uapi_dev_runtime_set_sedentary_status(0);
             break;
+            
             case CYWEE_SERVICE_CMD_RESTART_ACC:
                 cywee_restart_acc();
             break;
@@ -407,6 +408,11 @@ static void cywee_service_check_task(void const *arg)
             case CYWEE_SERVICE_CMD_CHECK_ACC:
                 cywee_check_acc();
             break;
+
+            case CYWEE_SERVICE_CMD_GNSS_UPDATE:
+                cywee_gnss_update();
+            break;
+            
             default:
                 PRINT("unkonw cmd \r\n");
                 break;
index 66e3109..ca48619 100644 (file)
@@ -854,33 +854,38 @@ void cywee_gnss_update(void)
         return;
     }
 
-    if(gps_data->status < 1)
+    // if (gps_data->last_gps_time_ms > 0)
     {
-        CWM_OS_dbgPrintf("gps_data->status < 1 \n");
-        return;
+        if(gps_data->status < 1)
+        {
+            CWM_OS_dbgPrintf("gps_data->status < 1 \n");
+            return;
+        }
+        memset(&csd, 0, sizeof(CUSTOM_GNSS));
+        csd.sensorType = CUSTOM_GNSS;
+        csd.dData[0] = gps_data->location.lat;//latitude (degrees)  (range: -90~90);  //纬度
+        csd.dData[1] = gps_data->location.lng;//longitude (degrees) (range: -180~180) //经度
+        csd.dData[2] = gps_data->location.alt;//altitude   (meters)  //海拔
+        csd.dData[3] = gps_data->ground_course;//bearing  (heading in degrees)  //方位角
+        csd.dData[4] = gps_data->ground_speed;//speed (m/s) //速度
+        csd.dData[5] = gps_data->hdop;//Horizontal_Accuracy (meters) //水平精度
+        csd.dData[6] = gps_data->vdop;//Vertical_Accuracy (meters) //垂直精度
+        csd.dData[7] = 0;  //水平精度衰减因子
+        csd.dData[8] = 0; //垂直精度衰减因子
+        CWM_CustomSensorInput(&csd); 
+
+        uint32_t time = 0;
+        uapi_get_timestampe_ss(&time);
+        CWM_OS_dbgPrintf("time : %d \n", time);
+        CWM_OS_dbgPrintf("gps_data->location.lat:%f\n",gps_data->location.lat);
+        CWM_OS_dbgPrintf("gps_data->location.lng:%f\n",gps_data->location.lng);
+        CWM_OS_dbgPrintf("gps_data->location.alt:%f\n",gps_data->location.alt);
+        CWM_OS_dbgPrintf("gps_data->ground_course:%f\n",gps_data->ground_course);
+        CWM_OS_dbgPrintf("gps_data->ground_speed:%f\n",gps_data->ground_speed);
+        CWM_OS_dbgPrintf("gps_data->hdop:%f\n",gps_data->hdop);
+        CWM_OS_dbgPrintf("gps_data->vdop:%f\n",gps_data->vdop);
     }
 
-    memset(&csd, 0, sizeof(CUSTOM_GNSS));
-    csd.sensorType = CUSTOM_GNSS;
-    csd.dData[0] = gps_data->location.lat;//latitude (degrees)  (range: -90~90);  //纬度
-    csd.dData[1] = gps_data->location.lng;//longitude (degrees) (range: -180~180) //经度
-    csd.dData[2] =  gps_data->location.alt;//altitude   (meters)  //海拔
-    csd.dData[3] = gps_data->ground_course;//bearing  (heading in degrees)  //方位角
-    csd.dData[4] = gps_data->ground_speed;//speed (m/s) //速度
-    csd.dData[5] = gps_data->hdop;//Horizontal_Accuracy (meters) //水平精度
-    csd.dData[6] = gps_data->vdop;//Vertical_Accuracy (meters) //垂直精度
-    csd.dData[7] = 0;  //水平精度衰减因子
-    csd.dData[8] = 0; //垂直精度衰减因子
-    CWM_CustomSensorInput(&csd); 
-
-    CWM_OS_dbgPrintf("gps_data->location.lat:%f\n",gps_data->location.lat);
-    CWM_OS_dbgPrintf("gps_data->location.lng:%f\n",gps_data->location.lng);
-    CWM_OS_dbgPrintf("gps_data->location.alt:%f\n",gps_data->location.alt);
-    CWM_OS_dbgPrintf("gps_data->ground_course:%f\n",gps_data->ground_course);
-    CWM_OS_dbgPrintf("gps_data->ground_speed:%f\n",gps_data->ground_speed);
-    CWM_OS_dbgPrintf("gps_data->hdop:%f\n",gps_data->hdop);
-    CWM_OS_dbgPrintf("gps_data->vdop:%f\n",gps_data->vdop);
-
 #endif
 }
 
index a38e2d0..a523acf 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-03-13 15:08:38
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-06-09 11:37:07
+ * @LastEditTime: 2025-06-25 15:10:29
  * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c
  * @Description: 
  * 
@@ -34,7 +34,7 @@
 #endif
 
 #ifdef PPG_GH3X2X
-#include "gh3x2x_afe_drv.h"
+// #include "gh3x2x_afe_drv.h"
 #endif
 
 
@@ -111,7 +111,7 @@ uint16_t ppg_get_chip_id(void)
 #elif defined PPG_PAH8009
     chip_id = pah8009_get_chip_id();
 #elif defined PPG_GH3X2X
-    chip_id = GH3X2X_AFE_GetChipId();
+    // chip_id = GH3X2X_AFE_GetChipId();
 #endif
         ppg_power_off();
     return chip_id;
@@ -153,7 +153,7 @@ void ppg_send_cmd_to_driver(char* mode, uint8_t enable)
 #elif defined PPG_PAH8009
     pah8009_control(mode,enable);
 #elif defined PPG_GH3X2X
-    gh3x2x_control(mode,enable);
+    // gh3x2x_control(mode,enable);
 #endif
     if(!enable)
         ppg_power_off();
index 31c7b91..de2b195 100644 (file)
@@ -9,6 +9,7 @@ set(SOURCES ${SOURCES}
     ${CMAKE_CURRENT_SOURCE_DIR}/sensor/pah800x_bsp.c
     ${CMAKE_CURRENT_SOURCE_DIR}/sensor/pah800x_main.c
     ${CMAKE_CURRENT_SOURCE_DIR}/factory/pah800x_factory_test.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/pah_hr/V303009/test_library_HRD.c
 )
 set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/sensor
@@ -44,7 +45,7 @@ set(MAIN_COMPONENT
 )
 
 find_library(LIB_PATH_SPO2 algorithm/pah_spo2/V703/libv703_0_1.a ${CMAKE_CURRENT_SOURCE_DIR})
-find_library(LIB_PATH_HR algorithm/pah_hr/V303009/libv307009_4.a ${CMAKE_CURRENT_SOURCE_DIR})
+find_library(LIB_PATH_HR algorithm/pah_hr/V303009/libv308509_2.a ${CMAKE_CURRENT_SOURCE_DIR})
 
 target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive ${LIB_PATH_HR} ${LIB_PATH_SPO2} PRIVATE -Wl,--whole-archive)
 
index 7085701..4cecb6b 100644 (file)
@@ -40,14 +40,14 @@ void test_library_HRD(void)
                PxiAlg_SetQualityThreshold(0.35f); \r
                PxiAlg_SetHRSmoothWeight(0.9f); \r
                PxiAlg_SetProcWindow(5.0f, 5.0f); \r
-         PxiAlg_SetTimeoutLength(30.0f);\r
-               PxiAlg_SetMemsScale(1);               //MEMS 2/4/8/16G : 0/1/2/3\r
+               PxiAlg_SetTimeoutLength(30.0f);\r
+               PxiAlg_SetMemsScale(3);              //MEMS 2/4/8/16G : 0/1/2/3\r
                PxiAlg_SetSkipSampleNum(10); \r
-               PxiAlg_SetMemsScaleBase(1, 0);  //MEMS 2/4/8/16G : 0/1/2/3\r
-               PxiAlg_SetForceOutputLink(0, 150, 40, 1, 0.9f); \r
+               PxiAlg_SetMemsScaleBase(3, 0);    //MEMS 2/4/8/16G : 0/1/2/3\r
+               PxiAlg_SetForceOutputLink(10, 150, 40, 1, 0.9f); \r
                PxiAlg_SetNormalOutput(200, 40, 0); \r
                PxiAlg_SetForceRipple(3, 1); \r
-    //PxiAlg_SetForceOutput(30, 120, 45);\r
+               //PxiAlg_SetForceOutput(30, 120, 45);\r
                //PxiAlg_SetForceOutputTime(10);\r
                PxiAlg_SetPackage(0, 1);\r
        \r
index f824d63..b1225c6 100644 (file)
@@ -507,7 +507,6 @@ void hr_alg_task(void)
                     // data = cywee_wear_status;\r
                     // func(PPG_MSG_TYPE_WEARSTAT_UPDATE, &data, 1);\r
                     time_cnt = 0;\r
-                    hr = 0;\r
                 }\r
 #endif\r
                 report_hr_data(&ppg_mems_data_alg, ret, hr, hr_grader);\r
@@ -1687,10 +1686,10 @@ void pah8009_control(char *mode,uint8_t enable)
             osTimerStop(g_pah8009_timer);\r
 #endif\r
         pah_sensor_stop();\r
-        if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())//处于睡眠监测 且在心率周期检测期间 上报活体佩戴 \r
+        if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())\r
         {\r
             pah8009_wearstatus_update();   \r
-            uapi_dev_runtime_set_hrs_passivity(0);//清除被动检测runtime     \r
+            uapi_dev_runtime_set_hrs_passivity(0); \r
         }\r
     }\r
     else\r
@@ -1717,6 +1716,8 @@ void pah8009_control(char *mode,uint8_t enable)
         } else if (strcmp(mode, "leaklight") == 0) {\r
             // md = FT_LEAK_LIGHT_MODE;\r
             factory_test_mode(factory_test_leak_light_target_sample, 0, 0, 0, 0);\r
+            // extern void test_library_HRD(void);\r
+            // test_library_HRD();\r
         } else if (strcmp(mode, "wear") == 0) {\r
             pah_sensor_init(diw_4mm_g_ir_hrd);\r
             touch_only_sensor_start();\r
index f02f9dc..170110e 100644 (file)
@@ -45,7 +45,7 @@
 #ifdef PAH_800x_ENABLE_LOG_PRINT\r
 #define LOG_PRINT(fmt, ...)                    \\r
     do {                                      \\r
-        PRINT(fmt" ", ##__VA_ARGS__);     \\r
+        printf(fmt" ", ##__VA_ARGS__);     \\r
     } while (0)\r
 #else\r
 #define LOG_PRINT(...) do {} while (0)\r
@@ -53,7 +53,7 @@
 #ifdef PAH_800x_ENABLE_DEBUG_PRINT\r
 #define DEBUG_PRINT(fmt, ...)                    \\r
     do {                                      \\r
-        PRINT(fmt" ", ##__VA_ARGS__);     \\r
+        printf(fmt" ", ##__VA_ARGS__);     \\r
     } while (0) \r
 #else\r
 #define DEBUG_PRINT(...) do {} while (0)\r
index 9b47c20..b855bda 100644 (file)
@@ -57,8 +57,7 @@ extern "C" {
 #include "vc921x_hal.h"
 #include "vc921x_user_app.h"
 #elif  defined(PPG_GH3X2X)
-#include "gh3x2x_hal.h"
-#include "gh3x2x_afe_drv.h"
+// #include "gh_demo.h"
 #else
 #endif
 
index c316da0..e56618f 100644 (file)
@@ -107,6 +107,7 @@ typedef struct
 
     uint8_t atuoota_status;//是否处于自动ota状态
     uint8_t voice_status;//是否处于使用语音助手
+    uint8_t bp_status;//血压测量状态
 } runtime_status_t;
 
 
@@ -659,3 +660,14 @@ void uapi_dev_runtime_set_restore_factory_status(uint8_t status) {
 uint8_t uapi_dev_runtime_get_restore_factory_status(void) {
   return g_runtime.is_factory_status;
 }
+
+// 设置是否为血压测量状态
+void uapi_dev_runtime_set_bp_status(uint8_t status)
+{
+    g_runtime.bp_status = status;
+}
+// 获取是否为血压测量状态
+uint8_t uapi_dev_runtime_get_bp_status_flag(void)
+{
+    return g_runtime.bp_status;
+}
index 4785050..c311ecf 100644 (file)
@@ -81,7 +81,7 @@ errcode_t uapi_save_runtime_log(uint16_t cmd)
 
     if(custom_running_log_state_stat==0 || g_runtime_log_queue_created==0)
     {
-        PRINT("Error task or queue no ready\r\n");
+        // PRINT("Error task or queue no ready\r\n");
         return ERRCODE_FAIL;
     }
     ret = osal_msg_queue_write_copy(g_custom_runtime_log_cmd_queue, (void *)&mail, sizeof(custom_cmd_t), 0);
index 2d4ff83..3fab3d0 100644 (file)
@@ -1462,6 +1462,10 @@ void uapi_set4GCapability(bool isopen)
     void *tcp_thread_id = NULL;
     if(isopen)
     {
+        if(uapi_dev_runtime_get_cat1_powerstat())
+        {
+            return;
+        }
         uapi_save_runtime_log(RUNTIME_LOG_CAT1_4G_OPEN);
         power_on_cat1();
         // if(!uapi_dev_runtime_get_saveele_status())
@@ -1473,15 +1477,23 @@ void uapi_set4GCapability(bool isopen)
 
         #ifdef SUPPORT_TCPIP
             tcp_thread_id = tcp_get_thread_id();
-            ret = uapi_resume_thread(tcp_thread_id);
-            if(ret != ERRCODE_SUCC)
-                PRINT("tcpip_thread_resume failed ret : %d \n",ret);
-            else
-                PRINT("tcpip_thread_resume succed\n");
+            if(tcp_thread_id != NULL)
+            {
+                ret = uapi_resume_thread(tcp_thread_id);
+                if(ret != ERRCODE_SUCC)
+                    PRINT("tcpip_thread_resume failed ret : %d \n",ret);
+                else
+                    PRINT("tcpip_thread_resume succed\n");
+            }
+
         #endif
     }
     else
     {
+        if(!uapi_dev_runtime_get_cat1_powerstat())
+        {
+            return;
+        }
         uapi_save_runtime_log(RUNTIME_LOG_CAT1_4G_CLOSE);
         power_off_cat1();
         // if(!uapi_dev_runtime_get_saveele_status())
@@ -1499,11 +1511,14 @@ void uapi_set4GCapability(bool isopen)
 
         #ifdef SUPPORT_TCPIP
             tcp_thread_id = tcp_get_thread_id();
-            ret = uapi_suspend_thread(tcp_thread_id);
-            if(ret != ERRCODE_SUCC)
-                PRINT("tcpip_thread_suspend failed ret : %d \n",ret);
-            else
-                PRINT("tcpip_thread_suspend succed\n");
+            if(tcp_thread_id != NULL)
+            {
+                ret = uapi_suspend_thread(tcp_thread_id);
+                if(ret != ERRCODE_SUCC)
+                    PRINT("tcpip_thread_suspend failed ret : %d \n",ret);
+                else
+                    PRINT("tcpip_thread_suspend succed\n");
+            }
         #endif
     }
 }
@@ -2717,10 +2732,8 @@ void uapi_enter_power_saving_mode(void)
     cm_set_A2DP_switch(false);
 
     //关闭cat1
-    if(uapi_dev_runtime_get_cat1_powerstat())
-    {
-        uapi_set4GCapability(false);
-    }
+    uapi_set4GCapability(false);
+    
         
     //停止心率周期检测