#include "config_info.h" #include "getcfg.h" #include "onchip_flash.h" #include "bsp_ser.h" #include "check.h" #include "w25q128.h" #include "encryption_chip.h" #include "ds3231.h" #include "udp.h" u_int8_t g_device_local_ip[21]; u_int8_t g_device_mac[21]; u_int8_t g_device_netmask[21]; u_int8_t g_device_gateway[21]; u_int8_t g_device_term_ip[21]; u_int8_t g_device_a9_ip[21]; u_int8_t g_device_server_ip[21]; u_int8_t g_device_web_ip[21]; int ipStrValid( const char * str_ip,u_int8_t *rvalue); /****************************************************************************** ** 文件名称:config.c ** 功 能:包含所有配置相关的函数 ** 修改日志: ******************************************************************************/ static u_int8_t config_buff[1500]; /****************************************************************************** ** 文件名称:read_config_file ** 功 能:从片内flash中读ini文件 ** 修改日志: ******************************************************************************/ static BOOL read_config_file(void) { if (!app_crc_OK(HY_PKG_TYPE_CFG_FILE)){//校验失败 memset(system_info.cmd_id, 0x30, sizeof(system_info.cmd_id)); term_printf("\n读取配置文件失败\n\r"); return FALSE; } if (!pack_head_verify(HY_PKG_TYPE_CFG_FILE)){//检查包头数据有效性 term_printf("\n读取配置文件失败\n\r"); return FALSE; } return TRUE; } /****************************************************************************** ** 文件名称:get_system_config_from_file(void) ** 功 能:得到配置信息 ** 修改日志: ******************************************************************************/ BOOL get_system_config_from_file(void) { unsigned long ret =1; if (!read_config_file()) return FALSE; /****************************************************************************** [rf]主机类型 *******************************************************************************/ //RF ret = GetConfigFromBuf("rf", "host_type", "0", (char *)&sys_rf.host_type, sizeof(sys_rf.host_type), (char *)config_buff ); if (ret != 0){ sys_rf.host_type -='0'; term_printf("\n获取RF配置信息失败\n\r"); // return FALSE; }else{ term_printf("\n主机类型: "); sys_rf.host_type -='0'; if (sys_rf.host_type == RF_HOST) term_printf("RF(一体机)\n\r"); else if(sys_rf.host_type == RF_RELAY) term_printf("RF(中继主机)\n\r"); else if(sys_rf.host_type == RF_UNDEFINE) term_printf("普通主机(无RF)\n\r"); } //rf_sync_num if(sys_rf.host_type != RF_UNDEFINE){ ret = GetConfigFromBuf("rf", "sync_num", "HY0000", (char *)sys_rf.sync_num, sizeof(sys_rf.sync_num), (char *)config_buff ); if (ret != 0) term_printf("\n获取RF同步号码失败\n\r"); else term_printf("RF同步号码: %s\n\r",sys_rf.sync_num); } /****************************************************************************** [host_mk60_cfg] *******************************************************************************/ //硬件版本号 ret = GetConfigFromBuf("host_mk60_cfg", "hardwarever", "00000000000000", (char *)system_info.hardware_version, sizeof(system_info.hardware_version), (char *)config_buff ); if (ret != 0){ term_printf("\n获取硬件版本号失败\n\r"); }else{ term_printf("硬件版本号: %s\n\r",system_info.hardware_version); } //公司出厂唯一CMDid号 ret = GetConfigFromBuf("host_mk60_cfg", "cmd_id", "HY_OLMS_000000000", (char *)system_info.cmd_id,//终端id sizeof(system_info.cmd_id), (char *)config_buff ); if (ret != 0){ term_printf("\n获取汇源ID失败\n\r"); }else{ term_printf("汇源ID: %s\n\r",system_info.cmd_id); } //公司出厂唯一被监测设备id号 ret = GetConfigFromBuf("host_mk60_cfg", "component_id", "SD__0000000000", (char *)system_info.component_id, sizeof(system_info.component_id), (char *)config_buff ); if (ret != 0){ term_printf("\n获取汇源被监测ID失败\n\r"); }else{ term_printf("汇源被监测ID; %s\n\r",system_info.component_id); } /****************************************************************************** net *******************************************************************************/ //[local] //ip ret = GetConfigFromBuf("local", "ip", "172.16.17.14", (char *)g_device_local_ip, sizeof(g_device_local_ip), (char *)config_buff ); if (ret != 0){ term_printf("获取本地ip地址失败,默认 :%s\n\r",g_device_local_ip); ipStrValid((const char *)g_device_local_ip,g_local_ip); }else{ term_printf("local_ip; %s\n\r",g_device_local_ip); ipStrValid((const char *)g_device_local_ip,g_local_ip); } //mac ret = GetConfigFromBuf("local", "mac", "00:01:00:00:00:02", (char *)g_device_mac, sizeof(g_device_mac), (char *)config_buff ); if (ret != 0){ term_printf("获取mac地址失败,默认 :%s\n\r",g_device_mac); macStrValid((const char *)g_device_mac,g_local_mac); }else{ term_printf("mac; %s\n\r",g_device_mac); macStrValid((const char *)g_device_mac,g_local_mac); } //netmask ret = GetConfigFromBuf("local", "netmask", "255.255.252.0", (char *)g_device_netmask, sizeof(g_device_netmask), (char *)config_buff ); if (ret != 0){ term_printf("获取子网掩码失败,默认netmask: %s\n\r",g_device_netmask); ipStrValid((const char *)g_device_netmask,g_netmask); }else{ term_printf("netmask; %s\n\r",g_device_netmask); ipStrValid((const char *)g_device_netmask,g_netmask); } //gateway ret = GetConfigFromBuf("local", "gateway", "172.16.16.54", (char *)g_device_gateway, sizeof(g_device_gateway), (char *)config_buff ); if (ret != 0){ term_printf("获取网关失败,默认gateway: %s\n\r",g_device_gateway); ipStrValid((const char *)g_device_gateway,g_gateway); }else{ term_printf("gateway; %s\n\r",g_device_gateway); ipStrValid((const char *)g_device_gateway,g_gateway); } //[server] //[term] ret = GetConfigFromBuf("server", "term_ip", "172.16.17.11", (char *)g_device_term_ip, sizeof(g_device_term_ip), (char *)config_buff ); if (ret != 0){ term_printf("获取终端ip地址失败,默认 :%s\n\r",g_device_term_ip); ipStrValid((const char *)g_device_term_ip,net_devices[0].ip); }else{ term_printf("term_ip; %s\n\r",g_device_term_ip); //转换获取的地址 ipStrValid((const char *)g_device_term_ip,net_devices[0].ip); } //a9 ip ret = GetConfigFromBuf("server", "a9_ip", "172.16.16.54", (char *)g_device_a9_ip, sizeof(g_device_a9_ip), (char *)config_buff ); if (ret != 0){ term_printf("获取服务器a9 ip地址失败,默认 :%s\n\r",g_device_a9_ip); ipStrValid((const char *)g_device_a9_ip,net_devices[1].ip); }else{ term_printf("a9_ip; %s\n\r",g_device_a9_ip); ipStrValid((const char *)g_device_a9_ip,net_devices[1].ip); } //web ip ret = GetConfigFromBuf("server", "web_ip", "118.123.114.8", (char *)g_device_web_ip, sizeof(g_device_web_ip), (char *)config_buff ); if (ret != 0){ term_printf("获取web ip地址失败,默认 :%s\n\r",g_device_web_ip); ipStrValid((const char *)g_device_web_ip,net_devices[4].ip); }else{ term_printf("web_ip; %s\n\r",g_device_web_ip); ipStrValid((const char *)g_device_web_ip,net_devices[4].ip); } /****************************************************************************** [cert] *******************************************************************************/ //证书批次号 //batch_num ret = GetConfigFromBuf("cert", "batch_num", "000", (char *)system_info.batch_num, sizeof(system_info.batch_num), (char *)config_buff ); if (ret != 0){ term_printf("\n获取证书批次号失败\n\r"); }else{ term_printf("\n证书批次号: "); term_printf("%s\n\r",system_info.batch_num); } //同一批次证书序列号 ret = GetConfigFromBuf("cert", "serial_num", "0000", (char *)system_info.cert_num, sizeof(system_info.cert_num), (char *)config_buff ); if (ret != 0){ term_printf("\n获取证书序列号失败\n\r"); }else{ term_printf("证书序列号: "); term_printf("%s\n\r",system_info.cert_num); } //申请证书时候的id ret = GetConfigFromBuf("cert", "encryption_id", "ENCRYPTION_000000", (char *)system_info.encryption_id, sizeof(system_info.encryption_id), (char *)config_buff ); if (ret != 0){ term_printf("\n获取申请加密证书设备ID失败\n\r"); }else{ term_printf("申请加密证书设备ID; %s\n\r",system_info.encryption_id); } /****************************************************************************** 电池 *******************************************************************************/ //电池1是否配置 ret = GetConfigFromBuf("bat", "bat1_cfg", "0", (char *)&sys_bat.bat1_cfg, sizeof(sys_bat.bat1_cfg), (char *)config_buff ); if (ret != 0){ sys_bat.bat1_cfg -='0'; term_printf("\n获取电池1功能配置失败\n\r"); }else{ sys_bat.bat1_cfg -='0'; term_printf("\n电池1功能: "); if (sys_bat.bat1_cfg) term_printf("开启\n\r"); else term_printf("关闭\n\r"); } //电池2是否配置 ret = GetConfigFromBuf("bat", "bat2_cfg", "0", (char *)&sys_bat.bat2_cfg, sizeof(sys_bat.bat2_cfg), (char *)config_buff ); if (ret != 0){ sys_bat.bat2_cfg -='0'; term_printf("\n获取电池2功能配置失败\n\r"); }else{ sys_bat.bat2_cfg -='0'; term_printf("电池2功能: "); if (sys_bat.bat2_cfg) term_printf("开启\n\r"); else term_printf("关闭\n\r"); } //电池3是否配置 ret = GetConfigFromBuf("bat", "bat3_cfg", "0", (char *)&sys_bat.bat3_cfg, sizeof(sys_bat.bat3_cfg), (char *)config_buff ); if (ret != 0){ sys_bat.bat3_cfg -='0'; term_printf("\n获取电池3功能配置失败\n\r"); }else{ sys_bat.bat3_cfg -='0'; term_printf("电池3功能: "); if (sys_bat.bat3_cfg) term_printf("开启\n\r"); else term_printf("关闭\n\r"); } //电池4是否配置 ret = GetConfigFromBuf("bat", "bat4_cfg", "0", (char *)&sys_bat.bat4_cfg, sizeof(sys_bat.bat4_cfg), (char *)config_buff ); if (ret != 0){ sys_bat.bat4_cfg -='0'; term_printf("\n获取电池4功能配置失败\n\r"); }else{ sys_bat.bat4_cfg -='0'; term_printf("电池4功能: "); if (sys_bat.bat4_cfg) term_printf("开启\n\r"); else term_printf("关闭\n\r"); } //电池5是否配置 ret = GetConfigFromBuf("bat", "bat5_cfg", "0", (char *)&sys_bat.bat5_cfg, sizeof(sys_bat.bat5_cfg), (char *)config_buff ); if (ret != 0){ sys_bat.bat5_cfg -='0'; term_printf("\n获取电池5功能配置失败\n\r"); }else{ sys_bat.bat5_cfg -='0'; term_printf("电池5功能: "); if (sys_bat.bat5_cfg) term_printf("开启\n\r"); else term_printf("关闭\n\r"); } /****************************************************************************** *******************************************************************************/ //读出FLASH存储的设备总运行时间 Flash_Read((u_int8_t *)&device_work_information,FLASH_DEVICE_WORK_INFO_ADDR_BEGIN,sizeof(device_work_information)); if((device_work_information.head == DEVICE_SAVE_HEAD)&&(device_work_information.end == DEVICE_SAVE_END)){ g_device_last_save_total_working_time = device_work_information.total_work_time; g_send_flow = device_work_information.total_send_flow; g_receive_flow = device_work_information.total_receive_flow; g_hy_send_flow = device_work_information.hy_total_send_flow; g_hy_receive_flow = device_work_information.hy_total_receive_flow; } BSP_OS_TimeDlyMs(10); term_printf("\n国网通道:当月已发送流量:%d\n\r",g_send_flow); term_printf("国网通道:当月已接收流量:%d\n\r",g_receive_flow); term_printf("汇源通道:当月已发送流量:%d\n\r",g_hy_send_flow); term_printf("汇源通道:当月已接收流量:%d\n\r",g_hy_receive_flow); return TRUE; } /****************************************************************************** ** 文件名称: get_key_from_file ** 功 能:从片内flash中读公钥文件 ** 修改日志: ******************************************************************************/ BOOL get_key_from_file(void) { hy_release_file_head h_read; if (!app_crc_OK(HY_PKG_TYPE_PUB_KEY)){//校验失败 term_printf("\n读取安全接入平台公钥文件失败\n\r"); return FALSE; } if (!pack_head_verify(HY_PKG_TYPE_CERT)){//检查包头数据有效性 term_printf("\n读取安全接入平台公钥文件失败\n\r"); return FALSE; } Flash_Read((u_int8_t *)&h_read, KEY_HEAD_BEGIN, sizeof(h_read)); memcpy(system_info.key,&config_buff[4],(h_read.data_len)-4);//copy公钥//150813南瑞测试没有前4个无效字节 term_printf("\n获取安全接入平台公钥成功\n\r");//去掉前4个字节 if (encryption_chip_sm2_import_public_key(1,system_info.key)){ term_printf("向加密芯片导入安全接入平台公钥成功"); }else term_printf("\n向加密芯片导入安全接入平台公钥失败"); return TRUE; } /****************************************************************************** ** 文件名称: get_cert1_from_file ** 功 能:从片外flash中读公钥文件 ** 修改日志: ******************************************************************************/ BOOL get_cert1_from_file(void) { hy_release_file_head h_read; if (!app_crc_OK(HY_PKG_TYPE_CERT)){//校验失败 term_printf("\n读取安全证书文件失败\n\r"); return FALSE; } if (!pack_head_verify(HY_PKG_TYPE_CERT)){//检查包头数据有效性 term_printf("\n读取安全证书文件失败\n\r"); return FALSE; } Flash_Read((u_int8_t *)&h_read, CERT_HEAD_BEGIN, sizeof(h_read)); memcpy(system_info.cert1,config_buff,h_read.data_len);//copy安全证书 system_info.cert1_len = h_read.data_len;//证书长度 if (system_info.cert1_len < 200){ term_printf("\n读取安全证书长度失败\n\r"); return FALSE; } term_printf("\n获取安全证书成功\n\r"); return TRUE; } /****************************************************************************** ** 函数名称:check_sum ** 功 能: ** 修改日志: ******************************************************************************/ static u_int8_t check_sum(u_int8_t *p, int len) { u_int8_t ret = 0; int i = 0; for(; ihead_checksum) - (u_int8_t *)pkg_head) == pkg_head->head_checksum; } /****************************************************************************** ** 函数名称:ext_flash_erase ** 功 能:擦除片外rom中的存储空间 ** 修改日志: ******************************************************************************/ BOOL ext_flash_erase(hy_release_file_head *pkg_head) { u_int32_t total_len = pkg_head->data_len; if(pkg_head->file_type == HY_PKG_TYPE_PUB_KEY){ if((pkg_head->addr + total_len) > KEY_ADDR_END) return FALSE; Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,KEY_HEAD_SECTOR_BEGIN); Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,KEY_SECTOR_BEGIN); }else if(pkg_head->file_type == HY_PKG_TYPE_CERT){ if((pkg_head->addr + total_len) > CERT_ADDR_END) return FALSE; Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CERT_HEAD_SECTOR_BEGIN); Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CERT_SECTOR_BEGIN); }else if(pkg_head->file_type == HY_PKG_TYPE_CFG_FILE){ if((pkg_head->addr + total_len) > CFG_FILE_ADDR_END) return FALSE; Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CFG_FILE_HEAD_SECTOR_BEGIN); Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CFG_FILE_SECTOR_BEGIN); } return TRUE; } /****************************************************************************** ** 函数名称: app_crc_OK ** 功 能:校验已写入片内rom的应用程序包 通过crc16方式校验 ** 修改日志: ******************************************************************************/ BOOL app_crc_OK(u_int8_t file_type) { u_int16_t crc16; hy_release_file_head h_read; u_int8_t crc16_read2[2] = {0x00}; u_int32_t read_addr = 0; u_int32_t read_len = 0; if (file_type == HY_PKG_TYPE_CERT){ Flash_Read((u_int8_t *)&h_read, CERT_HEAD_BEGIN, sizeof(h_read)-1); if(h_read.file_type != HY_PKG_TYPE_CERT) return FALSE; if (!upgrade_pkg_head_checksum_OK(&h_read)) return FALSE; read_addr = CERT_ADDR_BEGIN; }else if (file_type == HY_PKG_TYPE_PUB_KEY){ Flash_Read((u_int8_t *)&h_read, KEY_HEAD_BEGIN, sizeof(h_read)-1); if(h_read.file_type != HY_PKG_TYPE_PUB_KEY) return FALSE; if (!upgrade_pkg_head_checksum_OK(&h_read)) return FALSE; read_addr = KEY_ADDR_BEGIN; }else if (file_type == HY_PKG_TYPE_CFG_FILE){ Flash_Read((u_int8_t *)&h_read,CFG_FILE_HEAD_BEGIN, sizeof(h_read)-1); if(h_read.file_type != HY_PKG_TYPE_CFG_FILE) return FALSE; if (!upgrade_pkg_head_checksum_OK(&h_read)) return FALSE; read_addr = CFG_FILE_ADDR_BEGIN; } CRC16_init(&crc16); //先算包头crc CRC16_update(&crc16,(u_int8_t *)&h_read, sizeof(h_read)-1); read_len = h_read.data_len; //包括crc16内容 if(read_len > 1000) return FALSE; Flash_Read(config_buff, read_addr,read_len); Flash_Read((u_int8_t *)crc16_read2, read_addr+read_len,sizeof(u_int16_t)); CRC16_update(&crc16,config_buff, read_len); return crc16 == *(u_int16_t *)&crc16_read2; } /****************************************************************************** *函数名: write_pack_head_to_ext_flash *功 能:写包头到片外flash中 *参 数: *返回值: *修 改: ******************************************************************************/ BOOL write_pack_head_to_ext_flash(hy_release_file_head *pkg_head) { if(pkg_head->file_type == HY_PKG_TYPE_PUB_KEY){ Flash_Write_MorePage((u_int8_t *)pkg_head,KEY_HEAD_BEGIN,sizeof(*pkg_head)); }else if(pkg_head->file_type == HY_PKG_TYPE_CERT){ Flash_Write_MorePage((u_int8_t *)pkg_head,CERT_HEAD_BEGIN,sizeof(*pkg_head)); }else if(pkg_head->file_type == HY_PKG_TYPE_CFG_FILE){ Flash_Write_MorePage((u_int8_t *)pkg_head,CFG_FILE_HEAD_BEGIN,sizeof(*pkg_head)); } return TRUE; } /****************************************************************************** *函数名: write_file_to_ext_flash *功 能:写文件到外部flash中 *参 数: *返回值: *修 改: ******************************************************************************/ BOOL write_file_to_ext_flash(hy_release_file_head *pkg_head) {; u_int32_t len = pkg_head->data_len + sizeof(u_int16_t); //内容+crc16 u_int32_t write_addr = pkg_head->addr; Flash_Write_MorePage(pkg_head->data,write_addr,len); return TRUE; } /****************************************************************************** *函数名: pack_head_verify *功 能:校验包头数据的有效性 *参 数: *返回值: *修 改: ******************************************************************************/ BOOL pack_head_verify(u_int8_t file_type) { hy_release_file_head pkg_head = {0x00}; u_int32_t read_addr; if (file_type == HY_PKG_TYPE_PUB_KEY){ read_addr = KEY_HEAD_BEGIN; }else if (file_type == HY_PKG_TYPE_CERT){ read_addr = CERT_HEAD_BEGIN; }else if (file_type == HY_PKG_TYPE_CFG_FILE){ read_addr = CFG_FILE_HEAD_BEGIN; } Flash_Read((u_int8_t *)&pkg_head,read_addr, sizeof(pkg_head)-1); //数据长度限制 if((pkg_head.data_len) > (1024*2)) return FALSE; //起始标志检查 if(pkg_head.flag != HY_RELEASE_FILE_FLAG) return FALSE; //头长度检验 if(pkg_head.head_len != (sizeof(pkg_head)-1)) return FALSE; //文件类型检验 boot app cert key cfg_file if((pkg_head.file_type != HY_PKG_TYPE_APP) && (pkg_head.file_type != HY_PKG_TYPE_BOOT_LOADER) && (pkg_head.file_type != HY_PKG_TYPE_CERT) && (pkg_head.file_type != HY_PKG_TYPE_PUB_KEY)&& (pkg_head.file_type != HY_PKG_TYPE_CFG_FILE)) return FALSE; //文件格式版本 if(pkg_head.file_format_ver != 1) return FALSE; if(pkg_head.file_type == HY_PKG_TYPE_APP){ //App //烧写地址检验 if(pkg_head.addr < APP_ADDR_BEGIN) return FALSE; //空间检验 if((pkg_head.addr + pkg_head.data_len) > APP_ADDR_END) return FALSE; }else if(pkg_head.file_type == HY_PKG_TYPE_BOOT_LOADER){ //Bootloader //烧写地址检验 if(pkg_head.addr != 0) //bootloader必须以0为起始地址 return FALSE; //空间检验 if((pkg_head.addr + pkg_head.data_len) > BOOTLOADER_ADDR_END) return FALSE; }else if(pkg_head.file_type == HY_PKG_TYPE_CERT){//CERT //烧写地址 if(pkg_head.addr < CERT_ADDR_BEGIN) return FALSE; //空间检验 if((pkg_head.addr + pkg_head.data_len) > CERT_ADDR_END) return FALSE; }else if(pkg_head.file_type == HY_PKG_TYPE_PUB_KEY){//KEY //烧写地址 if(pkg_head.addr < KEY_ADDR_BEGIN) return FALSE; //空间检验 if((pkg_head.addr + pkg_head.data_len) > KEY_ADDR_END) return FALSE; }else if(pkg_head.file_type == HY_PKG_TYPE_CFG_FILE){//CFG FILE //烧写地址 if(pkg_head.addr < CFG_FILE_ADDR_BEGIN) return FALSE; //空间检验 if((pkg_head.addr + pkg_head.data_len) > CFG_FILE_ADDR_END) return FALSE; } return TRUE; } //擦除片外flash缓存空间 void erase_ext_flash(u_int8_t block_begin,u_int32_t total_len) { int i = 0; int block_count = total_len / Flash_BLOCKBYTE_LENGTH; if(total_len % Flash_BLOCKBYTE_LENGTH) block_count++; for(i = 0; i252) // return 0; dotnumber++; if(dotnumber>3) return 0; j=0; continue; } else if( (str_ip[i]<='9') && (str_ip[i]>='0') ) { p[j++]=str_ip[i]; } else { return 0; } } p[j]=0; k[3]=atoi(p); if(dotnumber!=3) return 0; if(k[3]>=255)//默认不能等于255 广播地址 return 0; memcpy(rvalue,k,4);//拷贝到目标数组中 return 1; };