update ttmsg.c, not DONE yet.
This commit is contained in:
parent
1f48e502b1
commit
3db47098e7
@ -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';
|
||||
}
|
||||
|
||||
|
||||
|
@ -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_ */
|
||||
|
82
applications/软件工作流程.md
Normal file
82
applications/软件工作流程.md
Normal 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,其余位为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
|
17
packages/pkgs.json
Normal file
17
packages/pkgs.json
Normal 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"
|
||||
}
|
||||
]
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user