84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
package extract
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
const (
|
|
AOSFrameLength = 1024
|
|
AOSTempDataPrefix = "AOS_Data_"
|
|
)
|
|
|
|
var AOSSyncWord = []byte{0x1A, 0xCF, 0xFC, 0x1D}
|
|
|
|
type AOSFrame struct {
|
|
}
|
|
|
|
func (p *Extractor) ExtractAosData() (string, error) {
|
|
// 打开传输帧文件 - 一次读入内存
|
|
rawData, err := os.ReadFile(p.params.InputData)
|
|
if err != nil {
|
|
log.Println("read data from", p.params.InputData, "error:", err.Error())
|
|
return "", err
|
|
}
|
|
|
|
name := filepath.Base(p.params.InputData)
|
|
aosDataFile := filepath.Join(p.params.TempPath, AOSTempDataPrefix+name)
|
|
foData, err := os.OpenFile(aosDataFile,
|
|
os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
|
|
if err != nil {
|
|
fmt.Println("create data err", err.Error())
|
|
return "", err
|
|
}
|
|
defer foData.Close()
|
|
wData := bufio.NewWriter(foData)
|
|
|
|
var validFrameCnt int
|
|
var errFrameCnt int
|
|
|
|
for i := 0; i < len(rawData); {
|
|
// 寻找帧头 0x1A CF FC 1D
|
|
if i+4 > len(rawData) {
|
|
log.Info("end of raw data")
|
|
break
|
|
}
|
|
|
|
if rawData[i] == 0x1A && rawData[i+1] == 0xCF && rawData[i+2] == 0xFC && rawData[i+3] == 0x1D {
|
|
// 找到帧头
|
|
log.Debug("detect AOS frame")
|
|
} else {
|
|
i++
|
|
continue
|
|
}
|
|
|
|
if i+1024 > len(rawData) {
|
|
log.Info("not enough data for AOS frame")
|
|
break
|
|
}
|
|
|
|
// 读取完整帧
|
|
if LDPCCheck(rawData[i:i+1024]) != nil {
|
|
errFrameCnt++
|
|
}
|
|
|
|
// 三江源一号在 AOS 帧的数据域最后 2 字节为填充字节
|
|
wData.Write(rawData[i+10 : i+894])
|
|
i += 1024
|
|
validFrameCnt++
|
|
}
|
|
|
|
log.Println("valid AOS frame cnt:", validFrameCnt)
|
|
log.Println("error AOS frame cnt:", errFrameCnt)
|
|
|
|
return aosDataFile, nil
|
|
}
|
|
|
|
func LDPCCheck(frame []byte) error {
|
|
return nil
|
|
}
|