TT12-MCU/applications/ttmsg/ttmsg.c
2023-05-11 11:33:47 +08:00

263 lines
5.9 KiB
C
Raw 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.

#include <dfs_file.h>
#define LOG_TAG "ttmsg"
#define LOG_LVL LOG_LVL_DBG
#include <ulog.h>
#include "ttmsg.h"
#define STR_LEN_MAX 30
//模板
MSG msgs_tpl={
.fstart = {0x88,0xAA,0xBB,0x88},
.fnum = {0x00,0x01},
.fbak = {0x00,0x02},
.ftype = {0x70,0x21},
.fdlen = {0x00,0x00},
.ftccid = {0x37,0x32,0x32,0x32},
// .findex = {0x00,0x01,0x02,0x03,0x04,0x05},
// .fcfg = {DATA_MODE | CRY_AES},
};
/**
* @brief 按指定分隔符分割字符串
*
* @param str 待分割字符串
* @param deli 分隔符
* @param out 输出字符串数组
* @return size_t 分割后字符串个数
*/
size_t split(const char *str, const char *deli, char (*out)[STR_LEN_MAX])
{
char buf[50];
strcpy(buf, str); // strtok会修改字符串
char *token = strtok(buf, deli);
char *rst[STR_LEN_MAX];
size_t i = 0;
while (token)
{
rst[i++] = token;
token = strtok(NULL, deli);
}
// 更新out
for (size_t ii = 0; ii < i; ii++)
{
// out[ii] = id[ii];
strcpy(out[ii], rst[ii]);
}
return i;
}
/**
* @brief 从文件名字符串提取ID
*
* @param fin 文件名,支持路径
* @param out 提取结果
* @return size_t ID长度
*/
size_t getID(const char *str, char *out)
{
char id[10][STR_LEN_MAX] = {};
// 分割路径
size_t len = split(str, "/", id);
// 分割后缀
len = split(id[len - 1], ".", id);
// 分割时间
len = split(id[0], "_", id);
unsigned char tmp[len];
for (size_t i = 0; i < len; i++)
{
unsigned int v = atoi(id[i]);
// 去除代表20的2000
if (v > 0xff)
{
v = v - 2000;
}
tmp[i] = v;
}
memcpy(out, tmp, len);
return len;
}
/**
* @description 初始化打包配置文件
* @param id 时间戳作为数据包唯一ID
* @param flag 参数配置,如信息类型、压缩方式、加密方式等
*/
packInit(MSG tpl, const char *fin, rt_uint8_t flag)
{
//模板
MSG msgs_tpl={
.fstart = {0x88,0xAA,0xBB,0x88},
.fnum = {0x00,0x01},
.fbak = {0x00,0x02},
.ftype = {0x70,0x21},
.fdlen = {0x00,0x00},
.ftccid = {0x37,0x32,0x32,0x32},
// .findex = {0x00,0x01,0x02,0x03,0x04,0x05},
.fcfg = flag,
};
// char *fin="log/2023_05_05/2023_05_05_10_59_23_123";
// unsigned char id[7];
size_t len = getID(fin, msgs_tpl.findex);
if (len != 7) {
LOG_I("file name %s format error",fin);
}
}
/**
* @description: 按MSG帧格式拼接din数据后输出到dout
* @param {rt_uint8_t} *din 待打包数据
* @param {rt_uint8_t} len 待打包数据长度
* @param {rt_uint8_t} *id 时间戳作为数据包唯一ID
* @param {rt_uint8_t} flag 参数配置,如信息类型、压缩方式、加密方式等
* @param {rt_uint8_t} *dout 输出buff
* @return {*} 打包后数据总长度
*/
rt_uint8_t packMsg(rt_uint8_t *din, rt_uint8_t len, rt_uint8_t *id, rt_uint8_t flag, rt_uint8_t *dout)
{
MSG *p_msg = NULL;
rt_uint8_t fralen=sizeof(MSG)+len;//len of current frame
// printf("len is %d\n",fralen);
// 为帧数据申请内存
p_msg = (MSG*)malloc(fralen);//分配空间
if (p_msg == NULL)
{
printf("malloc error, no enough memory."); /* code */
return 0;
}
// 复制模板内容
memcpy(p_msg,&msgs_tpl,sizeof(MSG));
p_msg->fcfg[0] = flag;
// 计算各字段
p_msg->fdlen[0]=0;//单包长度必不会超过0xFF故高字节始终为0
p_msg->fdlen[1]= fralen - 13;//总长度-帧头长度
memcpy(p_msg->findex,id,6);
// 将待发数据传入帧数据
memcpy(p_msg->fdata,din,len);
// 将帧数据传入buff
memcpy(dout,p_msg,fralen);
// ! 释放内存
free(p_msg);
p_msg=NULL;
return fralen;
}
size_t pack_File(const char *fin, char (*dout)[200])
{
int fd_in = -1, fd_out = -1;
int ret = 0;
size_t file_size = 0;
rt_uint8_t *buffer = RT_NULL;
size_t flen = 150; //每包数据初始长度,最大不超过 FRAME_DATA_LEN_MAX
fd_in = open(fin, O_RDONLY, 0);
if (fd_in < 0)
{
rt_kprintf("[fastlz] open the input file : %s error!\n", fin);
ret = -1;
goto _exit;
}
// fd_out = open(fout, O_WRONLY | O_CREAT | O_TRUNC, 0);
// if (fd_out < 0)
// {
// rt_kprintf("[fastlz] open the output file : %s error!\n", fout);
// ret = -1;
// goto _exit;
// }
file_size = lseek(fd_in, 0, SEEK_END);
lseek(fd_in, 0, SEEK_SET);
//粗略调整每包大小
while (file_size % flen < flen / 1.2 && flen < FRAME_DATA_LEN_MAX) //阈值约83%
{
flen += 1;
}
if (file_size % flen < flen / 1.2)
{ //到达限制仍不符合要求
flen = 150;
while (file_size % flen < flen / 2.5 && flen < FRAME_DATA_LEN_MAX) //调整阈值为40%
{
flen += 1;
}
}
buffer = (rt_uint8_t *) malloc(file_size);
for (int var = 0; var < file_size; ++flen)
{
}
_exit:
if(fd_in >= 0)
{
close(fd_in);
}
// if(fd_out >= 0)
// {
// close(fd_out);
// }
// if (cmprs_buffer)
// {
// free(cmprs_buffer);
// }
//
// if (buffer)
// {
// free(buffer);
// }
// return ret;
}
void demomsg() {
printf("Hello, World!\n");
printf("MSG size is %d \n",sizeof(MSG));
printf("msgs size is %d \n",sizeof(msgs_tpl));
printf("uint8_t size is %d \n",sizeof(rt_uint8_t));
rt_uint8_t d[]={0xAA,0xBB,0x88,0xFF,0xFF,0x00,0x00,0x70,0x21,0x00,0x8F,0xD3,0x31,0x33};
rt_uint8_t p_d[200];
rt_uint8_t index[]={0x63,0x30,0x20,0x33,0x33,0x20};
rt_uint8_t len=0;
len = packMsg(&msgs_tpl, d,sizeof(d),index,p_d);
printf("len is %d\n",len);
for (size_t i = 0; i < len; i++)
{
/* code */
printf("%d -- 0x%02X \n",i,p_d[i]);
}
p_d[len]='\0';
}