/* * @Author: mbw * @Date: 2024-10-10 15:50:39 * @LastEditors: mbw && 1600520629@qq.com * @LastEditTime: 2025-03-03 17:06:31 * @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\applications\user_sys.c * @Description: * * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ #include "user_sys.h" #include "board.h" #include "ctype.h" #include "rtthread.h" #include "stdlib.h" #include "bsp_adc.h" #include "bsp_beep.h" #include "bsp_led.h" #include"bsp_button.h" #include "bsp_emv.h" #include "bsp_rtc.h" #include "bsp_flash.h" #include "bsp_h308.h" #include "bsp_hr.h" #include "bsp_nt26k.h" #include "bsp_relay.h" #include "bsp_vin_detection.h" #include "bsp_wdg.h" #include "rtdef.h" #include "bsp_rng.h" #include "at_device_nt26k.h" #include // 包含stdlib.h以使用rand()和srand() #define LOG_TAG "user_sys" #define LOG_LVL LOG_LVL_DBG #include #define K (5 * 1000) volatile rt_uint16_t work_duration = 1; // 工作时长 volatile rt_uint8_t device_life_check = 0; volatile rt_uint8_t device_state_flag = 0; // 设备失效标志 //CRC16-xmode校验 unsigned short crc1021(const char *data, unsigned int length) { uint16_t crc = 0; for( ; length > 0; length--) { crc = crc ^ (*data++ << 8); for(int i=0; i < 8; i++) { if(crc & 0x8000) crc = (crc << 1) ^ 0x1021; else crc <<= 1; } crc &= 0xFFFF; } return crc; } void HexStrToBytes(const char *hexString, unsigned char *byteArray, size_t byteCount) { size_t length = byteCount / 2; for (size_t i = 0; i < length; i++) { unsigned char high = hexString[2 * i]; // 高位字符 unsigned char low = hexString[2 * i + 1]; // 低位字符 // 将高位和低位字符转换为对应的字节 if (high >= '0' && high <= '9') { high = high - '0'; } else if (high >= 'A' && high <= 'F') { high = high - 'A' + 10; } else if (high >= 'a' && high <= 'f') { high = high - 'a' + 10; } else { rt_kprintf("无效的十六进制字符: %c\n", high); } if (low >= '0' && low <= '9') { low = low - '0'; } else if (low >= 'A' && low <= 'F') { low = low - 'A' + 10; } else if (low >= 'a' && low <= 'f') { low = low - 'a' + 10; } else { rt_kprintf("无效的十六进制字符: %c\n", low); } byteArray[i] = (high << 4) | low; // 将高位和低位合并为一个字节 } } // Convert strings to hexadecimal strings and store them in hex_arry void String2Hex(char *hex_arry, char *str) { rt_memset(hex_arry, 0, 2 * (rt_strlen(str) + 1)); for (int i = 0; i < rt_strlen(str); i++) { rt_sprintf(hex_arry + (i * 2), "%02X", str[i]); } } unsigned int ExtractVer(const char **version_ptr) { unsigned int value = 0; while (isdigit(**version_ptr)) { value = value * 10 + (**version_ptr - '0'); (*version_ptr)++; } return value; } // 分割字符串为行 // 提取特定键的值 int Extract_Value(const char *str, const char *key) { const char *start = rt_strstr(str, key); if (start == NULL) { return -1; } start += rt_strlen(key); const char *end = start; while (*end != '\n' && *end != '\0') { end++; } char value_str[end - start + 1]; rt_strncpy(value_str, start, end - start); value_str[end - start] = '\0'; return atoi(value_str); // 将字符串转换为整数 } unsigned int VerToHex(const char *version) { // 确保字符串以 'V' 或 'v' 开头 if (version == NULL || (version[0] != 'V' && version[0] != 'v')) { return 0; // 错误处理 } const char *ptr = version + 1; // 跳过 'V' 或 'v' // 提取主版本号 unsigned int major = ExtractVer(&ptr); if (*ptr != '.') { return 0; // 错误处理,缺少点号 } ptr++; // 跳过点号 // 提取次版本号 unsigned int minor = ExtractVer(&ptr); // 计算最终的十六进制值 unsigned int result = (major << 4) | minor; // 使用位运算左移 return result; } uint32_t ip_to_uint32(const char *ip_str) { uint32_t ip = 0; int octet = 0; // 0-3 int part = 0; // 0-3 while (*ip_str) { if (*ip_str == '.') { if (octet > 3 || part > 255) { return 0; // 无效的 IP 地址 } ip |= (part << (24 - octet * 8)); octet++; part = 0; } else { part = part * 10 + (*ip_str - '0'); } ip_str++; } if (octet != 3 || part > 255) { return 0; // 无效的 IP 地址 } ip |= (part << (24 - octet * 8)); return ip; } int Convert_To_Hex(flash_sever_info *sever_info, uint8_t *hex_array) { // 将 IP 地址转换为字节数组 uint32_t ip_addr = ip_to_uint32(sever_info->server_url); if (ip_addr == 0) { rt_kprintf("Invalid IP address\n"); return -RT_ERROR; } // 将 IP 地址的 4 个字节复制到 hex_array rt_memcpy(hex_array, &ip_addr, 4); uint16_t port = strtol(sever_info->server_port, NULL, 10); rt_memcpy(hex_array + 4, &port, 2); return RT_EOK; } // 利用IMEI号进行错峰延时计算 rt_uint32_t IMEI_Delay(void) { char imei_str[16]; char randon_char[6] = {0}; // 调整数组大小为6 rt_uint32_t random_number = 0; Get_IotImei(imei_str, FLASH_IOT_IMEI_LEN); // 提取 IMEI 的最后 5 位作为种子 rt_strncpy(randon_char, &imei_str[FLASH_IOT_IMEI_LEN - 5], 5); random_number = atoi(randon_char); // 生成随机数 rt_uint32_t imei_delay = (random_number + Get_RandomNumber()) % K; LOG_I("imei_delay: %d", imei_delay); return imei_delay; } int BSP_SYS_Init(void) { BSP_WDG_Init(); BSP_RTC_Init(); BSP_Rng_Init(); BSP_LED_Init(); BSP_RELAY_Init(); BSP_BEEP_Init(); BSP_EMV_Init(); BSP_BUTTON_Init(); BSP_HR_Init(); BSP_Nt26k_Thread_Init(); return 0; }