GONEC_ARTERY_Modem_Main/Src/ModemReceiveFunc.c

1416 lines
44 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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, &timestamp);
timestamp -= j * 24 * 3600;
struct tm timestampTM;
localtime_r(&timestamp, &timestampTM);
strftime(path_sent_dirDate, sizeof(path_sent_dirDate), "%Y%m%d", &timestampTM);
// Путь к файлу в 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,
// Данные (<p>Сообщение 23:23 22-05-2023<br></p>)
0x3C, 0x70, 0x3E, 0xD0, 0xA1, 0xD0, 0xBE, 0xD0, 0xBE, 0xD0, 0xB1, 0xD1, 0x89,
0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB8, 0xD0, 0xB5, 0x20, 0x32, 0x33, 0x3A, 0x32,
0x33, 0x20, 0x32, 0x32, 0x2D, 0x30, 0x35, 0x2D, 0x32, 0x30, 0x32, 0x33, 0x3C,
0x62, 0x72, 0x3E, 0x3C, 0x2F, 0x70, 0x3E,
// CRC32 данных
0x43, 0x5B, 0x38, 0xFC
};
// Перенос собранного фрагментированного файла в хранилище принятых сообщений inbox
tReceiveBuildResult
renameFromFrgToInBox5555(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;
fileRecvInfo.fileSize = sizeof(file_rep);
FIL file;
FRESULT fr;
fr = f_unlink_i(fs, path_dir_frag_inbox_fileName);
fr = f_open_i(fs, &file, (TCHAR *) path_dir_frag_inbox_fileName, FA_WRITE | FA_CREATE_ALWAYS);
UINT bytes_written;
fr = f_write_i(fs, &file, file_rep, sizeof(file_rep), &bytes_written);
fr = f_close_i(fs, &file);
bool result;
// Чтение файла информации
//bool result = readRecvFileInfo(fs, &fileRecvInfo, path_dir_info_fileName);
//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, "/");
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);
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;
}
*/