From cd36c2974be939cbef3d4cd87547111ca7fdd433 Mon Sep 17 00:00:00 2001 From: penglei <1624952103@qq.com> Date: Tue, 1 Jul 2025 16:50:13 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E8=A1=80=E5=8E=8B=E6=95=B0?= =?utf8?q?=E6=8D=AE=E5=8D=8F=E8=AE=AE=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/service_init.c | 8 + .../brandy/brandy_standard/thread_pri_init.c | 13 +- .../producttest/src/testPresenter.cpp | 3 +- .../nativeui/producttest/src/testView.cpp | 3 +- .../nativeui/producttest/src/testcat1.cpp | 4 +- .../factorytest_protocol.c | 9 +- .../factorytest_protocol.h | 2 +- code/sdk/drivers/peripheral/bp/bn02/bn02.c | 106 +- code/sdk/drivers/peripheral/bp/bn02/bn02.h | 14 +- .../drivers/peripheral/bp/service/bp_at_cmd.c | 38 +- .../peripheral/bp/service/bp_ble_service.c | 113 +- .../peripheral/bp/service/bp_ble_service.h | 2 +- .../peripheral/bp/service/bp_service.c | 35 + .../peripheral/bp/service/bp_service.h | 6 +- .../peripheral/bp/service/bp_tcp_server.c | 2399 ++++++++++++++--- .../peripheral/bp/service/bp_tcp_server.h | 15 +- .../peripheral/config/include/ConfigModelC.h | 4 +- .../peripheral/config/src/ConfigModel.cpp | 9 + .../drivers/peripheral/cywee/Inc/cywee_hal.h | 3 + .../peripheral/cywee/Inc/cywee_service.h | 5 +- .../peripheral/cywee/service/cywee_service.c | 6 + .../drivers/peripheral/cywee/src/main_dml.c | 53 +- code/sdk/drivers/peripheral/ppg/hal/ppg_hal.c | 8 +- .../peripheral/ppg/pah8009/CMakeLists.txt | 3 +- .../pah_hr/V303009/test_library_HRD.c | 10 +- .../ppg/pah8009/sensor/pah800x_main.c | 7 +- .../ppg/pah8009/sensor/pah_800x_config.h | 4 +- .../peripheral/ppg/service/ppg_service.cpp | 3 +- .../drivers/peripheral/utils/custom_runtime.c | 12 + .../peripheral/utils/custom_save_runtime.c | 2 +- .../drivers/peripheral/utils/custom_utils.c | 41 +- 31 files changed, 2428 insertions(+), 512 deletions(-) diff --git a/code/sdk/application/brandy/brandy_standard/service_init.c b/code/sdk/application/brandy/brandy_standard/service_init.c index d6ce281ce..cd9652855 100755 --- a/code/sdk/application/brandy/brandy_standard/service_init.c +++ b/code/sdk/application/brandy/brandy_standard/service_init.c @@ -72,6 +72,9 @@ #ifdef SUPPORT_AT_CAT1 #include "cat1_at_cmd.h" #endif +#ifdef SUPPORT_AT_BP +#include "bp_at_cmd.h" +#endif #include "log_file.h" #ifdef CONFIG_OTA_UPDATE_SUPPORT @@ -170,6 +173,11 @@ static void register_at_service(void) at_cmd_table_t *rtc_table = get_rtc_cmd_table(&rtc_cmd_count); at_cmd_add_moudle(rtc_table, rtc_cmd_count); #endif +#ifdef SUPPORT_AT_BP + uint32_t bp_cmd_count; + at_cmd_table_t *bp_table = get_bp_cmd_table(&bp_cmd_count); + at_cmd_add_moudle(bp_table, bp_cmd_count); +#endif } #ifdef CONFIG_OTA_UPDATE_SUPPORT diff --git a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c index dbded9ec4..5d9ba253c 100755 --- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c @@ -512,15 +512,7 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG); uapi_Ai_send_service_init(); #ifdef ENABLE_CUSTOM_I2C - custom_i2c_init(I2C_BUS_2); - -#ifdef ENABLE_BN02 - // custom_i2c_init(I2C_BUS_0); - // uapi_bp_service_init(); - // uapi_bp_tcp_server_init(); -#endif - #ifdef ROTARYENCODER_MIXO uapi_mixo_service_init(); #endif @@ -537,6 +529,11 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG); uapi_cywee_service_init(); #endif + #ifdef ENABLE_BN02 + custom_i2c_init(I2C_BUS_0); + uapi_bp_service_init(); + uapi_bp_tcp_server_init(); + #endif #endif #ifdef ENABLE_GYRO diff --git a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testPresenter.cpp index aa56fc4ba..970d02f0f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testPresenter.cpp @@ -286,8 +286,7 @@ namespace OHOS } if(strcmp(view.GetViewId(),"start") == 0) { - if(uapi_dev_runtime_get_cat1_powerstat()) - uapi_set4GCapability(false); + uapi_set4GCapability(false); #ifdef FD230 factorytest_start_aging_test(); #endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testView.cpp b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testView.cpp index 23b1757b7..e5b8e14e4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testView.cpp @@ -916,8 +916,7 @@ namespace OHOS } display_api->set_auto_timeout_function(false); - if(!uapi_dev_runtime_get_factory_test_status_flag()) - uapi_set4GCapability(true); + uapi_set4GCapability(true); start_custom_ble_service(); } diff --git a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testcat1.cpp b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testcat1.cpp index a0ff0cda8..f6d47e636 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testcat1.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testcat1.cpp @@ -275,9 +275,7 @@ namespace OHOS } testcat1ScrollView->Add(label_1_cat1vison_1); - - - power_on_cat1(); + uapi_set4GCapability(true); cat1_getsignal(); cat1_getver(); diff --git a/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c index 48ba46841..a70915396 100644 --- a/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c +++ b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-06-17 14:31:08 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-06-13 16:15:04 + * @LastEditTime: 2025-07-01 16:30:09 * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c * @Description: * @@ -2217,7 +2217,12 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size) } - }else{ + }else if(header.header == BLE_TEST_BN02_HEADER) + { +#ifdef ENABLE_BN02 + bn02_parse_frame(buf,event_size); +#endif + }else{ printf("crc error!\r\n"); return ERRCODE_FAIL; } diff --git a/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h index 3a5d7ad85..a2d2747c9 100644 --- a/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h +++ b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h @@ -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 diff --git a/code/sdk/drivers/peripheral/bp/bn02/bn02.c b/code/sdk/drivers/peripheral/bp/bn02/bn02.c index 11a95eff1..7cbd15c31 100644 --- a/code/sdk/drivers/peripheral/bp/bn02/bn02.c +++ b/code/sdk/drivers/peripheral/bp/bn02/bn02.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-01-16 12:35:15 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-06-12 16:37:28 + * @LastEditTime: 2025-07-01 15:17:47 * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -28,11 +28,15 @@ #define BN02_FILE "user/userdata/bn02.bin" +#define MAX_CNT 48 * 5 * 60 + static int DATA_HANDLE = 1 << 24; static FILE *fp = NULL; static int data_cnt = 0; + +static uint8_t *bn02_data = NULL; // static int data[16 * 5 * 60] = {0}; // int data = ((rxByte[i] & 0xff) << 16) @@ -44,6 +48,7 @@ static int data_cnt = 0; // 其中:DATA_HANDLE = 2^24 + bool Bn02_write_reg(uint8_t data) { uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); @@ -157,30 +162,63 @@ void bn02_int_handle(void) if (reply_data[cnt] >= DATA_HANDLE / 2) reply_data[cnt] -= DATA_HANDLE; - printf("111data[%d]:%d\n",cnt,reply_data[cnt]); + // printf("data[%d]:%d\n",cnt,reply_data[cnt]); // 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]); } - // if(bn02_get_ble_status()) - // { - // bn02_replymsg(reply_data,cnt,1); - // } + do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_DATA_UPLOAD,(void *)reply_data,cnt); + + if(bn02_data && fp) + { + if(data_cnt >= MAX_CNT) + { + if(fwrite(bn02_data,1,data_cnt,fp) != cnt) + printf("bn02 fwrite failed\n"); + else + { + printf("bn02 fwrite succed data_cnt:%d\n",cnt); + data_cnt = 0; + memset(bn02_data,0,MAX_CNT); + } + + } + else + { + printf("data_cnt:%d\n",data_cnt); + memcpy_s(bn02_data + data_cnt,MAX_CNT - data_cnt,bn02_buf,48); + + // for(int i = tcp_data_cnt; i < tcp_data_cnt+len; i ++) + // { + // printf("222data[%d]:%d\n",i,tcp_data[i]); + // } + + data_cnt += 48; + } + } + + if(bn02_get_ble_status()) + bn02_replymsg(bn02_buf,48,1); // if(fp) // { - // data_cnt += cnt; - // if(fwrite(bn02_buf,sizeof(int),cnt,fp) != cnt) - // printf("bn02 fwrite failed\n"); + // if(data_cnt >= 16 * 5 * 60) + // { + + // } // else - // printf("bn02 fwrite succed data_cnt:%d\n",cnt); + // { + // data_cnt += cnt; + // if(fwrite(bn02_buf,sizeof(int),cnt,fp) != cnt) + // printf("bn02 fwrite failed\n"); + // else + // printf("bn02 fwrite succed data_cnt:%d\n",cnt); + // } + // } // printf("data_cnt:%d\n",data_cnt); - - do_bp_tcp_server_send_data((void *)reply_data,cnt); - // if(data_cnt >= 16 * 5 * 60 && fp) // { // int *data_array = (int *)malloc(data_cnt * sizeof(int)); @@ -237,12 +275,22 @@ void bn02_start(void) Bn02_Power_Ctrl(1); bn02_int_init(); Bn02_write_reg(BN02_START_CMD); - // data_cnt = 0; - // fp = fopen(BN02_FILE, "ab+"); - // if(fp == NULL) - // printf("open %s failed\n",BN02_FILE); - // else - // printf("open %s succed\n",BN02_FILE); +#if 0 + if(bn02_data == NULL) + { + bn02_data = malloc(MAX_CNT); + if(bn02_data == NULL) + printf("bn02_data malloc failed\n"); + } + + data_cnt = 0; + + fp = fopen(BN02_FILE, "ab+"); + if(fp == NULL) + printf("open %s failed\n",BN02_FILE); + else + printf("open %s succed\n",BN02_FILE); +#endif } void bn02_stop(void) @@ -251,10 +299,18 @@ void bn02_stop(void) Bn02_write_reg(BN02_STOP_CMD); Bn02_Power_Ctrl(0); - bp_tcp_data_clean(); - // if(fp) - // { - // fclose(fp); - // fp = NULL; - // } + // do_bp_tcp_server_send_data(BP_TCP_SERVICE_CMD_SERVER_DEINIT,NULL,0); + +#if 0 + if(fp != NULL) + { + fclose(fp); + fp = NULL; + } + if(bn02_data != NULL) + { + free(bn02_data); + bn02_data = NULL; + } +#endif } diff --git a/code/sdk/drivers/peripheral/bp/bn02/bn02.h b/code/sdk/drivers/peripheral/bp/bn02/bn02.h index c4216a982..497af30c3 100644 --- a/code/sdk/drivers/peripheral/bp/bn02/bn02.h +++ b/code/sdk/drivers/peripheral/bp/bn02/bn02.h @@ -2,30 +2,18 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-01-16 12:35:15 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-01-16 14:55:48 + * @LastEditTime: 2025-06-20 15:41:34 * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #ifndef _BN02_H_ #define _BN02_H_ -enum -{ - - BN02_INT_HANDLE, - BN02_INIT_ENABLE, - BN02_START, - BN02_POWER_DISABLE, - BN02_STOP, -}; - #define BN02_START_CMD 0x04 #define BN02_STOP_CMD 0x08 void bn02_int_handle(void); - void bn02_start(void); - void bn02_stop(void); #endif // _HRS3300_H_ diff --git a/code/sdk/drivers/peripheral/bp/service/bp_at_cmd.c b/code/sdk/drivers/peripheral/bp/service/bp_at_cmd.c index f9771b400..14ec573c5 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_at_cmd.c +++ b/code/sdk/drivers/peripheral/bp/service/bp_at_cmd.c @@ -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) diff --git a/code/sdk/drivers/peripheral/bp/service/bp_ble_service.c b/code/sdk/drivers/peripheral/bp/service/bp_ble_service.c index 995dd8b5b..abb388eed 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_ble_service.c +++ b/code/sdk/drivers/peripheral/bp/service/bp_ble_service.c @@ -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> 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; } diff --git a/code/sdk/drivers/peripheral/bp/service/bp_ble_service.h b/code/sdk/drivers/peripheral/bp/service/bp_ble_service.h index ace1004f6..382779e2e 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_ble_service.h +++ b/code/sdk/drivers/peripheral/bp/service/bp_ble_service.h @@ -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 */ diff --git a/code/sdk/drivers/peripheral/bp/service/bp_service.c b/code/sdk/drivers/peripheral/bp/service/bp_service.c index e8bf0864a..caf0f875a 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_service.c +++ b/code/sdk/drivers/peripheral/bp/service/bp_service.c @@ -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"); diff --git a/code/sdk/drivers/peripheral/bp/service/bp_service.h b/code/sdk/drivers/peripheral/bp/service/bp_service.h index ba02c9a9d..028050f47 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_service.h +++ b/code/sdk/drivers/peripheral/bp/service/bp_service.h @@ -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 } diff --git a/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.c b/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.c index fc8fd9437..cbabd1a4c 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.c +++ b/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.c @@ -12,210 +12,1870 @@ #include "custom_utils.h" #include "bp_tcp_server.h" #include "custom_runtime.h" -// #include "custom_runtime.h" -/*** - * 其他cmd在Header里定义,对外开放 -*/ +#include +#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 +// #include +#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; } diff --git a/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.h b/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.h index b20a90adc..6f224d769 100644 --- a/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.h +++ b/code/sdk/drivers/peripheral/bp/service/bp_tcp_server.h @@ -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 diff --git a/code/sdk/drivers/peripheral/config/include/ConfigModelC.h b/code/sdk/drivers/peripheral/config/include/ConfigModelC.h index 8e6291b37..009b0333a 100644 --- a/code/sdk/drivers/peripheral/config/include/ConfigModelC.h +++ b/code/sdk/drivers/peripheral/config/include/ConfigModelC.h @@ -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]); diff --git a/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp b/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp index 401cbbc31..983209617 100644 --- a/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp +++ b/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp @@ -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); diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h b/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h index 4a86e89a9..cf4b32672 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h @@ -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() diff --git a/code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h b/code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h index 4f7841902..409bffd46 100644 --- a/code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h +++ b/code/sdk/drivers/peripheral/cywee/Inc/cywee_service.h @@ -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); diff --git a/code/sdk/drivers/peripheral/cywee/service/cywee_service.c b/code/sdk/drivers/peripheral/cywee/service/cywee_service.c index b40f7a25b..accec4d87 100644 --- a/code/sdk/drivers/peripheral/cywee/service/cywee_service.c +++ b/code/sdk/drivers/peripheral/cywee/service/cywee_service.c @@ -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; diff --git a/code/sdk/drivers/peripheral/cywee/src/main_dml.c b/code/sdk/drivers/peripheral/cywee/src/main_dml.c index 66e3109d7..ca486195d 100644 --- a/code/sdk/drivers/peripheral/cywee/src/main_dml.c +++ b/code/sdk/drivers/peripheral/cywee/src/main_dml.c @@ -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 } diff --git a/code/sdk/drivers/peripheral/ppg/hal/ppg_hal.c b/code/sdk/drivers/peripheral/ppg/hal/ppg_hal.c index a38e2d030..a523acfdd 100644 --- a/code/sdk/drivers/peripheral/ppg/hal/ppg_hal.c +++ b/code/sdk/drivers/peripheral/ppg/hal/ppg_hal.c @@ -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(); diff --git a/code/sdk/drivers/peripheral/ppg/pah8009/CMakeLists.txt b/code/sdk/drivers/peripheral/ppg/pah8009/CMakeLists.txt index 31c7b91e9..de2b19543 100644 --- a/code/sdk/drivers/peripheral/ppg/pah8009/CMakeLists.txt +++ b/code/sdk/drivers/peripheral/ppg/pah8009/CMakeLists.txt @@ -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) diff --git a/code/sdk/drivers/peripheral/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c b/code/sdk/drivers/peripheral/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c index 708570159..4cecb6b98 100644 --- a/code/sdk/drivers/peripheral/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c +++ b/code/sdk/drivers/peripheral/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c @@ -40,14 +40,14 @@ void test_library_HRD(void) PxiAlg_SetQualityThreshold(0.35f); PxiAlg_SetHRSmoothWeight(0.9f); PxiAlg_SetProcWindow(5.0f, 5.0f); - PxiAlg_SetTimeoutLength(30.0f); - PxiAlg_SetMemsScale(1); //MEMS 2/4/8/16G : 0/1/2/3 + PxiAlg_SetTimeoutLength(30.0f); + PxiAlg_SetMemsScale(3); //MEMS 2/4/8/16G : 0/1/2/3 PxiAlg_SetSkipSampleNum(10); - PxiAlg_SetMemsScaleBase(1, 0); //MEMS 2/4/8/16G : 0/1/2/3 - PxiAlg_SetForceOutputLink(0, 150, 40, 1, 0.9f); + PxiAlg_SetMemsScaleBase(3, 0); //MEMS 2/4/8/16G : 0/1/2/3 + PxiAlg_SetForceOutputLink(10, 150, 40, 1, 0.9f); PxiAlg_SetNormalOutput(200, 40, 0); PxiAlg_SetForceRipple(3, 1); - //PxiAlg_SetForceOutput(30, 120, 45); + //PxiAlg_SetForceOutput(30, 120, 45); //PxiAlg_SetForceOutputTime(10); PxiAlg_SetPackage(0, 1); diff --git a/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah800x_main.c b/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah800x_main.c index f824d6350..b1225c649 100644 --- a/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah800x_main.c +++ b/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah800x_main.c @@ -507,7 +507,6 @@ void hr_alg_task(void) // data = cywee_wear_status; // func(PPG_MSG_TYPE_WEARSTAT_UPDATE, &data, 1); time_cnt = 0; - hr = 0; } #endif report_hr_data(&ppg_mems_data_alg, ret, hr, hr_grader); @@ -1687,10 +1686,10 @@ void pah8009_control(char *mode,uint8_t enable) osTimerStop(g_pah8009_timer); #endif pah_sensor_stop(); - if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())//处于睡眠监测 且在心率周期检测期间 上报活体佩戴 + if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag()) { pah8009_wearstatus_update(); - uapi_dev_runtime_set_hrs_passivity(0);//清除被动检测runtime + uapi_dev_runtime_set_hrs_passivity(0); } } else @@ -1717,6 +1716,8 @@ void pah8009_control(char *mode,uint8_t enable) } else if (strcmp(mode, "leaklight") == 0) { // md = FT_LEAK_LIGHT_MODE; factory_test_mode(factory_test_leak_light_target_sample, 0, 0, 0, 0); + // extern void test_library_HRD(void); + // test_library_HRD(); } else if (strcmp(mode, "wear") == 0) { pah_sensor_init(diw_4mm_g_ir_hrd); touch_only_sensor_start(); diff --git a/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah_800x_config.h b/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah_800x_config.h index f02f9dcfb..170110e0a 100644 --- a/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah_800x_config.h +++ b/code/sdk/drivers/peripheral/ppg/pah8009/sensor/pah_800x_config.h @@ -45,7 +45,7 @@ #ifdef PAH_800x_ENABLE_LOG_PRINT #define LOG_PRINT(fmt, ...) \ do { \ - PRINT(fmt" ", ##__VA_ARGS__); \ + printf(fmt" ", ##__VA_ARGS__); \ } while (0) #else #define LOG_PRINT(...) do {} while (0) @@ -53,7 +53,7 @@ #ifdef PAH_800x_ENABLE_DEBUG_PRINT #define DEBUG_PRINT(fmt, ...) \ do { \ - PRINT(fmt" ", ##__VA_ARGS__); \ + printf(fmt" ", ##__VA_ARGS__); \ } while (0) #else #define DEBUG_PRINT(...) do {} while (0) diff --git a/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp b/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp index 9b47c200a..b855bdac1 100644 --- a/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp +++ b/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp @@ -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 diff --git a/code/sdk/drivers/peripheral/utils/custom_runtime.c b/code/sdk/drivers/peripheral/utils/custom_runtime.c index c316da099..e56618ffc 100644 --- a/code/sdk/drivers/peripheral/utils/custom_runtime.c +++ b/code/sdk/drivers/peripheral/utils/custom_runtime.c @@ -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; +} diff --git a/code/sdk/drivers/peripheral/utils/custom_save_runtime.c b/code/sdk/drivers/peripheral/utils/custom_save_runtime.c index 4785050e4..c311ecf2e 100644 --- a/code/sdk/drivers/peripheral/utils/custom_save_runtime.c +++ b/code/sdk/drivers/peripheral/utils/custom_save_runtime.c @@ -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); diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index 2d4ff83bb..3fab3d019 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -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); + //停止心率周期检测 -- 2.17.1