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() 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++ } 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 nil } func LDPCCheck(frame []byte) error { return nil }