update ttmsg.c, not DONE yet.

This commit is contained in:
murmur 2023-05-18 08:58:26 +08:00
parent 1f48e502b1
commit 3db47098e7
5 changed files with 161 additions and 47 deletions

View File

@ -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 <dfs_file.h>
@ -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';
}

View File

@ -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_ */

View File

@ -0,0 +1,82 @@
# 接收:
## 透传数据
4k缓存串口收数据快满时转存为文件文件名由`时间戳+1字节随机码`组成随机码防止RTC意外复位后产生的时间错乱。
例`“rxlog/2023_05_05/2023_05_05_10_59_23_123”`。
## 转发指令
## 状态采集
天通状态及定位数据编码规则如下:
```c
// 第1节为高3位分别为sim、rw和jh其余位为xhxh值若大于31则为3131=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

17
packages/pkgs.json Normal file
View File

@ -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"
}
]

View File

@ -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 */