Files
sjy01-preprocessing/extract/trans_frame.go
2024-05-28 22:35:55 +08:00

134 lines
3.4 KiB
Go

package extract
import (
"bufio"
"fmt"
"os"
"path/filepath"
"sort"
log "github.com/sirupsen/logrus"
"github.com/duke-git/lancet/v2/slice"
)
const TransImageFrameLength = 8192
const TransImageFrameHeadLength = 16
const TransImageFrameDataLength = 8176
const ImageFrameHead = 0xE77EE77E
// 智能载荷电箱与数传单机之间图像数据传输帧格式
type TransFrame struct {
Header [4]byte // 帧头 E77EE77E
SNo uint32 // 序列号 大端序
Reserved0 [2]byte // 保留字节
KeyIndex uint16 // 密钥库索引号 大端序
SecretFlag byte // 明密标志 0x55 明传 0xAA 密传
FrameFlag byte // 帧类型 0x00:智能载荷电箱有效帧 0x55: 智能载荷电箱空帧
FileNo uint8 // 文件编号
Reserved1 byte // 保留字节 0x00
Data []byte // 数据区 8176字节
}
func (t *TransFrame) Decode(frame []byte) {
if len(frame) < TransImageFrameLength {
return
}
copy(t.Header[:], frame[:4])
t.SNo = uint32(frame[4])<<24 | uint32(frame[5])<<16 | uint32(frame[6])<<8 | uint32(frame[7])
copy(t.Reserved0[:], frame[8:10])
t.KeyIndex = uint16(frame[10])<<8 | uint16(frame[11])
t.SecretFlag = frame[12]
t.FrameFlag = frame[13]
t.FileNo = frame[14]
t.Reserved1 = frame[15]
t.Data = append(t.Data, frame[16:8192]...)
}
// 提取图像传输帧中的原始图像数据
func (p *Extractor) ExtractOriginalImageData(aosDataFile string) ([]string, error) {
var sData []string
nullFrmCnt := 0
aosData, err := os.ReadFile(aosDataFile)
if err != nil {
log.Println("read data from", aosDataFile, "error:", err.Error())
return nil, err
}
snRange := map[int][]uint32{}
datSet := map[int][]byte{}
var i int
for i < len(aosData) {
if i+4 > len(aosData) {
log.Println("end of trans frame data")
break
}
if aosData[i] == 0xE7 && aosData[i+1] == 0x7E && aosData[i+2] == 0xE7 && aosData[i+3] == 0x7E {
if i+TransImageFrameLength > len(aosData) {
log.Println("there are not enough data for a trans frame", len(aosData)-i)
break
}
var tf TransFrame
tf.Decode(aosData[i : i+TransImageFrameLength])
fileno := int(tf.FileNo)
snRange[fileno] = append(snRange[fileno], tf.SNo)
if tf.SecretFlag == 0xAA {
log.Info("secret frame is not supported")
break
}
// 只保留非空帧
if tf.FrameFlag != 0x55 && fileno != 0 {
datSet[fileno] = append(datSet[fileno], tf.Data...)
} else {
nullFrmCnt++
}
i += TransImageFrameLength
continue
}
i++
}
log.Println("null transfer frame cnt:", nullFrmCnt)
if len(snRange) == 0 {
log.Errorf("no valid transfer frame found in %s", aosDataFile)
}
for k, v := range snRange {
vv := slice.Unique(v)
sort.Slice(vv, func(i, j int) bool { return vv[i] < vv[j] })
fmt.Println("fileno:", k, ", sn range:", vv[0], "-", vv[len(vv)-1], "len", len(vv))
}
for k, v := range datSet {
frameCnt := slice.Unique(snRange[k])
if len(frameCnt) < 4096 {
log.Println("fileno", k, "数据长度不足4096帧")
continue
}
s01 := filepath.Join(p.params.TempPath, fmt.Sprintf("%s_%s_S%d.dat",
p.params.Satellite,
p.params.DataId,
k))
fo, err := os.OpenFile(s01,
os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
if err != nil {
log.Println("create file", s01, "error:", err.Error())
return nil, err
}
w := bufio.NewWriter(fo)
w.Write(v)
w.Flush()
fo.Close()
sData = append(sData, s01)
}
return sData, nil
}