#include "custom_utils.h"
#include "bp_tcp_server.h"
#include "custom_runtime.h"
-// #include "custom_runtime.h"
-/***
- * 其他cmd在Header里定义,对外开放
-*/
+#include <dirent.h>
+#include "lwip/ip.h"
+#include "lwip/netif.h"
+#include "lwip/init.h"
+#include "lwip/inet_chksum.h"
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include <lwip/netdb.h>
+// #include <netinet/in.h>
+#include "lwip/inet.h"
+#include "lwip/ip_addr.h"
+#include "pm_definition.h"
+#include "mbedtls/md5.h"
+#include "mbedtls/base64.h"
+#include "cJSON.h"
+
+#define BID "hu4kZYyYMGO"
+#define KEY "tcUpJpeGpsIBXvjG"
+
+#define SERVER_HOST "iot.socket.thisiot.com"
+#define SERVER_PORT 9999
+// 6a0f3a4f7a5f1d9a4b7b8e5c6d7a8f9b
+// 89b67780ac2e2d554f25df8acfabae4f
#define APP_KEY "d8d960b748738c2f29c676baa3f5be64"
-#define NAME "W9"
+#define NAME "海思鸿蒙血压手表"
#define URL_HEADER "https://test.aicaring.com/api/v0"
-#define MAX_CNT 16 * 5 * 60
-static unsigned long g_app_queue= 0xFFFFFFFF;
+#define LOGIN_URL "/entrance/user/login"
+#define ACTIVE_URL "/sinklib/activation"
+#define CREATE_URL "/health/synthesis/create"
+
+
+
+#define MAX_CNT 16 * 5 * 60
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static int *tcp_data = NULL;
+static int tcp_data_cnt = 0;
+
+static int g_listen_sock = -1;
+
+static uint8_t LK_STATUS = 0;
+
+static int bp_sbp = 0;
+static int bp_dbp = 0;
+
+static char *imei = NULL;
+
+//激活码 zzzm3K72zxRRLPX2utu5vMZcM269/8/7ZGOHVvONFt7WPAlQT++RJjzzrHj5v5DdlnmeELWI1FUPVJb96/5mOA==
+
+#define BP_ACTIVE_CODE_FILE "/user/system/bp_active_code.bin"
+#define BP_REQUEST_CODE_FILE "/user/system/bp_request_code.bin"
+#define BP_TOKEN_FILE "/user/system/bp_token.bin"
+
+
+
+struct bp_ipaddr_t
+{
+ osSemaphoreId_t dns_done_sem;
+ ip_addr_t ip;
+};
+
+void bp_get_data(int *sbp,int *dbp)
+{
+ *sbp = bp_sbp;
+ *dbp = bp_dbp;
+ bp_sbp = 0;
+ bp_dbp = 0;
+}
+
+static void bp_save_request_code(char *reqeust_code,int len)
+{
+ if(reqeust_code == NULL || len == 0)
+ return;
+
+ FILE *file = fopen(BP_REQUEST_CODE_FILE, "w");
+ if (!file)
+ {
+ printf("%s open failed\n",BP_REQUEST_CODE_FILE);
+ return;
+ }
+
+ size_t bytes_written = fwrite(reqeust_code, 1, len, file);
+ if (bytes_written != len)
+ printf(" %s fwrite failed\n",BP_REQUEST_CODE_FILE);
+ else
+ printf("reqeust_code: %s fwrite succed\n",reqeust_code);
+
+ fclose(file);
+}
+
+static void bp_save_active_code(char *active_code,int len)
+{
+ if(active_code == NULL || len == 0)
+ return;
+
+ FILE *file = fopen(BP_ACTIVE_CODE_FILE, "w");
+ if (!file)
+ {
+ printf("%s open failed\n",BP_ACTIVE_CODE_FILE);
+ return;
+ }
+
+ size_t bytes_written = fwrite(active_code, 1, len, file);
+ if (bytes_written != len)
+ printf(" %s fwrite failed\n",BP_ACTIVE_CODE_FILE);
+ else
+ printf("active_code: %s fwrite succed\n",active_code);
+
+ fclose(file);
+}
+
+static void bp_get_active_code(char *active_code,int len)
+{
+ if (active_code == NULL || len == 0)
+ {
+ printf("active_code is NULL or len == 0\n");
+ return;
+ }
+
+ char *buffer = (char *)malloc(len);
+ if(buffer == NULL)
+ return;
+
+ FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+ if (!file)
+ {
+ printf("open failed: %s\n", BP_ACTIVE_CODE_FILE);
+ return;
+ }
+
+ // 初始化缓冲区
+ memset(buffer, 0, len);
+
+ // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+ size_t bytes_read = fread(buffer, 1, len - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ printf("active code: %s\n", buffer);
+ } else
+ printf("read active code failed\n");
+
+ memcpy_s(active_code,bytes_read,buffer,bytes_read);
+
+ free(buffer);
+ fclose(file);
+}
+
+static void bp_get_request_code(char *request_code,int len)
+{
+ if (request_code == NULL || len == 0)
+ {
+ printf("request_code is NULL or len == 0\n");
+ return;
+ }
+
+ char *buffer = (char *)malloc(len);
+ if(buffer == NULL)
+ return;
+
+ FILE *file = fopen(BP_REQUEST_CODE_FILE, "r");
+ if (!file)
+ {
+ printf("open failed: %s\n", BP_REQUEST_CODE_FILE);
+ return;
+ }
+
+ // 初始化缓冲区
+ memset(buffer, 0, len);
+
+ // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+ size_t bytes_read = fread(buffer, 1, len - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ printf("active code: %s\n", buffer);
+ } else
+ printf("read active code failed\n");
+
+ memcpy_s(request_code,bytes_read,buffer,bytes_read);
+
+ free(buffer);
+ fclose(file);
+}
+
+static void bp_get_token(char *token,int len)
+{
+ if (token == NULL || len == 0)
+ {
+ printf("token is NULL or len == 0\n");
+ return;
+ }
+
+ char *buffer = (char *)malloc(len);
+ if(buffer == NULL)
+ return;
+
+ FILE *file = fopen(BP_TOKEN_FILE, "r");
+ if (!file)
+ {
+ printf("open failed: %s\n", BP_TOKEN_FILE);
+ return;
+ }
+
+ // 初始化缓冲区
+ memset(buffer, 0, len);
+
+ // 安全读取文件内容(最多len-1字节,留一个位置给\0)
+ size_t bytes_read = fread(buffer, 1, len - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ printf("token: %s\n", buffer);
+ } else
+ printf("read token failed\n");
+
+ memcpy_s(token,bytes_read,buffer,bytes_read);
+
+ free(buffer);
+ fclose(file);
+}
+
+static void bp_save_token(char *token,int len)
+{
+ if(token == NULL || len == 0)
+ return;
+
+ FILE *file = fopen(BP_TOKEN_FILE, "w");
+ if (!file)
+ {
+ printf("%s open failed\n",BP_TOKEN_FILE);
+ return;
+ }
+
+ size_t bytes_written = fwrite(token, 1, len, file);
+ if (bytes_written != len)
+ printf(" %s fwrite failed\n",BP_TOKEN_FILE);
+ else
+ printf("token: %s fwrite succed\n",token);
+
+ fclose(file);
+}
+
+static void dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)
+{
+ struct bp_ipaddr_t *ip_sem = (struct bp_ipaddr_t *)arg;
+ char ip_str[20] = {0};
+
+ // if (ipaddr == NULL) {
+ // printf("DNS解析失败,IP地址为空\n");
+ // (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+ // return;
+ // }
+
+ printf("hostname: %s, ", hostname);
+
+ // 处理IPv4地址(现在ip4是包含addr成员的结构体)
+ if (IP_IS_V4(ipaddr)) {
+ u32_t ip_num = ipaddr->u_addr.ip4.addr; // 直接获取32位地址
+
+ // 分解为4字节打印
+ u8_t byte0 = (ip_num >> 24) & 0xFF;
+ u8_t byte1 = (ip_num >> 16) & 0xFF;
+ u8_t byte2 = (ip_num >> 8) & 0xFF;
+ u8_t byte3 = ip_num & 0xFF;
+ // printf("IPv4: %d.%d.%d.%d\n", byte0, byte1, byte2, byte3);
+
+ // 转换为struct in_addr(已为网络字节序)
+ struct in_addr ipv4_addr;
+ ipv4_addr.s_addr = ip_num;
+ inet_ntop(AF_INET, &ipv4_addr, ip_str, sizeof(ip_str));
+ printf("ip: %s\n", ip_str);
+ }
+
+ // 复制IP地址到上下文
+ if(ipaddr->u_addr.ip4.addr != 0)
+ memcpy(&(ip_sem->ip), ipaddr, sizeof(ip_addr_t));
+ (void)osSemaphoreRelease(ip_sem->dns_done_sem);
+}
+
+int tcp_socket_init(void)
+{
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 0) {
+ uapi_pm_add_sleep_veto(PM_ID_CAT1);
+ }
+
+ struct sockaddr_in server_addr;
+ struct bp_ipaddr_t ip_sem = {0}; // 定义信号量结构
+ int listen_socket = -1;
+
+ // 创建信号量
+ ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
+
+ // 解析域名
+ dns_gethostbyname(SERVER_HOST, &(ip_sem.ip), dns_found, &ip_sem);
+
+ osSemaphoreAcquire(ip_sem.dns_done_sem, 1000 * 5); // 等待 DNS 解析完成
+
+ memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4);
+
+ // 创建套接字
+
+ listen_socket = socket(AF_INET, SOCK_STREAM, 0);
+ if(listen_socket < 0)
+ {
+ int err = errno;
+ printf("socket create errno: %d, reason: %s\n", err, strerror(err));
+ goto FAILED;
+ }
+
+
+ // 设置服务器地址
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(SERVER_PORT);
+
+ // 连接服务器
+ if (connect(listen_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
+ {
+ printf("server_addr.sin_addr.s_addr:%d\n",server_addr.sin_addr.s_addr);
+ int err = errno;
+ printf("connect failed, errno: %d, reason: %s\n", err, strerror(err));
+
+ goto FAILED;
+ }
+
+
+ cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 1) {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
+
+ printf("socket init succed\n");
+ osSemaphoreDelete(ip_sem.dns_done_sem); // 释放信号量
+
+ return listen_socket;
+
+FAILED:
+ if (listen_socket >= 0)
+ {
+ lwip_close(listen_socket);
+ }
+ if (ip_sem.dns_done_sem != NULL)
+ {
+ osSemaphoreDelete(ip_sem.dns_done_sem);
+ }
+ cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (cnt == 1)
+ {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
+ return -1;
+}
+
+void tcp_recv_data_handler(const char *input, int input_len)
+{
+ // 检查输入基本格式
+ if (input_len < 2 || input[0] != '[' || input[input_len-1] != ']')
+ {
+ printf("解析失败: 格式错误(缺少方括号)\n");
+ return;
+ }
+
+ // 移除首尾方括号
+ const char *data = input + 1;
+ size_t data_len = input_len - 2;
+
+ // 查找逗号分隔符
+ const char *comma1 = memchr(data, ',', data_len);
+ const char *comma2 = comma1 ? memchr(comma1 + 1, ',', data_len - (comma1 - data + 1)) : NULL;
+
+ // 解析头部字段(BID*IMEI*长度*指令)
+ const char *star1 = memchr(data, '*', data_len);
+ const char *star2 = star1 ? memchr(star1 + 1, '*', data_len - (star1 - data + 1)) : NULL;
+ const char *star3 = star2 ? memchr(star2 + 1, '*', data_len - (star2 - data + 1)) : NULL;
+
+ if (!star1 || !star2 || !star3)
+ {
+ printf("解析失败: 头部格式错误(缺少星号分隔符)\n");
+ return;
+ }
+
+ // 提取头部各字段
+ const char *bid = data;
+ const char *imei = star1 + 1;
+ const char *len_str = star2 + 1;
+ const char *cmd = star3 + 1;
+
+ size_t bid_len = star1 - data;
+ size_t imei_len = star2 - (star1 + 1);
+ size_t len_str_len = star3 - (star2 + 1);
+ size_t cmd_len = data_len - (star3 - data + 1);
+
+ // 打印头部解析结果
+ // printf("BID: %.*s\n", (int)bid_len, bid);
+ // printf("IMEI: %.*s\n", (int)imei_len, imei);
+ // printf("内容长度: %.*s\n", (int)len_str_len, len_str);
+ // printf("指令: %.*s\n", (int)cmd_len, cmd);
+
+ // 验证IMEI长度(假设为15位)
+ if (imei_len != 15)
+ {
+ printf("解析失败: IMEI长度应为15位,实际: %zu位\n", imei_len);
+ return;
+ }
+
+ // 解析内容长度(16进制转10进制)
+ uint32_t content_len = 0;
+ sscanf(len_str, "%x", &content_len);
+ printf("解析后的内容长度: %u\n", content_len);
+
+ // 处理不同格式情况
+ if (comma1 && comma2)
+ {
+ // 有两个逗号,完整格式
+ size_t status_len = comma2 - (comma1 + 1);
+ size_t base64_len = data_len - (comma2 - data + 1);
+
+ printf("状态码: %.*s\n", (int)status_len, comma1 + 1);
+
+ // 验证状态码
+ if (strncmp(comma1 + 1, "200", status_len) != 0)
+ {
+ printf("解析失败: 状态码必须为200,实际: %.*s\n", (int)status_len, comma1 + 1);
+ return;
+ }
+
+ // Base64解码
+ size_t decoded_len = (base64_len * 3) / 4 + 1;
+ unsigned char *decoded_data = malloc(decoded_len);
+ if (!decoded_data)
+ {
+ printf("解析失败: 内存分配失败\n");
+ return;
+ }
+
+ size_t actual_decoded_len = 0;
+ int ret = mbedtls_base64_decode(decoded_data, decoded_len, &actual_decoded_len,(const unsigned char *)(comma2 + 1), base64_len);
+
+ if (ret != 0)
+ {
+ printf("解析失败: Base64解码失败 (错误码: %d)\n", ret);
+ free(decoded_data);
+ return;
+ }
+ decoded_data[actual_decoded_len] = '\0';
+
+ // 解析JSON数据
+ cJSON *json_data = cJSON_Parse((const char *)decoded_data);
+ free(decoded_data);
+
+ if (!json_data)
+ {
+ printf("解析失败: JSON解析失败,原始数据: %s\n", decoded_data);
+ return;
+ }
+
+ // 打印JSON数据
+ printf("JSON数据: %s\n", cJSON_Print(json_data));
+
+ // 提取关键JSON字段
+ cJSON *status = cJSON_GetObjectItem(json_data, "status");
+ cJSON *data_obj = cJSON_GetObjectItem(json_data, "data");
+ cJSON *activation_code = cJSON_GetObjectItem(data_obj, "activation_code");
+ cJSON *token = cJSON_GetObjectItem(data_obj, "token");
+ cJSON *sbp = cJSON_GetObjectItem(data_obj, "sbp");
+ cJSON *dbp = cJSON_GetObjectItem(data_obj, "dbp");
+
+ if (status && cJSON_IsTrue(status) && data_obj)
+ {
+ if (activation_code)
+ {
+ printf("激活状态: 成功\n");
+ printf("激活码: %s\n", activation_code->valuestring);
+ bp_save_active_code(activation_code->valuestring, strlen(activation_code->valuestring));
+ }
+ if (token)
+ {
+ printf("token: %s\n", token->valuestring);
+ bp_save_token(token->valuestring, strlen(token->valuestring));
+ }
+
+ if (sbp && dbp)
+ {
+ printf("sbp: %d\n", sbp->valueint);
+ bp_sbp = sbp->valueint;
+
+ printf("dbp: %d\n", dbp->valueint);
+ bp_dbp = dbp->valueint;
+
+ if (g_listen_sock >= 0)
+ {
+ lwip_close(g_listen_sock);
+ g_listen_sock = -1;
+ LK_STATUS = 0;
+ }
+
+ }
+ }
+ else
+ {
+ cJSON *error_code = cJSON_GetObjectItem(json_data, "error_code");
+ cJSON *error_msg = cJSON_GetObjectItem(json_data, "error_message");
+ printf("激活状态: 失败\n");
+ printf("错误码: %s\n", error_code ? error_code->valuestring : "未知");
+ printf("错误信息: %s\n", error_msg ? error_msg->valuestring : "未知");
+ }
+
+ cJSON_Delete(json_data);
+ }
+ else
+ {
+ // 无逗号或只有一个逗号,仅处理指令
+ // printf("格式: 仅指令,无状态码和Base64内容\n");
+ printf("指令处理: %.*s\n", (int)cmd_len, cmd);
+
+ // 这里可以添加仅处理指令的逻辑
+ // bp_handle_command(cmd, cmd_len); // 假设存在指令处理函数
+ if(strstr(cmd,"LK") != NULL)
+ {
+ printf("LK succed\n");
+ LK_STATUS = 1;
+ }
+
+ }
+}
+
+
+int tcp_send(int listen_socket, const char *data, size_t size)
+{
+ if (data == NULL || size == 0)
+ return -1;
+
+ uint8_t retry = 0;
+ while(listen_socket < 0 && retry < 5)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ }
+
+ if(listen_socket < 0)
+ return -1;
+
+ int ret = 0;
+
+ // const char *buffer = (const char *)data;
+ const char *buffer = (const char *)malloc(size);
+ if(buffer == NULL)
+ return -1;
+
+ memcpy_s(buffer,size,(const char *)data,size);
+ // printf("size : %d\n",size);
+ // printf("strlen(buffer) : %d\n",strlen(buffer));
+ // printf("buffer : %s\n",buffer);
+
+ size_t total_sent = 0;
+
+ while (total_sent < size)
+ {
+ ssize_t sent = send(listen_socket, buffer + total_sent, size - total_sent, 0);
+ if (sent < 0) {
+ printf("errno : %d\n",errno);
+ // 处理错误情况
+ if (errno == EINTR) {
+ PRINT("被信号中断,继续尝试\n");
+ ret = -1;
+ continue;
+ } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ PRINT("非阻塞模式下暂时无法发送,可选择等待或返回\n");
+ ret = -1;
+ goto FAILED;
+ } else if (errno == ENETUNREACH) {
+ PRINT("网络不可达,检查路由或远程主机状态\n");
+ ret = -1;
+ goto FAILED;
+ }
+ else {
+ PRINT("其他错误(如连接断开)\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+
+ total_sent += sent;
+ }
+ printf("tcp send succed size : %d\n",total_sent);
+ ret = 0;
+FAILED:
+
+ if(buffer != NULL)
+ {
+ free(buffer);
+ buffer = NULL;
+ }
+ return ret;
+}
+
+static int active_md5_sign(const char *data,int data_len,char*md5_str)
+{
+ char md5_buf[16]={0};
+
+ char *code_str = (const char*)malloc(data_len);
+ if(md5_str == NULL)
+ return -1;
+
+ memcpy_s(code_str,data_len,data,data_len);
+ mbedtls_md5_context ctx;
+
+ // 初始化MD5上下文
+ mbedtls_md5_init(&ctx);
+
+ // 开始计算MD5哈希
+ mbedtls_md5_starts(&ctx);
+ // 更新要计算哈希的数据
+ mbedtls_md5_update(&ctx, (const unsigned char *)code_str, data_len);
+
+ // 完成哈希计算
+ mbedtls_md5_finish(&ctx, (unsigned char *)md5_buf);
+
+ // printf("md5_buf\r\n");
+ // for (int i = 0; i < 16; i++) {
+ // printf("%02X\n", (uint8_t)md5_buf[i]);
+ // }
+ // printf("md5_buf end\r\n");
+
+ // 清理MD5上下文
+ mbedtls_md5_free(&ctx);
+ for (int i = 0; i < 16; i++)
+ sprintf(&md5_str[i * 2], "%02x", (uint8_t)md5_buf[i]);
+
+ md5_str[32] = '\0';
+
+ free(code_str);
+
+ return 0;
+}
+
+static void calculate_md5(const char* input, char* md5_str)
+{
+ mbedtls_md5_context md5;
+ unsigned char md5_digest[16] = {0};
+ int i;
+
+ // printf("input:%s\n",input);
+
+ mbedtls_md5_init(&md5);
+ mbedtls_md5_starts(&md5);
+ mbedtls_md5_update(&md5, (const unsigned char*)input, strlen(input));
+ mbedtls_md5_finish(&md5, md5_digest);
+ mbedtls_md5_free(&md5);
+
+ // 转换为十六进制字符串
+ for (i = 0; i < 16; i++) {
+ sprintf(md5_str + i*2, "%02x", md5_digest[i]);
+ }
+ md5_str[32] = '\0'; // 确保字符串终止
+}
+
+int tcp_sign_up(void)
+{
+ int ret = -1;
+ char len_str[5] = {0};
+ sprintf(len_str, "%04x", 2);
+
+ // 获取IMEI
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+ // printf("imei:%s\n", imei);
+
+ // 精确计算head_str长度:BID + * + IMEI + * + len_str + * + LK + \0
+ int head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("LK") + 1;
+ char *head_str = (char *)malloc(head_len);
+ if(head_str == NULL)
+ {
+ printf("head_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(head_str, head_len, "%s*%s*%s*LK", BID,imei,len_str);
+ head_len = strlen(head_str); // 重新计算实际长度
+
+ char md5_str[33] = {0}; // MD5为32字符+1终止符
+
+ // 计算code_str长度:head_str + KEY + \0
+ int code_len = head_len + strlen(KEY) + 1;
+ char *code_str = (char *)malloc(code_len);
+ if(code_str == NULL)
+ {
+ printf("code_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ code_len = strlen(code_str);
+
+ if(active_md5_sign(code_str, code_len, md5_str) != 0)
+ {
+ printf("active_md5_sign failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ // 计算send_str长度:[ + md5_str + head_str + ] + \0
+ int send_len = 1 + strlen(md5_str) + strlen(head_str) + 1 + 1;
+ char *send_str = (char *)malloc(send_len);
+ if(send_str == NULL)
+ {
+ printf("send_str malloc failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+
+ snprintf(send_str, send_len, "[%s%s]", md5_str, head_str);
+ send_len = strlen(send_str);
+
+ // 打印调试信息
+ // printf("md5_str:%s\n", md5_str);
+ // printf("md5_len:%zu\n", strlen(md5_str));
+ // printf("head_len:%d\n", head_len);
+ // printf("head_str:%s\n", head_str);
+ // printf("send_len : %d\n", send_len);
+ // printf("send_str : %s\n", send_str);
+
+ // 发送数据
+ tcp_send(g_listen_sock, send_str, send_len);
+
+FAILED:
+ // 释放资源
+ if(head_str != NULL)
+ {
+ free(head_str);
+ head_str = NULL;
+ }
+ if(code_str != NULL)
+ {
+ free(code_str);
+ code_str = NULL;
+ }
+ if(send_str != NULL)
+ {
+ free(send_str);
+ send_str = NULL;
+ }
+
+ return ret;
+}
+
+void get_request_code(char *req_code)
+{
+ uint32_t req_code_len = 0;
+ char* fact = "hunandongni"; // 获取厂商名字(不超过32个字节的字符串)
+ const unsigned int fact_len = strlen(fact);
+
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ return;
+ }
+ }
+
+ const unsigned int imei_len = strlen(imei);
+ request_validation((unsigned char*)fact, fact_len, (unsigned char*)imei, imei_len, (unsigned char*)req_code, &req_code_len);
+ printf("req_code:%s\n",req_code);
+ printf("req_code_len:%d\n",req_code_len);
+}
+
+/**
+ * 计算cnt个int数据转换为字符串并添加逗号后的Base64编码长度
+ * @param cnt int数据个数
+ * @return Base64编码后的长度,失败返回-1
+ */
+int calculate_base64_length(int cnt)
+{
+ if (cnt <= 0)
+ return -1;
+
+ // 1. 计算int数组转换为字符串的最大可能长度
+ // int的最大字符串长度:11个字符(如"-2147483648")
+ // 每个int后加一个逗号(最后一个int除外)
+ int str_length = cnt * 11 + (cnt - 1);
+
+ // 2. 计算Base64编码长度
+ // Base64编码规则:每3字节明文→4字节编码,不足3字节用'='填充
+ int base64_length = (str_length * 4 + 2) / 3;
+
+ // 3. 确保编码长度足够容纳终止符
+ base64_length += 1; // 预留终止符空间
+
+ return base64_length;
+}
+
+void upload_bp_data(int *data, int cnt)
+{
+#if 0
+ if (data == NULL || cnt == 0 || LK_STATUS == 0)
+ {
+ printf("数据为空或服务器未登录\n");
+ return;
+ }
+
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ char *tail_encode_str = NULL;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+ uint32_t begin_time = 0;
+ uint32_t end_time = 0;
+
+ printf("upload_bp_data\n");
+
+
+/*########################################################################################################*/
+ uint8_t retry = 0;
+ const char *imei = uapi_dev_runtime_get_cat1_imei();
+ while ((imei == NULL || strlen(imei) == 0) && retry < 10) {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0) {
+ printf("获取IMEI失败\n");
+ goto FAILED;
+ }
+
+ printf("imei:%s\n", imei);
+
+ // 分配JSON缓冲区
+ char *json_data = (char *)malloc(512);
+ if (json_data == NULL) {
+ printf("json_data malloc failed\n");
+ goto FAILED;
+ }
+ printf("json_data malloc succed\n");
+
+ // 获取测量时间
+ bp_get_measure_time(&begin_time, &end_time);
+ char *begin_time_str = (char *)malloc(64);
+ char *end_time_str = (char *)malloc(64);
+ if (begin_time_str == NULL || end_time_str == NULL)
+ goto FAILED;
+ uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':', DATE_TIME_DEFULL);
+ uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+ printf("begin_time_str:%s\n", begin_time_str);
+ printf("end_time_str:%s\n", end_time_str);
+
+ // 构建JSON数据前缀部分
+ temp_len = 0;
+ memset(json_data, 0, 512);
+
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ // temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"device_code\":\"%s\",", imei);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_mode\":\"%d\",", 1);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"measure_type\":\"%d\",", 7);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"end_time\":\"%s\",", end_time_str);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"ppg_data\":[");
+
+ if(temp_len > 512)
+ goto FAILED;
+
+ // // 后续Base64编码和数据发送逻辑...
+ // encode_len = 512 * 2;
+ // printf("encode_len : %d\n", encode_len);
+ // encode_str = (char *)malloc(encode_len);
+ // if (encode_str == NULL) {
+ // printf("encode_str 分配失败\n");
+ // goto FAILED;
+ // }
+ // printf("encode_str 分配成功\n");
+
+ // memset(encode_str, 0, encode_len);
+
+ // mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ // (const unsigned char*)json_data, strlen(json_data));
+
+ // printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ // encode_str[output_len] = '\0';
+ // printf("encode_str : %s\n",encode_str);
+
+ char token[64] = {0};
+ bp_get_token(token, 64);
+ printf("bp_get_token:%s\n", token);
+ retry = 0;
+ while(strlen(token) == 0 && retry < 10)
+ {
+ bp_tcp_login();
+ LOS_Msleep(500);
+ bp_get_token(token, 64);
+ }
+
+ // 构建content部分
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + strlen(token) + 1 + 1 + output_len + 1 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str);
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL) {
+ printf("data_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+
+ // 后续Base64编码和数据发送逻辑...
+ encode_len = data_len * 3 / 2;
+ printf("encode_len : %d\n", encode_len);
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL) {
+ printf("encode_str 分配失败\n");
+ goto FAILED;
+ }
+ printf("encode_str 分配成功\n");
+
+ memset(encode_str, 0, encode_len);
+
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ encode_str[output_len] = '\0';
+ printf("encode_str : %s\n",encode_str);
+
+
+ snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str);
+
+ // 完成JSON数据,添加ppg_fs字段
+ temp_len = 0;
+ memset(json_data, 0, 512);
+ temp_len += snprintf(json_data + temp_len, 512 - temp_len, "\"ppg_fs\":\"%d\"}", 81);
+ tail_encode_str = (char *)malloc(32);
+ memset(tail_encode_str, 0, 32);
+ mbedtls_base64_encode((unsigned char*)tail_encode_str, 32, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ if(output_len > 32)
+ goto FAILED;
+ tail_encode_str[output_len] = '\0';
+
+ // 计算数据长度并格式化为16进制
+ // data_len = strlen(data_str);
+ sprintf(len_str, "%04x", data_len + 8 + calculate_base64_length(cnt) + 1 + strlen(tail_encode_str));
+ printf("data_len : %d\n",data_len);
+ // 计算head_str长度
+ // head_len = strlen(BID) + 1 + strlen("864430010001091") + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL) {
+ printf("head_str 分配失败\n");
+ goto FAILED;
+ }
+
+ // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL) {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str, md5_str);
+ if (strlen(md5_str) == 0) {
+ printf("MD5签名失败\n");
+ goto FAILED;
+ }
+
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL) {
+ printf("send_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s", md5_str, head_str,data_str);
+ send_len = strlen(send_str);
+ printf("send_len : %d\n", send_len);
+ printf("send_str : %s\n", send_str);
+
+ tcp_send(g_listen_sock, send_str, send_len);
+
+/*########################################################################################################*/
+
+ // 分块发送ppg_data
+ int ppg_block = 0;
+ int ppg_offset = 0; // 已处理的int数量
+ int total_ints = cnt; // 总int数量
+
+ while (ppg_offset < total_ints) {
+ LOS_Msleep(100);
+ temp_len = 0; // 当前块的字符串长度
+ int ints_in_block = 0; // 当前块包含的int数量
+
+ memset(json_data, 0, 512);
+
+ // 计算当前块最多能容纳多少个int
+ while (temp_len < 512 - 12 && ppg_offset < total_ints) {
+ int num = data[ppg_offset];
+ int written = 0;
+
+ // 如果不是最后一个int,添加数字和逗号
+ if (ppg_offset < total_ints - 1) {
+ written = snprintf(
+ json_data + temp_len,
+ 512 - temp_len,
+ "%d,", num
+ );
+ }
+ // 最后一个int,添加数字但不添加逗号
+ else {
+ written = snprintf(
+ json_data + temp_len,
+ 512 - temp_len,
+ "%d", num
+ );
+ }
+
+ if (written < 0 || written >= 512 - temp_len) {
+ break; // 空间不足,结束当前块
+ }
+
+ temp_len += written;
+ ppg_offset++;
+ ints_in_block++;
+ }
+
+ // 最后一个块需要添加JSON数组结束符号
+ if (ppg_offset == total_ints && temp_len > 0) {
+ json_data[temp_len++] = ']';
+ }
+
+ // 发送当前块
+ if (temp_len > 0) {
+ memset(encode_str, 0, encode_len);
+ mbedtls_base64_encode(
+ (unsigned char*)encode_str,
+ encode_len,
+ &output_len,
+ (const unsigned char*)json_data,
+ temp_len
+ );
+
+ tcp_send(g_listen_sock, encode_str, output_len);
+ printf("已发送ppg数据块 %d,包含 %d 个int,字符串长度: %d encode_str:%s\n",
+ ppg_block, ints_in_block, temp_len,encode_str);
+ }
+
+ ppg_block++;
+ }
+ memset(send_str,0,send_len);
+ send_len = strlen(tail_encode_str) + 1;
+ snprintf(send_str, send_len, "%s]", tail_encode_str);
+ printf("send_len : %d\n", send_len);
+ printf("tail_encode_str : %s\n", tail_encode_str);
+ //发送最终数据
+ tcp_send(g_listen_sock, send_str, send_len);
+
+ ret = 0; // 成功
+
+FAILED:
+
+ if (tail_encode_str != NULL) {
+ free(tail_encode_str);
+ tail_encode_str = NULL;
+ }
+ if (begin_time_str != NULL) {
+ free(begin_time_str);
+ begin_time_str = NULL;
+ }
+ if (end_time_str != NULL) {
+ free(end_time_str);
+ end_time_str = NULL;
+ }
+ if (json_data != NULL) {
+ free(json_data);
+ json_data = NULL;
+ }
+ if (send_str != NULL) {
+ free(send_str);
+ send_str = NULL;
+ }
+ if (code_str != NULL) {
+ free(code_str);
+ code_str = NULL;
+ }
+ if (head_str != NULL) {
+ free(head_str);
+ head_str = NULL;
+ }
+ if (data_str != NULL) {
+ free(data_str);
+ data_str = NULL;
+ }
+ if (encode_str != NULL) {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ printf("free\n");
+
+#else
+ if (data == NULL || cnt == 0)
+ return;
+
+ uint8_t pm_cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (pm_cnt == 0) {
+ uapi_pm_add_sleep_veto(PM_ID_CAT1);
+ }
+
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+ uint32_t begin_time = 0;
+ uint32_t end_time = 0;
+
+ char *encode_header_str = NULL;
+ char *header_json = NULL;
+ int encode_header_len = 0;
+
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+
+
+ printf("imei:%s\n", imei);
+
+ // 获取测量时间
+ bp_get_measure_time(&begin_time, &end_time);
+ char *begin_time_str = (char *)malloc(64);
+ char *end_time_str = (char *)malloc(64);
+ if (begin_time_str == NULL || end_time_str == NULL)
+ goto FAILED;
+ uapi_get_TIME_STR(begin_time, begin_time_str, '-', ':', DATE_TIME_DEFULL);
+ uapi_get_TIME_STR(end_time, end_time_str, '-', ':', DATE_TIME_DEFULL);
+ // printf("begin_time_str:%s\n", begin_time_str);
+ // printf("end_time_str:%s\n", end_time_str);
+
+ // 构建JSON数据前缀部分
+ header_json = (char *)malloc(256);
+ if(header_json == NULL)
+ goto FAILED;
+
+ char token[64] = {0};
+ bp_get_token(token, 64);
+
+ if (strlen(token) == 0)
+ {
+ printf("token get failed\n");
+ goto FAILED;
+ }
+
+ temp_len = 0;
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"headers\":[");
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "{\"key\":\"token\",");
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "\"value\":\"%s\"}", token);
+ temp_len += snprintf(header_json + temp_len,256 - temp_len, "]}");
+
+ if(temp_len > 256)
+ {
+ goto FAILED;
+ }
+
+ encode_header_len = temp_len * 3 / 2;
+ encode_header_str = (char *)malloc(encode_header_len);
+ if(NULL == encode_header_str)
+ {
+ printf("encode_header_str malloc failed\n");
+ goto FAILED;
+ }
+
+ memset(encode_header_str,0, encode_header_len);
+ size_t output_header_len = 0;
+ if(0 != mbedtls_base64_encode((unsigned char*)encode_header_str, encode_header_len, &output_header_len, (const unsigned char*)header_json, temp_len))
+ {
+ printf("encode_header_str base64 encode failed\n");
+ goto FAILED;
+ }
+
+ // 分配JSON缓冲区
+ int json_len = 512 + calculate_base64_length(cnt);
+ char *json_data = (char *)malloc(json_len);
+ if (json_data == NULL)
+ {
+ printf("json_data malloc failed\n");
+ goto FAILED;
+ }
+ // printf("json_data malloc succed\n");
+
+ temp_len = 0;
+ memset(json_data, 0, json_len);
+
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ // temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", "864430010001091");
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"device_code\":\"%s\",", imei);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_mode\":\"%d\",", 1);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"measure_type\":\"%d\",", 7);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"begin_time\":\"%s\",", begin_time_str);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"end_time\":\"%s\",", end_time_str);
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "\"ppg_data\":[");
+
+ for(int i = 0; i < cnt; i++)
+ {
+ if(i == (cnt - 1))
+ {
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d],", data[i]);
+ }
+ else
+ {
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len, "%d,", data[i]);
+ }
+ }
+
+ temp_len += snprintf(json_data + temp_len, json_len - temp_len,"\"ppg_fs\":\"%d\"}", 81);
+
+ if(temp_len > json_len)
+ goto FAILED;
+
+ // 后续Base64编码和数据发送逻辑...
+ encode_len = temp_len * 3 / 2;
+ // printf("encode_len : %d\n", encode_len);
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL)
+ {
+ printf("encode_str malloc failed\n");
+ goto FAILED;
+ }
+
+ memset(encode_str, 0, encode_len);
+
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ // printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ encode_str[output_len] = '\0';
+ // printf("encode_str : %s\n",encode_str);
+
+ // 构建content部分
+ // ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, token, encode_str
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(CREATE_URL) + 1 + output_header_len + 1 + output_len + 1;
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL)
+ {
+ printf("data_str malloc failed\n");
+ goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+
+ snprintf(data_str, data_len, ",POST,%s%s,%s,%s", URL_HEADER, CREATE_URL, encode_header_str, encode_str);
+
+ sprintf(len_str, "%04x", strlen(data_str) + 8);
+ // printf("data_len : %d\n",data_len);
+
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL)
+ {
+ printf("head_str malloc failed\n");
+ goto FAILED;
+ }
+
+ // snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, "864430010001091", len_str);
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei,len_str);
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL)
+ {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ // printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str, md5_str);
+ if (strlen(md5_str) == 0)
+ {
+ printf("MD5 sign failed\n");
+ goto FAILED;
+ }
+
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1;
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL)
+ {
+ printf("send_str malloc failed\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str,data_str);
+ send_len = strlen(send_str);
+ // printf("send_len : %d\n", send_len);
+ // printf("send_str : %s\n", send_str);
+
+ ret = tcp_send(g_listen_sock, send_str, send_len);
+ if(ret != 0)
+ {
+ printf("tcp_send failed\n");
+ goto FAILED;
+ }
+
+
+ // int offset = 0;
+ // while (offset < send_len)
+ // {
+ // size_t chunk_len = (send_len - offset > 1024) ? 1024 : send_len - offset;
+ // // printf("send_str %zu: %.1024s\n", offset / 1024 + 1, send_str + offset);
+ // printf("%.1024s\n",send_str + offset);
+ // offset += chunk_len;
+ // }
+
+ LOS_Msleep(3000);
+
+FAILED:
+
+ if (encode_header_str != NULL)
+ {
+ free(encode_header_str);
+ encode_header_str = NULL;
+ }
+
+ if (header_json != NULL)
+ {
+ free(header_json);
+ header_json = NULL;
+ }
+
+ if (begin_time_str != NULL)
+ {
+ free(begin_time_str);
+ begin_time_str = NULL;
+ }
+
+ if (end_time_str != NULL)
+ {
+ free(end_time_str);
+ end_time_str = NULL;
+ }
+
+ if (json_data != NULL)
+ {
+ free(json_data);
+ json_data = NULL;
+ }
+
+ if (send_str != NULL)
+ {
+ free(send_str);
+ send_str = NULL;
+ }
+
+ if (code_str != NULL)
+ {
+ free(code_str);
+ code_str = NULL;
+ }
+
+ if (head_str != NULL)
+ {
+ free(head_str);
+ head_str = NULL;
+ }
+
+ if (data_str != NULL)
+ {
+ free(data_str);
+ data_str = NULL;
+ }
+
+ if (encode_str != NULL)
+ {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ pm_cnt = pm_veto_get_id_cnt(PM_ID_CAT1);
+ if (pm_cnt == 1) {
+ uapi_pm_remove_sleep_veto(PM_ID_CAT1);
+ }
-static int *tcp_data = NULL;
-static int tcp_data_cnt = 0;
+ // printf("free\n");
+#endif
+}
-const char base64_table[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "0123456789+/";
-
-// {
-// "app_key": "1db74281ece314ba6bbc2b553222cd84",
-// "name": "RH303"
-// "firm": "魔方",
-// "device_code": "DA:19:72:F3:0A:89",
-// "model": "T11",
-// "sensor": {"model": "VC32", "fs": 100},
-// “sinklib_version": "v0.3.0.072522",
-// "request_code":
-// "6+m78fFJkFKu1mzhhL4jKRJTEhJMwvSJFlJhWIgRC8wfyB0HFw8JMURNQ6c3MP/U"
-// }
-
-int base64_encode(char *out, size_t out_len, size_t *out_size, const char *in, size_t in_len)
+int bp_tcp_login(void)
{
- if (out == NULL || out_len == 0 || out_size == NULL || in == NULL || in_len == 0) {
- return -1;
- }
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
- // 计算Base64编码后的最大长度: (in_len + 2) / 3 * 4
- size_t max_out_len = (in_len + 2) / 3 * 4;
+ char len_str[5] = {0};
+ char md5_str[33] = {0};
+ // char json_data[1024] = {0};
- // 检查输出缓冲区是否足够
- if (max_out_len + 1 > out_len) { // +1 for null terminator
- return -2;
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
+ }
+
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
+
+ printf("imei:%s\n", imei);
+
+ char *json_data = (char *)malloc(512);
+ if(json_data == NULL)
+ goto FAILED;
+
+ memset(json_data,0,512);
+
+ char birthday[32] = {0};
+ snprintf(birthday,32,"%d-%d-%d",2002,1,10);
+
+ // 构建JSON数据
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account_type\":\"%d\",", 1);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"account\":\"%s\",", "1624952103@qq.com");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", "penglei");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"password\":\"%s\",", "12345678");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"gender\":\"%d\",", 1); //性别['1': 男, '2': 女, '3':未知]
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"birthday\":\"%s\",", birthday);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"height\":\"%d\",", 173);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"weight\":\"%d\"}", 100);
+
+ if(temp_len > 512)
+ goto FAILED;
+
+ printf("temp_len:%d\n",temp_len);
+ printf("json_data : %s\n", json_data);
+ printf("json_data_len : %d\n", strlen(json_data));
+
+ // encode_len = (temp_len * 4 + 2) / 3 + 1;
+ encode_len = temp_len * 2;
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL) {
+ printf("encode_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(encode_str, 0, encode_len);
+
+ // 执行Base64编码
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ // 确保Base64编码字符串以NULL结尾
+ encode_str[output_len] = '\0';
+ printf("encode_str: %s\n", encode_str);
+
+ // 构建content部分
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(LOGIN_URL) + 1 + 1 + output_len + 1;
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL) {
+ printf("data_str 分配失败\n");
+ goto FAILED;
}
+ memset(data_str, 0, data_len);
+ snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER, LOGIN_URL, encode_str);
+
+ // 计算数据长度并格式化为16进制
+ data_len = strlen(data_str);
+ sprintf(len_str, "%04x", data_len + 8);
+
+ // 计算head_str长度
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL) {
+ printf("head_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+ // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
- uint32_t value = 0;
- size_t i = 0, j = 0;
- uint8_t bytes_remaining = 0;
+ head_len = strlen(head_str);
+
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL) {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_str:%s\n", code_str);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str,md5_str);
+ if(strlen(md5_str) == 0)
+ {
+ printf("MD5签名失败\n");
+ goto FAILED;
+ }
+ // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+ // printf("MD5签名失败\n");
+ // goto FAILED;
+ // }
+
+ // 构建发送字符串
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1; // [ + md5 + head + data + ] + \0
+ printf("计算的send_len : %d\n", send_len);
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL) {
+ printf("send_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+ send_len = strlen(send_str);
+ printf("实际send_len : %d\n", send_len);
+
+ // 打印调试信息
+ printf("md5_str:%s\n", md5_str);
+ printf("md5_len:%zu\n", strlen(md5_str));
+ printf("head_len:%d\n", head_len);
+ printf("head_str:%s\n", head_str);
+ printf("data_len:%d\n", data_len);
+ printf("data_str:%s\n", data_str);
+ printf("send_len : %d\n", send_len);
+ printf("send_str : %s\n", send_str);
+
+ // 发送数据
+ tcp_send(g_listen_sock, send_str, send_len);
+
+ ret = 0; // 成功
+
+FAILED:
+ if (json_data != NULL) {
+ free(json_data);
+ json_data = NULL;
+ }
+ if (send_str != NULL) {
+ free(send_str);
+ send_str = NULL;
+ }
+ if (code_str != NULL) {
+ free(code_str);
+ code_str = NULL;
+ }
+ if (head_str != NULL) {
+ free(head_str);
+ head_str = NULL;
+ }
+ if (data_str != NULL) {
+ free(data_str);
+ data_str = NULL;
+ }
+ if (encode_str != NULL) {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ return ret;
+}
+
+int get_active_code(void)
+{
+ int ret = -1;
+ char *data_str = NULL;
+ int data_len = 0;
+ char *encode_str = NULL;
+ int encode_len = 0;
+ char *head_str = NULL;
+ int head_len = 0;
+ char *code_str = NULL;
+ int code_len = 0;
+ char *send_str = NULL;
+ int send_len = 0;
+ uint32_t output_len = 0;
+ int temp_len = 0;
- *out_size = 0;
+ char len_str[5] = {0};
+ char btaddr_str[64] = {0};
+ char req_code[128] = {0};
+ char md5_str[33] = {0};
+ // char json_data[1024] = {0};
- // 按3字节分组处理
- while (i < in_len) {
- // 读取3字节
- value = 0;
- bytes_remaining = 0;
-
- for (int k = 0; k < 3 && i < in_len; k++) {
- value = (value << 8) | (uint8_t)in[i++];
- bytes_remaining++;
+ if(imei == NULL)
+ {
+ uint8_t retry = 0;
+ while((imei == NULL || strlen(imei) == 0) && retry < 10)
+ {
+ retry++;
+ LOS_Msleep(2000);
+ imei = uapi_dev_runtime_get_cat1_imei();
}
- // 编码为4个Base64字符
- switch (bytes_remaining) {
- case 3:
- out[j++] = base64_table[(value >> 18) & 0x3F];
- out[j++] = base64_table[(value >> 12) & 0x3F];
- out[j++] = base64_table[(value >> 6) & 0x3F];
- out[j++] = base64_table[value & 0x3F];
- break;
-
- case 2:
- out[j++] = base64_table[(value >> 10) & 0x3F];
- out[j++] = base64_table[(value >> 4) & 0x3F];
- out[j++] = base64_table[(value << 2) & 0x3F];
- out[j++] = '='; // 填充等号
- break;
-
- case 1:
- out[j++] = base64_table[(value >> 2) & 0x3F];
- out[j++] = base64_table[(value << 4) & 0x3F];
- out[j++] = '='; // 填充等号
- out[j++] = '='; // 填充等号
- break;
- }
- }
-
- out[j] = '\0'; // 字符串终止符
- *out_size = j;
- return 0;
-}
-
-void get_request_code(char *req_code)
-{
- uint32_t req_code_len = 0;
- char* fact = "zhihuishixun"; // 获取厂商名字(不超过32个字节的字符串)
- const unsigned int fact_len = strlen(fact);
- char* imei = uapi_dev_runtime_get_cat1_imei(); // 获取设备号(12个字节字符串)
- const unsigned int imei_len = strlen(imei);
- request_validation((unsigned char*)fact, fact_len, (unsigned char*)imei, imei_len, (unsigned char*)req_code, &req_code_len);
- printf("req_code:%s\n",req_code);
-}
+ if (imei == NULL || strlen(imei) == 0)
+ {
+ printf("IMEI get failed\n");
+ ret = -1;
+ goto FAILED;
+ }
+ }
-void get_active_code(void)
-{
-#if 0
- char * data_ptr = NULL;
- uint32_t data_len = 0;
- char * encode_str = NULL;
- uint32_t encode_len = 0;
- uint32_t output_len = 0;
- int temp_len = 0;
- int json_data_len = 256;
- char * json_data = NULL;
+ printf("imei:%s\n", imei);
- json_data = malloc(json_data_len);
- if(json_data == NULL)
- goto FAILED;
- memset(json_data,0,json_data_len);
+ char *json_data = (char *)malloc(512);
+ if(json_data == NULL)
+ goto FAILED;
- temp_len += sprintf(json_data + temp_len, "{\"app_key\":\"%s\",", APP_KEY);
- temp_len += sprintf(json_data + temp_len, "{\"name\":\"%s\",", NAME);
- temp_len += sprintf(json_data + temp_len, "\"firm\":\"%s\",", "HENGAI");
+ memset(json_data,0,512);
- uint8_t btaddr[6] = {0};
- uint32_t len = 6;
- uapi_get_nv_btaddr(btaddr, &len);
- uint8_t btaddr_str[64] = {0};
- sprintf((char *)btaddr_str, "%02X:%02X:%02X:%02X:%02X:%02X", btaddr[0], btaddr[1], btaddr[2], btaddr[3], btaddr[4], btaddr[5]);
+ bp_get_request_code(req_code,128);
+ printf("bp_get_request_code:%s\n",req_code);
+ if(strlen(req_code) == 0)
+ {
+ get_request_code(req_code);
+ bp_save_request_code(req_code,strlen(req_code));
+ }
- temp_len += sprintf(json_data + temp_len, "\"device_code\":\"%s\",", btaddr_str);
- temp_len += sprintf(json_data + temp_len, "\"model\":\"%s\",", "T11");
- temp_len += sprintf(json_data + temp_len, "\"sensor\":{\"model\":\"VC32\",\"fs\":%d},", 100);
- temp_len += sprintf(json_data + temp_len, "\"sensor\":{\"model\":\"VC32\",\"fs\":%d},", 100);
- temp_len += sprintf(json_data + temp_len, "\"sinklib_version\":\"%s\",", "v0.5.3.060325");
+ // get_request_code(req_code);
+ // 构建JSON数据
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "{\"app_key\":\"%s\",", APP_KEY);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"name\":\"%s\",", NAME);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"firm\":\"%s\",", "湖南懂你");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"device_code\":\"%s\",", imei);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"model\":\"%s\",", "WATCH C2-C3-C5");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sensor\":{\"model\":\"DN06\",\"fs\":%d},", 81);
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"sinklib_version\":\"%s\",", "v0.5.3.060325");
+ temp_len += snprintf(json_data + temp_len,512-temp_len, "\"request_code\":\"%s\"}", req_code);
+ if(temp_len > 512)
+ goto FAILED;
- char req_code[64] = {0};
- get_request_code(req_code);
- temp_len += sprintf(json_data + temp_len, "\"request_code\":\"%s\"}", req_code);
+ printf("temp_len:%d\n",temp_len);
+ printf("json_data : %s\n", json_data);
+ printf("json_data_len : %d\n", strlen(json_data));
- printf("temp_len:%d\n",temp_len);
+ // encode_len = (temp_len * 4 + 2) / 3 + 1;
+ encode_len = temp_len * 2;
+ encode_str = (char *)malloc(encode_len);
+ if (encode_str == NULL) {
+ printf("encode_str 分配失败\n");
+ goto FAILED;
+ }
+ memset(encode_str, 0, encode_len);
- // base64 body
- encode_len = temp_len * 3 / 2;
- encode_str = malloc(encode_len);
+ // 执行Base64编码
+ mbedtls_base64_encode((unsigned char*)encode_str, encode_len, &output_len,
+ (const unsigned char*)json_data, strlen(json_data));
+
+ printf("Base64编码后长度: %d, 输出长度: %d\n", encode_len, (int)output_len);
+ // 确保Base64编码字符串以NULL结尾
+ encode_str[output_len] = '\0';
+ printf("encode_str: %s\n", encode_str);
- if(encode_str == NULL)
+ // 构建content部分
+ data_len = 1 + strlen("POST") + 1 + strlen(URL_HEADER) + strlen(ACTIVE_URL) + 1 + 1 + output_len + 1;
+ data_str = (char *)malloc(data_len);
+ if (data_str == NULL) {
+ printf("data_str 分配失败\n");
goto FAILED;
+ }
+ memset(data_str, 0, data_len);
+ snprintf(data_str,data_len, ",POST,%s%s,,%s", URL_HEADER,ACTIVE_URL, encode_str);
- memset(encode_str,0,encode_len);
+ // 计算数据长度并格式化为16进制
+ data_len = strlen(data_str);
+ sprintf(len_str, "%04x", data_len + 8);
- if(0 != base64_encode(encode_str, encode_len, &output_len, json_data, temp_len))
- goto FAILED;
+ // 计算head_str长度
+ head_len = strlen(BID) + 1 + strlen(imei) + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ // head_len = strlen(BID) + 1 + 15 + 1 + strlen(len_str) + 1 + strlen("TCP_HTTP") + 1;
+ head_str = (char *)malloc(head_len);
+ if (head_str == NULL) {
+ printf("head_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(head_str, head_len, "%s*%s*%s*TCP_HTTP", BID, imei, len_str);
+ // snprintf(head_str, head_len, "%s*864430010001091*%s*TCP_HTTP", BID, len_str);
+
+ head_len = strlen(head_str);
-
- // content
- data_len = output_len + 128;
- data_ptr = malloc(data_len);
- if(data_ptr == NULL)
- goto FAILED;
+ // 计算MD5
+ code_len = head_len + strlen(KEY) + 1;
+ code_str = (char *)malloc(code_len);
+ if (code_str == NULL) {
+ printf("code_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(code_str, code_len, "%s%s", head_str, KEY);
+ printf("code_str:%s\n", code_str);
+ printf("code_len:%d\n", code_len);
+
+ calculate_md5(code_str,md5_str);
+ if(strlen(md5_str) == 0)
+ {
+ printf("MD5签名失败\n");
+ goto FAILED;
+ }
+ // if (active_md5_sign(code_str, code_len, md5_str) != 0) {
+ // printf("MD5签名失败\n");
+ // goto FAILED;
+ // }
- memset(data_ptr,0,data_len);
+ // 构建发送字符串
+ send_len = 1 + strlen(md5_str) + head_len + data_len + 1 + 1; // [ + md5 + head + data + ] + \0
+ printf("计算的send_len : %d\n", send_len);
+ send_str = (char *)malloc(send_len);
+ if (send_str == NULL) {
+ printf("send_str 分配失败\n");
+ goto FAILED;
+ }
+ snprintf(send_str, send_len, "[%s%s%s]", md5_str, head_str, data_str);
+ send_len = strlen(send_str);
+ printf("实际send_len : %d\n", send_len);
- sprintf(data_ptr, "[XT*YYYYYYYYYYYYYYY*%s*TCP_HTTP,POST,%s%s,,%s", URL_HEADER, "/sinklib/activation/feedback", encode_str);
- data_len = strlen(data_ptr);
+ // 打印调试信息
+ printf("md5_str:%s\n", md5_str);
+ printf("md5_len:%zu\n", strlen(md5_str));
+ printf("head_len:%d\n", head_len);
+ printf("head_str:%s\n", head_str);
+ printf("data_len:%d\n", data_len);
+ printf("data_str:%s\n", data_str);
+ printf("send_len : %d\n", send_len);
+ printf("send_str : %s\n", send_str);
- char *send_str = NULL;
- int send_len = data_len + 64;
- send_str = malloc(send_len);
- if(send_str == NULL)
- goto FAILED;
+ // 发送数据
+ tcp_send(g_listen_sock, send_str, send_len);
-
- char len_str[4] = {0};
- sprintf(len_str, "%04x", data_len+8);
- sprintf(send_str, "[XT*YYYYYYYYYYYYYYY*%s*TCP_HTTP%s]", len_str, data_ptr);
- send_len = strlen(send_str);
+ ret = 0; // 成功
- mmi_protocol_fzd_action_tcp_http(data_ptr, data_len);
-
FAILED:
- if(NULL != send_str)
- {
- lv_mem_free(send_str);
+ if (json_data != NULL) {
+ free(json_data);
+ json_data = NULL;
+ }
+ if (send_str != NULL) {
+ free(send_str);
send_str = NULL;
}
- if(NULL != json_data)
- {
- lv_mem_free(json_data);
- json_data = NULL;
- }
- if(NULL != encode_str)
- {
- lv_mem_free(encode_str);
- encode_str = NULL;
- }
- if(NULL != data_ptr)
- {
- lv_mem_free(data_ptr);
- data_ptr = NULL;
- }
-#endif
+ if (code_str != NULL) {
+ free(code_str);
+ code_str = NULL;
+ }
+ if (head_str != NULL) {
+ free(head_str);
+ head_str = NULL;
+ }
+ if (data_str != NULL) {
+ free(data_str);
+ data_str = NULL;
+ }
+ if (encode_str != NULL) {
+ free(encode_str);
+ encode_str = NULL;
+ }
+
+ return ret;
+}
+
+void bp_check_active_code(char *active_code)
+{
+ char buffer[128] = {0};
+ int buffer_size = 128;
+ FILE *file = fopen(BP_ACTIVE_CODE_FILE, "r");
+ if (file)
+ {
+ memset(buffer, 0, buffer_size);
+ size_t bytes_read = fread(buffer, 1, buffer_size - 1, file);
+ if (bytes_read > 0)
+ {
+ buffer[bytes_read] = '\0';
+ fclose(file);
+ printf("成功读取文件内容\n");
+ memcpy_s(active_code,bytes_read,buffer,bytes_read);
+ return ;
+ } else {
+ printf("文件为空\n");
+ fclose(file);
+ }
+ } else {
+ printf("无法打开文件读取(可能不存在): %s\n", BP_ACTIVE_CODE_FILE);
+ }
+
+ fclose(file);
}
void bp_tcp_data_clean(void)
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,
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)
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;
}
}
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");
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;
}