From 3db47098e7f7f87a4c2726f47eedc9d163a487ee Mon Sep 17 00:00:00 2001 From: murmur Date: Thu, 18 May 2023 08:58:26 +0800 Subject: [PATCH] update ttmsg.c, not DONE yet. --- applications/ttmsg/ttmsg.c | 98 ++++++++++++++++++++---------------- applications/ttmsg/ttmsg.h | 9 ++-- applications/软件工作流程.md | 82 ++++++++++++++++++++++++++++++ packages/pkgs.json | 17 +++++++ rtconfig.h | 2 +- 5 files changed, 161 insertions(+), 47 deletions(-) create mode 100644 applications/软件工作流程.md create mode 100644 packages/pkgs.json diff --git a/applications/ttmsg/ttmsg.c b/applications/ttmsg/ttmsg.c index 043f605..03a1e16 100644 --- a/applications/ttmsg/ttmsg.c +++ b/applications/ttmsg/ttmsg.c @@ -1,3 +1,30 @@ +/* + * ┌─────────────────────────────────────────────────────────────┐ + * │┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐│ + * ││Esc│!1 │@2 │#3 │$4 │%5 │^6 │&7 │*8 │(9 │)0 │_- │+= │|\ │`~ ││ + * │├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤│ + * ││ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{[ │}] │ BS ││ + * │├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤│ + * ││ Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter ││ + * │├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤│ + * ││ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│Shift │Fn ││ + * │└─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴┬─────┴───┘│ + * │ │Fn │ Alt │ Space │ Alt │Win│ HHKB │ + * │ └───┴─────┴───────────────────────┴─────┴───┘ │ + * └─────────────────────────────────────────────────────────────┘ + */ + +/* + * @Author: murmur test@test.com + * @Date: 2023-05-05 10:07:30 + * @LastEditors: murmur test@test.com + * @LastEditTime: 2023-05-11 16:34:31 + * @FilePath: \TT12-MCU\applications\ttmsg\ttmsg.c + * @Description: + * + * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. + */ + #include @@ -29,7 +56,7 @@ MSG msgs_tpl={ * @param out 输出字符串数组 * @return size_t 分割后字符串个数 */ -size_t split(const char *str, const char *deli, char (*out)[STR_LEN_MAX]) +static size_t split(const char *str, const char *deli, char (*out)[STR_LEN_MAX]) { char buf[50]; strcpy(buf, str); // strtok会修改字符串 @@ -61,7 +88,7 @@ size_t split(const char *str, const char *deli, char (*out)[STR_LEN_MAX]) * @param out 提取结果 * @return size_t ID长度 */ -size_t getID(const char *str, char *out) +static size_t getID(const char *str, unsigned char *out) { char id[10][STR_LEN_MAX] = {}; // 分割路径 @@ -92,11 +119,13 @@ size_t getID(const char *str, char *out) } /** - * @description 初始化打包配置文件 - * @param id 时间戳,作为数据包唯一ID + * @brief 根据配置初始化MSG + * @param *tpl MSG结构体 + * @param fin 文件名,由时间戳和随机码组成,作为数据包唯一ID * @param flag 参数配置,如信息类型、压缩方式、加密方式等 + * @return 成功返回0 */ -packInit(MSG tpl, const char *fin, rt_uint8_t flag) +rt_uint8_t packInit(MSG *tpl, const char *fin, rt_uint8_t flag) { //模板 MSG msgs_tpl={ @@ -119,6 +148,10 @@ packInit(MSG tpl, const char *fin, rt_uint8_t flag) LOG_I("file name %s format error",fin); } + memcpy(tpl,&msgs_tpl,sizof(msgs_tpl)); + + return RT_EOK; + } @@ -131,43 +164,36 @@ packInit(MSG tpl, const char *fin, 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) +rt_uint8_t packMsg(MSG *p_msg, rt_uint8_t *din, rt_uint8_t len, 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->findex,id,6); // 将待发数据传入帧数据 memcpy(p_msg->fdata,din,len); - // 将帧数据传入buff + // 将打包后帧数据传入buff memcpy(dout,p_msg,fralen); // ! 释放内存 - free(p_msg); - p_msg=NULL; + // free(p_msg); + // p_msg=NULL; return fralen; } - -size_t pack_File(const char *fin, char (*dout)[200]) +/** + * 将指定文件按帧协议进行切片打包,返回二维数组 + * @param cfg MSG格式配置文件 + * @param fin 待打包文件名 + * @param dout 打包后二维数组 + * @return + */ +size_t pack_File(MSG *cfg, const char *fin, char (*dout)[200]) { int fd_in = -1, fd_out = -1; int ret = 0; @@ -208,11 +234,13 @@ size_t pack_File(const char *fin, char (*dout)[200]) flen += 1; } } + rt_uint8_t packdata[file_size/flen+1][flen]; buffer = (rt_uint8_t *) malloc(file_size); + for (int var = 0; var < file_size; ++flen) { - + packMsg(cfg,buffer+var,flen,packdata[var]); } _exit: @@ -241,22 +269,6 @@ size_t pack_File(const char *fin, char (*dout)[200]) 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'; } diff --git a/applications/ttmsg/ttmsg.h b/applications/ttmsg/ttmsg.h index 81ae526..9181e7f 100644 --- a/applications/ttmsg/ttmsg.h +++ b/applications/ttmsg/ttmsg.h @@ -31,11 +31,14 @@ typedef enum{ //压缩,次高2位 COMP_NONE=(0<<2), COMP_QUICK_LZ=(1<<2),//压缩率中等,demo约1/0.62,资源占用少 - COMP_LZMA=(2<<2),//压缩率可能最高,样例报错还未定位,猜测是内存不足 + COMP_FAST_LZ=(2<<2), + COMP_LZMA=(3<<2),//压缩率可能最高,样例报错还未定位,猜测是内存不足 //数据类型子类,随CTRL_MODE不同而不同,共3位8种 MODE_0=(0<<4), MODE_1=(1<<4), + // 。。。 + MODE_7=(1<<4), //数据类型,最高位 CTRL_MODE=(0<<7), DATA_MODE=(1<<7), @@ -60,7 +63,7 @@ typedef struct{ rt_uint8_t ftccid[4] ;// //自定义数据,格式如下 - rt_uint8_t findex[6] ;//唯一ID号,索引号:年月日时分秒+1字节随机码 年取后两位(2023即23),随机码为防止RTC复位后时间错乱 + rt_uint8_t findex[7] ;//唯一ID号,索引号:年月日时分秒+1字节随机码 年取后两位(2023即23),随机码为防止RTC复位后时间错乱 rt_uint8_t fcfg[1] ;//数据类型 |压缩方式|加密方式 rt_uint8_t fcurpiece[1];//当前分片数 rt_uint8_t fallpiece[1];//总分片数 @@ -68,7 +71,7 @@ typedef struct{ }MSG; -rt_uint8_t packMsg(rt_uint8_t *din, rt_uint8_t len, rt_uint8_t *id, rt_uint8_t flag, rt_uint8_t *dout); +rt_uint8_t packMsg(MSG *p_msg, rt_uint8_t *din, rt_uint8_t len, rt_uint8_t *dout); #endif /* APPLICATIONS_TTMSG_TTMSG_H_ */ diff --git a/applications/软件工作流程.md b/applications/软件工作流程.md new file mode 100644 index 0000000..8bc79f1 --- /dev/null +++ b/applications/软件工作流程.md @@ -0,0 +1,82 @@ +# 接收: +## 透传数据 +4k缓存串口收数据,快满时转存为文件,文件名由`时间戳+1字节随机码`组成,随机码防止RTC意外复位后产生的时间错乱。 + +例`“rxlog/2023_05_05/2023_05_05_10_59_23_123”`。 +## 转发指令 +## 状态采集 +天通状态及定位数据编码规则如下: +```c + // 第1节为高3位分别为sim、rw和jh,其余位为xh,xh值若大于31则为31(31=b0001 1111) + // 第2-5字节为经度。114.410050= 0xF2 0xD1 0xE4 0x42 + // 第6-9字节为纬度。30.426840= 0x2B 0x6A 0xF3 0x41 + // 第10字节为高度,只保留整数。-31.5= 0x0A +``` +例`有卡,已入网,已鉴权,信号6,纬度30.426840, 经度114.410050, 高度-31.5` +编码为`0xE6 0xF2 0xD1 0xE4 0x42 0x2B 0x6A 0xF3 0x41 0x0A`, + +时戳编码为6字节: +```c +年月日时分秒各一个字节表示, 年取后两位(2023即23) +``` +如 + +# 压缩: +采用fastlz算法对数据文件文件进行压缩,算法项可配置。 +# 加密: +从用AES-256算法对压缩后文件进行加密,算法项可配置。 +# 分包: +加密后文件需要进行分包切片,每切片数据大小不超过180字节。 +# 打包: +切片数据按帧协议进行打包,协议如下: +```c +typedef struct{ + //帧头 + //格式是TT厂家确定的,厂家不变则不会变,13字节 + rt_uint8_t fstart[4];// + rt_uint8_t fnum[2] ; + rt_uint8_t fbak[2] ; + rt_uint8_t ftype[2] ;//固定位0x7021 + rt_uint8_t fdlen[2] ;//总数据长度,从ccid开始计算 + rt_uint8_t fcrc[1] ;// + + //数据体,部分自定义 + //目标终端前4字节必须为CCID,厂家定义 + rt_uint8_t ftccid[4] ;// + + //数据体自定义部分,格式如下 + rt_uint8_t findex[7] ;//唯一ID号,索引号:年月日时分秒+1字节随机码 年取后两位(2023即23),随机码为防止RTC复位后时间错乱 + rt_uint8_t fcfg[1] ;//数据类型|压缩方式|加密方式 + rt_uint8_t fcurpiece[1];//当前分片数 + rt_uint8_t fallpiece[1];//总分片数 + rt_uint8_t fdata[];//当前分片数据,为待发数据 + +}MSG; +``` +## 配置项 +fcfg为配置项,长1字节,为**数据类型**、**压缩方式**、**加密方式**对应控制字的和。 +```c + //加密,低2位 + CRY_NONE=0, + CRY_AES, + CRY_RSA, + + //压缩,次高2位 + COMP_NONE=(0<<2), + COMP_QUICK_LZ=(1<<2),//压缩率中等,demo约1/0.62,资源占用少 + COMP_LZMA=(2<<2),//压缩率可能最高,样例报错还未定位,猜测是内存不足 + + //数据类型子类,随CTRL_MODE不同而不同,共3位8种 + MODE_0=(0<<4), + MODE_1=(1<<4), + // 。。。 + MODE_7=(1<<4), + + //数据类型,最高位 + CTRL_MODE=(0<<7), + DATA_MODE=(1<<7), +``` +# 发送: +与天通设备进行通信,将打包后数据依次送出。 +## 发送逻辑 +连续5个周期为激活状态且信号强度不低于5 \ No newline at end of file diff --git a/packages/pkgs.json b/packages/pkgs.json new file mode 100644 index 0000000..f7d467e --- /dev/null +++ b/packages/pkgs.json @@ -0,0 +1,17 @@ +[ + { + "path": "/packages/iot/webclient", + "ver": "v2.2.0", + "name": "WEBCLIENT" + }, + { + "path": "/packages/language/JSON/cJSON", + "ver": "v1.7.15", + "name": "CJSON" + }, + { + "path": "/packages/misc/fastlz", + "ver": "v1.0.1", + "name": "FASTLZ" + } +] \ No newline at end of file diff --git a/rtconfig.h b/rtconfig.h index 6a21ad8..1ab8f6c 100644 --- a/rtconfig.h +++ b/rtconfig.h @@ -243,7 +243,7 @@ /* JSON: JavaScript Object Notation, a lightweight data-interchange format */ #define PKG_USING_CJSON -#define PKG_USING_CJSON_LATEST_VERSION +#define PKG_USING_CJSON_V1715 /* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ /* XML: Extensible Markup Language */