// // Created by cfif on 21.02.23. // #include "ModemReceiveFunc.h" #include "GonetsCrcs.h" #include "httpd_base_func.h" extern uint8_t bufFreeOperation[1500]; extern uint8_t bufFreeOperationKV[1500]; extern uint8_t bufFillOperation[1500]; //const uint8_t bufFreeOperation[32768]; //extern const uint8_t bufFreeOperationKV[2048]; //extern const uint8_t bufFillOperation[2048]; /* // Создание имени файла из транспортного пакета void createFileFragInbox(char *path, uint32_t dateCreateTransportPacket, uint32_t numberSender, uint32_t numberMessage, char t, char *ext) { char buf[12]; char bufWithPrefix[18]; utoa(dateCreateTransportPacket, buf, 10); toAddPrefixStr(bufWithPrefix, buf, 5); strcat(path, bufWithPrefix); strcat(path, "_"); utoa(numberSender, buf, 10); toAddPrefixStr(bufWithPrefix, buf, 5); strcat(path, bufWithPrefix); strcat(path, "_"); utoa(numberMessage, buf, 10); toAddPrefixStr(bufWithPrefix, buf, 5); strcat(path, bufWithPrefix); buf[0] = t; buf[1] = '\0'; strcat(path, buf); strcat(path, ext); } */ // Создание имени файла void createFileNameForId(char *path, char *basePath, uint32_t id, char *ext) { char buf[12]; char bufWithPrefix[18]; path[0] = '\0'; strcat(path, basePath); utoa(id, buf, 10); toAddPrefixStr(bufWithPrefix, buf, 5); strcat(path, bufWithPrefix); strcat(path, "."); strcat(path, ext); } // Создание имени файла void createFileNameForId_REP_MSK_INF(char *pathRep, char *pathMsk, char *pathInf, char *basePath, uint32_t id) { createFileNameForId(pathRep, basePath, id, "REP"); createFileNameForId(pathMsk, basePath, id, "MSK"); createFileNameForId(pathInf, basePath, id, "INF"); } bool readRepresentationRecvFileRep(tFs *fs, tStructRepresentationPacket *structRepresentationPacket, char *path_dir_frag_inbox_fileName) { FRESULT fr; FIL file; UINT br; fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_READ); if (fr) { return false; } fr = f_read_i(fs, &file, structRepresentationPacket, sizeof(tStructRepresentationPacket), &br); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); return true; } bool readRecvFileInfo(tFs *fs, tFileRecvInfo *fileRecvInfo, char *path_inf_fileName) { /* fileRecvInfo->from = ini_getl("MAIN", "from", 0, path_inf_fileName); fileRecvInfo->mnumFrom = ini_getl("MAIN", "mnumFrom", 0, path_inf_fileName); fileRecvInfo->to = ini_getl("MAIN", "to", 0, path_inf_fileName); fileRecvInfo->chSv = ini_getl("MAIN", "chSv", 0, path_inf_fileName); fileRecvInfo->kvs = ini_getl("MAIN", "kvs", 0, path_inf_fileName); fileRecvInfo->mnum = ini_getl("MAIN", "mnum", 0, path_inf_fileName); fileRecvInfo->dateDay = ini_getl("MAIN", "dateDay", 0, path_inf_fileName); fileRecvInfo->dateMon = ini_getl("MAIN", "dateMon", 0, path_inf_fileName); fileRecvInfo->fileSize = ini_getl("MAIN", "fileSize", 0, path_inf_fileName); fileRecvInfo->isEnd = ini_getl("MAIN", "isEnd", 0, path_inf_fileName); fileRecvInfo->isRecvInbox = ini_getl("MAIN", "isRecvInbox", 0, path_inf_fileName); fileRecvInfo->crc32_MSK = ini_getl("MAIN", "crc32_MSK", 0, path_inf_fileName); fileRecvInfo->crc32_REP = ini_getl("MAIN", "crc32_REP", 0, path_inf_fileName); */ FRESULT fr; FIL file; UINT br; fr = f_open_i(fs, &file, (TCHAR *) path_inf_fileName, FA_READ); if (fr) { return false; } fr = f_read_i(fs, &file, fileRecvInfo, sizeof(tFileRecvInfo), &br); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); return true; } bool writeRecvFileInfo(tFs *fs, tFileRecvInfo *fileRecvInfo, char *path_inf_fileName) { bool result; /* result = ini_putl("MAIN", "from", fileRecvInfo->from, path_inf_fileName); result = ini_putl("MAIN", "mnumFrom", fileRecvInfo->mnumFrom, path_inf_fileName); result = ini_putl("MAIN", "chSv", fileRecvInfo->chSv, path_inf_fileName); result = ini_putl("MAIN", "to", fileRecvInfo->to, path_inf_fileName); result = ini_putl("MAIN", "kvs", fileRecvInfo->kvs, path_inf_fileName); result = ini_putl("MAIN", "mnum", fileRecvInfo->mnum, path_inf_fileName); result = ini_putl("MAIN", "dateDay", fileRecvInfo->dateDay, path_inf_fileName); result = ini_putl("MAIN", "dateMon", fileRecvInfo->dateMon, path_inf_fileName); result = ini_putl("MAIN", "fileSize", fileRecvInfo->fileSize, path_inf_fileName); result = ini_putl("MAIN", "isEnd", fileRecvInfo->isEnd, path_inf_fileName); result = ini_putl("MAIN", "isRecvInbox", fileRecvInfo->isRecvInbox, path_inf_fileName); result = ini_putl("MAIN", "crc32_MSK", fileRecvInfo->crc32_MSK, path_inf_fileName); result = ini_putl("MAIN", "crc32_REP", fileRecvInfo->crc32_REP, path_inf_fileName); */ FRESULT fr; FIL file; UINT bw; fr = f_open_i(fs, &file, (TCHAR *) path_inf_fileName, FA_WRITE | FA_CREATE_ALWAYS); if (fr) { return false; } fr = f_write_i(fs, &file, fileRecvInfo, sizeof(tFileRecvInfo), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); return true; } // Прием пакетов - Создание файлов bool isReceivedCreate(tFs *fs, uint32_t mnum, uint32_t to, tStructTransportPacket *packet, uint8_t *buf, uint32_t buf_len, char *path_dir_info_fileName, char *path_dir_mask_fileName, char *path_dir_frag_inbox_fileName, bool *isCrcUpdate) { FIL file; FRESULT fr; UINT bw; FILINFO fno; *isCrcUpdate = true; uint32_t size = packet->offsetPacket; if (packet->offsetPacket > 0) { uint32_t lenMaskInteger = size / sizeof(bufFreeOperation); uint32_t lenMaskTail = size % sizeof(bufFreeOperation); // Расширение МАСКИ fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE | FA_CREATE_ALWAYS); if (fr) return false; for (uint32_t i = 0; i < lenMaskInteger; ++i) { fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } if (lenMaskTail > 0) { fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } // fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw); fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); // Расширение СООБЩЕНИЯ fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_CREATE_ALWAYS); if (fr) return false; for (uint32_t i = 0; i < lenMaskInteger; ++i) { fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } if (lenMaskTail > 0) { fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } // Запись данных сообщения //fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw); fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); } else { fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE | FA_CREATE_ALWAYS); if (fr) return false; // fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw); fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); // Создание файла сегментов и запись сегмента сообщения fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_CREATE_ALWAYS); if (fr) return false; // fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket), &bw); fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); } // Размер файла fr = f_stat(path_dir_frag_inbox_fileName, &fno); tFileRecvInfo fileRecvInfo; fileRecvInfo.mnum = mnum; fileRecvInfo.from = packet->numberSender; fileRecvInfo.mnumFrom = packet->numberMessage; fileRecvInfo.dateDay = packet->dateCreateTransportPacketDay; fileRecvInfo.dateMon = packet->dateCreateTransportPacketMon; fileRecvInfo.to = to; fileRecvInfo.chSv = 1; fileRecvInfo.kvs = 0; if (packet->dataType == 0) fileRecvInfo.kvs = 1; fileRecvInfo.isEnd = packet->isEnd; fileRecvInfo.fileSize = fno.fsize; fileRecvInfo.isRecvInbox = 0; fileRecvInfo.crc32_MSK = CrcFileFs(fs, path_dir_mask_fileName); fileRecvInfo.crc32_REP = CrcFileFs(fs, path_dir_frag_inbox_fileName); // Создание файла информации bool result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); return result; } // Прием пакетов - Добавление файлов bool isReceivedAppend(tFs *fs, tStructTransportPacket *packet, uint8_t *buf, uint32_t buf_len, char *path_dir_info_fileName, char *path_dir_mask_fileName, char *path_dir_frag_inbox_fileName, bool *isCrcUpdate) { FIL file; FRESULT fr; UINT bw; FILINFO fno; *isCrcUpdate = false; tFileRecvInfo fileRecvInfo; // Чтение файла информации bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); uint32_t crcMSK_Old = fileRecvInfo.crc32_MSK; // Размер файла fr = f_stat(path_dir_mask_fileName, &fno); if (fno.fsize < packet->offsetPacket) { uint32_t size = packet->offsetPacket - fno.fsize; uint32_t lenMaskInteger = size / sizeof(bufFreeOperation); uint32_t lenMaskTail = size % sizeof(bufFreeOperation); // Расширение МАСКИ fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE | FA_OPEN_APPEND); if (fr) return false; for (uint32_t i = 0; i < lenMaskInteger; ++i) { fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } if (lenMaskTail > 0) { fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } // fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)),buf_len - sizeof(tStructTransportPacket),&bw); fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); // Расширение СООБЩЕНИЯ fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_OPEN_APPEND); if (fr) return false; for (uint32_t i = 0; i < lenMaskInteger; ++i) { fr = f_write_i(fs, &file, bufFreeOperation, sizeof(bufFreeOperation), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } if (lenMaskTail > 0) { fr = f_write_i(fs, &file, bufFreeOperation, lenMaskTail, &bw); if (fr) { fr = f_close_i(fs, &file); return false; } } // Запись данных сообщения // fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket),&bw); fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); } else { // Запись маски в файл маски fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_WRITE); if (fr) return false; fr = f_lseek_i(fs, &file, packet->offsetPacket); // fr = f_write_i(fs, &file, (bufFillOperation + sizeof(tStructTransportPacket)),buf_len - sizeof(tStructTransportPacket), &bw); fr = f_write_i(fs, &file, bufFillOperation, buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); // Запись сегментов в файл сообщения fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE); if (fr) return false; fr = f_lseek_i(fs, &file, packet->offsetPacket); // fr = f_write_i(fs, &file, (buf + sizeof(tStructTransportPacket)), buf_len - sizeof(tStructTransportPacket),&bw); fr = f_write_i(fs, &file, buf + sizeof(tStructTransportPacket), buf_len - sizeof(tStructTransportPacket), &bw); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); } // Размер файла fr = f_stat(path_dir_frag_inbox_fileName, &fno); if (packet->dataType == 0) fileRecvInfo.kvs = 1; if (packet->isEnd == 1) fileRecvInfo.isEnd = packet->isEnd; fileRecvInfo.fileSize = fno.fsize; fileRecvInfo.crc32_MSK = CrcFileFs(fs, path_dir_mask_fileName); fileRecvInfo.crc32_REP = CrcFileFs(fs, path_dir_frag_inbox_fileName); // Запись файла информации result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); if (crcMSK_Old != fileRecvInfo.crc32_MSK) { *isCrcUpdate = true; } return true; } //начало--------------------------------------Квитирование приема------------------------------------------------------- //начало--------------------------------------Квитирование приема------------------------------------------------------- //начало--------------------------------------Квитирование приема------------------------------------------------------- bool Kvitin(tFs *fs, tRtcIO *rtcIo, uint32_t numberMessage, uint32_t numberSender, char *path_dir_info_fileName, char *path_dir_mask_fileName, uint8_t *bufKvit, uint32_t *lenPacketKvit, bool *isAll) { // uint32_t sizeBufKvit = 0; uint8_t bufRead[512]; FIL file; FRESULT fr; UINT br; // File read/write count *isAll = false; *lenPacketKvit = 0; tFileRecvInfo fileRecvInfo; // Чтение файла информации bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); if (result == false) { return false; } uint32_t sizeFileFrag = fileRecvInfo.fileSize; // Чтение файла маски uint32_t stepSizeFileFrag = 0; fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_READ); if (fr) return false; fr = f_read_i(fs, &file, bufRead, sizeof(bufRead), &br); if (fr) { fr = f_close_i(fs, &file); return false; } uint32_t lenFieldKvit = 0; if (fileRecvInfo.isEnd) *isAll = true; tStructTransportKvitPacketData *dataKvit = (tStructTransportKvitPacketData *) &bufKvit[0]; uint8_t prefByte; if (bufRead[0] == 0x55) { dataKvit->offsetKvitPacket = 0; ++dataKvit; ++lenFieldKvit; } else { *isAll = false; } prefByte = bufRead[0]; for (;;) { for (uint32_t i = 0; i < br; ++i) { if (stepSizeFileFrag == sizeFileFrag) { break; } if (prefByte != bufRead[i]) { if (bufRead[i] == 0x55) { dataKvit->offsetKvitPacket = stepSizeFileFrag; } if (bufRead[i] == 0x00) { dataKvit->offsetKvitPacket = stepSizeFileFrag; *isAll = false; } ++dataKvit; ++lenFieldKvit; prefByte = bufRead[i]; } ++stepSizeFileFrag; } if ((stepSizeFileFrag == sizeFileFrag) || (br == 0)) { break; } fr = f_read_i(fs, &file, bufRead, sizeof(bufRead), &br); if (fr) { *isAll = false; fr = f_close_i(fs, &file); return false; } } fr = f_close_i(fs, &file); if (*isAll == true) { dataKvit->offsetKvitPacket = 0; lenFieldKvit = 1; } // Если не было последнего пакета if (fileRecvInfo.isEnd == 0) { dataKvit->offsetKvitPacket = fileRecvInfo.fileSize; ++lenFieldKvit; } *lenPacketKvit = lenFieldKvit * 3; return true; } //конец--------------------------------------Квитирование приема------------------------------------------------------- //конец--------------------------------------Квитирование приема------------------------------------------------------- //конец--------------------------------------Квитирование приема------------------------------------------------------- // Сообщение принято целиком bool isReceivedAll(tFs *fs, char *path_dir_info_fileName, char *path_dir_mask_fileName, bool *isAll) { uint8_t bufRead[512]; FIL file; FRESULT fr; UINT br; // File read/write count *isAll = false; tFileRecvInfo fileRecvInfo; // Чтение файла информации bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); if (result == false) { return false; } /* uint32_t sizeFileFrag = 0; uint32_t isEnd = 0; uint32_t isKvit = 0; // Чтение размера файла fr = f_open_i(fs, &file, (TCHAR *) path_dir_info_fileName, FA_READ); if (fr) return false; fr = f_read_i(fs, &file, &sizeFileFrag, 4, &br); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_read_i(fs, &file, &isKvit, 4, &br); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_read_i(fs, &file, &isEnd, 4, &br); if (fr) { fr = f_close_i(fs, &file); return false; } fr = f_close_i(fs, &file); */ uint32_t sizeFileFrag = 0; // Чтение файла маски uint32_t stepSizeFileFrag = 0; fr = f_open_i(fs, &file, (TCHAR *) path_dir_mask_fileName, FA_READ); if (fr) { return false; } //начало--------------------------------------БЕЗ Квитирование приема---------------------------------------------------- //начало--------------------------------------БЕЗ Квитирование приема---------------------------------------------------- //начало--------------------------------------БЕЗ Квитирование приема---------------------------------------------------- for (;;) { fr = f_read_i(fs, &file, bufRead, sizeof(bufRead), &br); if (fr) { fr = f_close_i(fs, &file); return false; } for (uint32_t i = 0; i < br; ++i) { if (stepSizeFileFrag == sizeFileFrag) { break; } if (bufRead[i] == 0) { fr = f_close_i(fs, &file); return true; } ++stepSizeFileFrag; } if ((br == 0) || (stepSizeFileFrag == sizeFileFrag)) break; } //конец--------------------------------------БЕЗ Квитирование приема---------------------------------------------------- //конец--------------------------------------БЕЗ Квитирование приема---------------------------------------------------- //конец--------------------------------------БЕЗ Квитирование приема---------------------------------------------------- fr = f_close_i(fs, &file); if (stepSizeFileFrag == sizeFileFrag) { if (fileRecvInfo.isEnd) { *isAll = true; return true; } else { return true; } } return true; } // Создание заголовка файла входящего сообщения трассировки void createFileHeadFragInboxTrace(char *str, uint32_t numberSender, uint32_t numberRecipient, uint32_t numberMessage, uint32_t kvs, uint32_t typeMessage, char *bufIdFileInBox) { char buf[9]; strcat(str, "&from="); utoa(numberSender, buf, 10); strcat(str, buf); strcat(str, "&to="); utoa(numberRecipient, buf, 10); strcat(str, buf); strcat(str, "&chSv=1"); if ((kvs == 0) || (kvs == 1)) { strcat(str, "&mnum="); utoa(numberMessage, buf, 10); strcat(str, buf); strcat(str, "&kvs=0"); strcat(str, "&subj=file&msg="); strcat(str, bufIdFileInBox); strcat(str, ".DAT"); } // if ((kvs == 8) || (kvs == 4)) { // strcat(str, "&subj=KVITIN&msg="); // } } // Создание заголовка файла входящего сообщения void createFileHeadFragInbox(char *str, uint32_t numberSender, uint32_t numberRecipient, uint32_t numberMessage, uint32_t kvs, uint32_t typeMessage) { char buf[9]; strcat(str, "&from="); utoa(numberSender, buf, 10); strcat(str, buf); strcat(str, "&to="); utoa(numberRecipient, buf, 10); strcat(str, buf); strcat(str, "&chSv=1"); if ((kvs == 0) || (kvs == 1)) { strcat(str, "&mnum="); utoa(numberMessage, buf, 10); strcat(str, buf); if (kvs == 0) { strcat(str, "&kvs=0"); } if (kvs == 1) { strcat(str, "&kvs=1"); } if (typeMessage == 2) { strcat(str, "&subj=file&msg="); } else { strcat(str, "&msg="); } } // if ((kvs == 8) || (kvs == 4)) { // strcat(str, "&subj=KVITIN&msg="); // } } // Получение информации о принятых файлах квитанций bool checkNumSentBoxKvitin(tFs *fs, uint8_t *bufReceivedPacket, uint32_t bufReceivedPacketLen, uint32_t numberSender, uint32_t numberMessage, uint32_t dateCreateTransportPacketMon, uint32_t dateCreateTransportPacketDay) { FRESULT fr; char bufDumpFile[256]; char *end; DIR dj; FILINFO fno; FIL file; char fileName[MAX_LEN_PATH_FS]; struct { int paramcount; char *params_names[MAX_POST_GET_PARAMETERS]; char *params_vals[MAX_POST_GET_PARAMETERS]; } params_uri; uint32_t crc32 = 0xFFFFFFFF; crc32 = GonetsCrc32_noreverse_update(&bufReceivedPacket[sizeof(tStructTransportKvitPacket)], bufReceivedPacketLen - sizeof(tStructTransportKvitPacket), crc32); crc32 = GonetsCrc32_noreverse_finish(crc32); // Путь к файлу в SENTBOX KVITIN char path_sent_fileName[MAX_LEN_PATH_FS]; path_sent_fileName[0] = '\0'; strcat(path_sent_fileName, dir_kvitin); fr = f_findfirst_i(fs, &dj, &fno, path_sent_fileName, "*.ITM"); while (fr == FR_OK && fno.fname[0]) { fileName[0] = '\0'; strcat(fileName, path_sent_fileName); strcat(fileName, fno.fname); fr = f_open_i(fs, &file, (TCHAR *) fileName, FA_READ); if (fr != FR_OK) { fr = f_findnext_i(fs, &dj, &fno); continue; } UINT bytes_read; fr = f_read_i(fs, &file, bufDumpFile, sizeof(bufDumpFile), &bytes_read); if (fr != FR_OK) { fr = f_close_i(fs, &file); fr = f_findnext_i(fs, &dj, &fno); continue; } fr = f_close_i(fs, &file); params_uri.paramcount = extract_uri_ex_parameters(bufDumpFile, params_uri.params_names, params_uri.params_vals, MAX_POST_GET_PARAMETERS); int stepParam = 0; uint32_t fromFile = 0; uint32_t kvt_numFile = 0; uint32_t kvt_monFile = 0; uint32_t kvt_dayFile = 0; uint32_t kvt_crc = 0; for (int i = 0; i < params_uri.paramcount; ++i) { if (strcmp(params_uri.params_names[i], "from") == 0) { fromFile = atoi(params_uri.params_vals[i]); ++stepParam; } if (strcmp(params_uri.params_names[i], "kvt_num") == 0) { kvt_numFile = atoi(params_uri.params_vals[i]); ++stepParam; } if (strcmp(params_uri.params_names[i], "kvt_mon") == 0) { kvt_monFile = atoi(params_uri.params_vals[i]); ++stepParam; } if (strcmp(params_uri.params_names[i], "kvt_day") == 0) { kvt_dayFile = atoi(params_uri.params_vals[i]); ++stepParam; } if (strcmp(params_uri.params_names[i], "kvt_crc") == 0) { ++stepParam; kvt_crc = strtoul(params_uri.params_vals[i], &end, 10); } } if ((numberSender == fromFile) && (numberMessage == kvt_numFile) && (dateCreateTransportPacketMon == kvt_monFile) && (dateCreateTransportPacketDay == kvt_dayFile) && (crc32 == kvt_crc)) { fr = f_closedir_i(fs, &dj); return true; } fr = f_findnext_i(fs, &dj, &fno); } fr = f_closedir_i(fs, &dj); return false; } // Получение информации о принятых файлах bool checkNumSentBox(tFs *fs, tRtcIO *rtc, uint32_t mnum, uint32_t from) { FRESULT fr; char bufDumpFile[256]; DIR dj; FILINFO fno; FIL file; char fileName[MAX_LEN_PATH_FS]; struct { int paramcount; char *params_names[MAX_POST_GET_PARAMETERS]; char *params_vals[MAX_POST_GET_PARAMETERS]; } params_uri; // Количество дней назад for (int j = 0; j < 4; ++j) { // Путь к каталогу с датой char path_sent_dirDate[MAX_LEN_PATH_FS]; path_sent_dirDate[0] = '\0'; time_t timestamp; rtc->get(rtc, ×tamp); timestamp -= j * 24 * 3600; struct tm timestampTM; localtime_r(×tamp, ×tampTM); strftime(path_sent_dirDate, sizeof(path_sent_dirDate), "%Y%m%d", ×tampTM); // Путь к файлу в SENTBOX char path_sent_fileName[MAX_LEN_PATH_FS]; path_sent_fileName[0] = '\0'; strcat(path_sent_fileName, dir_inbox); strcat(path_sent_fileName, path_sent_dirDate); strcat(path_sent_fileName, "/"); fr = f_findfirst_i(fs, &dj, &fno, path_sent_fileName, "*.ITM"); while (fr == FR_OK && fno.fname[0]) { fileName[0] = '\0'; strcat(fileName, path_sent_fileName); strcat(fileName, fno.fname); fr = f_open_i(fs, &file, (TCHAR *) fileName, FA_READ); if (fr != FR_OK) { fr = f_findnext_i(fs, &dj, &fno); continue; } UINT bytes_read; fr = f_read_i(fs, &file, bufDumpFile, sizeof(bufDumpFile), &bytes_read); if (fr != FR_OK) { fr = f_close_i(fs, &file); fr = f_findnext_i(fs, &dj, &fno); continue; } fr = f_close_i(fs, &file); params_uri.paramcount = extract_uri_ex_parameters(bufDumpFile, params_uri.params_names, params_uri.params_vals, MAX_POST_GET_PARAMETERS); int stepParam = 0; uint32_t mnumFile = 0; uint32_t fromFile = 0; for (int i = 0; i < params_uri.paramcount; ++i) { if (strcmp(params_uri.params_names[i], "mnum") == 0) { mnumFile = atoi(params_uri.params_vals[i]); ++stepParam; if (stepParam == 2) break; } if (strcmp(params_uri.params_names[i], "from") == 0) { fromFile = atoi(params_uri.params_vals[i]); ++stepParam; if (stepParam == 2) break; } } if ((stepParam == 2) && (mnum == mnumFile) && (from == fromFile)) { fr = f_closedir_i(fs, &dj); return true; } fr = f_findnext_i(fs, &dj, &fno); } fr = f_closedir_i(fs, &dj); } return false; } // Перенос собранного фрагментированного файла в хранилище принятых сообщений inbox tReceiveBuildResult renameFromFrgToInBox(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, uint32_t idFile, tRtcIO *rtc, char *path_dir_info_fileName, char *path_dir_frag_inbox_fileName, tLoggerInterface *logger) { tFileRecvInfo fileRecvInfo; // Чтение файла информации bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); // Получение информации о принятых файлах if (checkNumSentBox(fs, rtc, fileRecvInfo.mnumFrom, fileRecvInfo.from)) { #ifdef DEBUG_EXT_MODEM char strMessage[128]; strMessage[0] = '\0'; strcat(strMessage, "Сообщение номер "); char buf[12]; utoa(fileRecvInfo.mnumFrom, buf, 10); strcat(strMessage, buf); strcat(strMessage, " от АТ-"); utoa(fileRecvInfo.from, buf, 10); strcat(strMessage, buf); strcat(strMessage, " было принято ранее"); LoggerInfo(logger, "GONEC", strMessage, strlen(strMessage)); #endif return true; } // if (fileRecvInfo.isRecvInbox) { // return true; // } tStructRepresentationPacket structRepresentationPacket; result = readRepresentationRecvFileRep(fs, &structRepresentationPacket, path_dir_frag_inbox_fileName); if (result == false) { return false; } vGonetsReedSalmonRecovery_1410_3430(gonetsReedSalmon, (uint8_t *) &structRepresentationPacket); uint8_t crc8 = GonetsCrc8((uint8_t *) &structRepresentationPacket, 9); if (crc8 != structRepresentationPacket.crc8) { LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка crc8 в заголовке сообщения"); } char path_in_dirDate[MAX_LEN_PATH_FS]; path_in_dirDate[0] = '\0'; char path_in_fileName[MAX_LEN_PATH_FS]; path_in_fileName[0] = '\0'; char path_in_fileNameTrace[MAX_LEN_PATH_FS]; path_in_fileNameTrace[0] = '\0'; // Путь к файлу принятых сообщений getDateStr(rtc, path_in_dirDate, sizeof(path_in_dirDate)); strcat(path_in_fileName, dir_inbox); strcat(path_in_fileName, path_in_dirDate); strcat(path_in_fileName, "/"); // Путь к файлу принятых сообщений трассировки getDateStr(rtc, path_in_dirDate, sizeof(path_in_dirDate)); strcat(path_in_fileNameTrace, dir_inbox); strcat(path_in_fileNameTrace, path_in_dirDate); strcat(path_in_fileNameTrace, "/"); FRESULT fr; FIL file; fr = f_mkdir_i(fs, path_in_fileName); if (fr) { if (fr != FR_EXIST) return false; } // Имя файла в принятых сообщениях char bufIdFileInBox[12]; char bufWithPrefixIdFileInBox[12]; utoa(idFile, bufIdFileInBox, 10); toAddPrefixStr(bufWithPrefixIdFileInBox, bufIdFileInBox, 5); strcat(path_in_fileName, bufWithPrefixIdFileInBox); strcat(path_in_fileName, ".ITM"); strcat(path_in_fileNameTrace, bufWithPrefixIdFileInBox); strcat(path_in_fileNameTrace, ".DAT"); UINT br; uint8_t headBufForTracer[10]; memset(headBufForTracer, 0, sizeof(headBufForTracer)); uint8_t headerTracer[10] = {0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x74, 0x6e, 0x64, 0x00}; // Читаем заголовок файла fr = f_open_i(fs, &file, path_dir_frag_inbox_fileName, FA_READ); if (fr) return false; f_lseek_i(fs, &file, sizeof(tStructRepresentationPacket)); f_read_i(fs, &file, headBufForTracer, 10, &br); fr = f_close_i(fs, &file); bool isTracer = false; if (memcmp(headBufForTracer, headerTracer, sizeof(headerTracer)) == 0) { isTracer = true; } // Создание заголовка файла входящего сообщения char bufHeader[128]; bufHeader[0] = '\0'; if (isTracer) { createFileHeadFragInboxTrace(bufHeader, fileRecvInfo.from, fileRecvInfo.to, fileRecvInfo.mnumFrom, fileRecvInfo.kvs, structRepresentationPacket.typeMessage, bufWithPrefixIdFileInBox); } else { createFileHeadFragInbox(bufHeader, fileRecvInfo.from, fileRecvInfo.to, fileRecvInfo.mnumFrom, fileRecvInfo.kvs, structRepresentationPacket.typeMessage); } fr = f_open_i(fs, &file, (TCHAR *) path_in_fileName, FA_WRITE | FA_CREATE_ALWAYS); UINT bytes_written; fr = f_write_i(fs, &file, bufHeader, strlen(bufHeader), &bytes_written); fr = f_close_i(fs, &file); uint32_t truncCrc = 0; // CRC32 if (structRepresentationPacket.typeCrc == 1) { truncCrc = 4; } // MD5 if (structRepresentationPacket.typeCrc == 2) { truncCrc = 16; } uint32_t crc32sum; uint8_t md5sum[16]; uint32_t crc32sumFile; uint8_t md5sumFile[16]; if (isTracer) { result = CopyFileTrucSizeFs(fs, structRepresentationPacket.typeCrc, md5ctx, &crc32sum, md5sum, &crc32sumFile, md5sumFile, path_in_fileNameTrace, path_dir_frag_inbox_fileName, sizeof(tStructRepresentationPacket), truncCrc, fileRecvInfo.fileSize); } else { result = CopyFileTrucSizeFs(fs, structRepresentationPacket.typeCrc, md5ctx, &crc32sum, md5sum, &crc32sumFile, md5sumFile, path_in_fileName, path_dir_frag_inbox_fileName, sizeof(tStructRepresentationPacket), truncCrc, fileRecvInfo.fileSize); } // CRC32 if (structRepresentationPacket.typeCrc == 1) { if (crc32sum != crc32sumFile) { LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка crc32 в теле сообщения"); } } // MD5 if (structRepresentationPacket.typeCrc == 2) { bool isMd5Err = false; for (int i = 0; i < 16; ++i) { if (md5sum[i] != md5sumFile[i]) { isMd5Err = true; break; } } if (isMd5Err) { LoggerInfoStatic(logger, "GONEC", "Сборка сообщения. Ошибка md5 в теле сообщения"); } } if (result == false) { return false; } // fr = f_rename_i(fs, path_dir_frag_inbox_fileName, path_in_fileName); // if (fr) { // return false; // } // fileRecvInfo.isRecvInbox = 1; // Запись файла информации // result = writeRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName); // if (result == false) { // return false; // } return true; } /* uint8_t file_rep[] = { 0x01, 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x84, 0x3D, 0x32, 0x9D, // Данные (
Сообщение 23:23 22-05-2023