aux extraction
This commit is contained in:
100
trans_frame.go
100
trans_frame.go
@@ -1,7 +1,21 @@
|
||||
package main
|
||||
|
||||
const ImageFrameHeadLength = 16
|
||||
const ImageFrameDataLength = 8176
|
||||
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 {
|
||||
@@ -11,13 +25,13 @@ type TransFrame struct {
|
||||
KeyIndex uint16 // 密钥库索引号 大端序
|
||||
SecretFlag byte // 明密标志 0x55 明传 0xAA 密传
|
||||
FrameFlag byte // 帧类型 0x00:智能载荷电箱有效帧 0x55: 智能载荷电箱空帧
|
||||
FileNo byte // 文件编号
|
||||
FileNo uint8 // 文件编号
|
||||
Reserved1 byte // 保留字节 0x00
|
||||
Data [8176]byte
|
||||
Data []byte // 数据区 8176字节
|
||||
}
|
||||
|
||||
func (t *TransFrame) Decode(frame []byte) {
|
||||
if len(frame) < ImageFrameHeadLength+ImageFrameDataLength {
|
||||
if len(frame) < TransImageFrameLength {
|
||||
return
|
||||
}
|
||||
copy(t.Header[:], frame[:4])
|
||||
@@ -28,5 +42,79 @@ func (t *TransFrame) Decode(frame []byte) {
|
||||
t.FrameFlag = frame[13]
|
||||
t.FileNo = frame[14]
|
||||
t.Reserved1 = frame[15]
|
||||
copy(t.Data[:], frame[16:])
|
||||
t.Data = append(t.Data, frame[16:8192]...)
|
||||
}
|
||||
|
||||
// 提取图像传输帧中的原始图像数据
|
||||
func (p *Processor) ExtractOriginalImageData() ([]string, error) {
|
||||
var sData []string
|
||||
name := filepath.Base(p.params.InputData)
|
||||
aosDataFile := filepath.Join(p.params.TempPath, "aos_data_"+name)
|
||||
|
||||
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("trans frame length error")
|
||||
break
|
||||
}
|
||||
|
||||
var tf TransFrame
|
||||
tf.Decode(aosData[i : i+TransImageFrameLength])
|
||||
fileno := int(tf.FileNo)
|
||||
snRange[fileno] = append(snRange[fileno], tf.SNo)
|
||||
|
||||
// 只保留非空帧
|
||||
if tf.FrameFlag != 0x55 && fileno != 0 {
|
||||
datSet[fileno] = append(datSet[fileno], tf.Data...)
|
||||
}
|
||||
|
||||
i += TransImageFrameLength
|
||||
continue
|
||||
}
|
||||
i++
|
||||
}
|
||||
|
||||
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%d.dat", 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user