From 58ebf3842a150361ee5f7f732a97993f2a853823 Mon Sep 17 00:00:00 2001 From: soul-walker <31162815+soul-walker@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:40:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=BA=94=E7=AD=94=E5=99=A810?= =?UTF-8?q?23=E6=8A=A5=E6=96=87=E5=92=8C830=E6=8A=A5=E6=96=87=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E8=A7=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/balise_1023_830/main.go | 406 ++++++++++++++++++++++++++ example/balise_1023_830/read_excel.go | 156 ++++++++++ example/ex1/main.go | 32 ++ example/lfsr/main.go | 56 ++++ example/test/main.go | 52 ++++ go.mod | 6 + go.sum | 13 + go.work.sum | 1 + rts-sim-module | 2 +- rts-sim-testing-message | 2 +- third_party/balise/codec.go | 184 +++++++++++- third_party/balise/conv.go | 109 ++++++- third_party/balise/conv_test.go | 2 +- third_party/balise/decode.go | 88 ++++++ third_party/balise/encode.go | 86 ++++++ third_party/example/main.go | 4 +- 北岗子-应答器报文清单.xlsx | Bin 0 -> 84293 bytes 17 files changed, 1167 insertions(+), 32 deletions(-) create mode 100644 example/balise_1023_830/main.go create mode 100644 example/balise_1023_830/read_excel.go create mode 100644 example/ex1/main.go create mode 100644 example/lfsr/main.go create mode 100644 example/test/main.go create mode 100644 third_party/balise/decode.go create mode 100644 third_party/balise/encode.go create mode 100644 北岗子-应答器报文清单.xlsx diff --git a/example/balise_1023_830/main.go b/example/balise_1023_830/main.go new file mode 100644 index 0000000..90477d5 --- /dev/null +++ b/example/balise_1023_830/main.go @@ -0,0 +1,406 @@ +package main + +import ( + "fmt" + "log/slog" + "strconv" + + "joylink.club/bj-rtsts-server/third_party/balise" +) + +type Transponder struct { + // 应答器编号 + Code int + // 应答器名称 + Name string + // 应答器类型 + Type string + // 校验码 + CheckSum string + // 830报文 + Msg830 string + // 1023报文 + Msg1023 string +} + +func main() { + transponderMap := ReadTransponders() + // v := transponderMap["FB121_BGZ"] + // b1023 := convertToBalise1023(v.Msg1023) + // replaced830 := replaceFirst10Bits(convertTo830(v.Msg830)) + // scrambled830 := scrambling(replaced830, b1023.S) + // compare830(scrambled830, b1023.data830) + + // count := 0 + for _, v := range transponderMap { + // slog.Info("transponder", "name", v.Name, "code", v.Code, "checksum", v.CheckSum, "msg830", v.Msg830, "msg1023", v.Msg1023) + byte104, err := balise.DecodeByteString(v.Msg1023) + if err != nil { + slog.Error("解码应答器数据失败", "name", v.Name, "code", v.Code, "err", err) + continue + } + compare104Bytes(byte104, balise.ConvertByteStringToBytes(v.Msg830)) + // b1023 := convertToBalise1023(v.Msg1023) + // source830 := convertTo830(v.Msg830) + // // replaced830 := replaceFirst10Bits(source830) + // // compare830(reverted830, source830) + // descrambled830 := descrambling(b1023.data830, b1023.S) + // reverted830 := revertFirst10Bits(descrambled830) + // // // scrambled830 := scrambling(replaced830, b1023.S) + // compare830(source830, reverted830) + // count++ + // if count >= 10 { + // break + // } + } + +} + +// 比较830位数据 +func compare104Bytes(bytes104 []byte, compare104 []byte) { + if len(bytes104) != 104 { + panic("invalid length") + } + for i := 0; i < 104; i++ { + fmt.Printf("%02x\n", bytes104[i]) + fmt.Printf("%02x\n\n", compare104[i]) + if bytes104[i] != compare104[i] { + slog.Info("error", "index", i, "bytes104", fmt.Sprintf("%02x", bytes104[i]), "compare", fmt.Sprintf("%02x", compare104[i])) + panic("104 bytes compare error") + } + } +} + +type Balise1023 struct { + bits []byte // 1023报文,1023bit + data []byte // 数据位,913bit + data830 []byte // 830位数据 + cb []byte // 控制位,3bit + sb []byte // 加扰位,12bit + S uint32 // 由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 + esb []byte // 额外修正位,10bit + checkSum []byte // 校验位,85bit +} + +func newBalise1023(bits []byte) *Balise1023 { + if len(bits) != 1023 { + panic("invalid length") + } + // for i := 0; i < 1023; i++ { + // if i%10 == 0 { + // println() + // } + // print(1022-i, ":", bits[i], ",") + // } + // println() + balise1023 := &Balise1023{ + bits: bits, + } + balise1023.data = balise1023.getRange(1022, 110) + if len(balise1023.data) != 913 { + panic("invalid data length") + } + balise1023.data830 = convert913To830(balise1023.data) + balise1023.check11To10() + balise1023.cb = balise1023.getRange(109, 107) + for i, v := range balise1023.cb { + n := 109 - i + name := "b" + strconv.Itoa(109-i) + slog.Info("cb", name, v) + if n == 109 && v == 1 { + slog.Error("控制位cb错误:cb109应该为0,实际为1") + } else if n == 108 && v == 1 { + slog.Error("控制位cb错误:cb108应该为0,实际为1") + } else if n == 107 && v == 0 { + slog.Error("控制位cb错误:cb107应该为1,实际为0") + } + } + balise1023.sb = balise1023.getRange(106, 95) + balise1023.S = calculateS(balise1023.sb) + balise1023.esb = balise1023.getRange(94, 85) + balise1023.checkSum = balise1023.getRange(84, 0) + slog.Info("msg length", "datalen", len(balise1023.data), "cblen", len(balise1023.cb), "sblen", len(balise1023.sb), "esblen", len(balise1023.esb), "checkSumlen", len(balise1023.checkSum)) + return balise1023 +} + +func (b *Balise1023) getRange(start, end int) []byte { + if start < 0 || end < 0 || start < end || start > 1022 { + panic("invalid range") + } + return b.bits[1022-start : 1022-(end-1)] +} + +func (b *Balise1023) check11To10() { + b913 := b.data + compare := convert830To913(b.data830) + for i := 0; i < 913; i++ { + if b913[i] != compare[i] { + slog.Info("error", "idx", i, "b913", b913[i], "compare", compare[i]) + panic("10 to 11 bit error") + } + } +} + +// 转换字节字符串到bit数组,左边为最高有效位(MSB) +func convertStringBytesToBits(msg string) []byte { + length := len(msg) + println("msg:", msg) + bytes := make([]byte, length/2) + for i := 0; i < length; i += 2 { + v, err := strconv.ParseUint(msg[i:i+2], 16, 8) + if err != nil { + panic(err) + } + bytes[i/2] = byte(v) + // slog.Info("i", "byteidx", i/2, "byte", fmt.Sprintf("%02x", v)) + } + // 字节转换为bit数组 + bits := make([]byte, length/2*8) + for i, bt := range bytes { + for j := 0; j < 8; j++ { + move := 7 - j + idx := i*8 + j + bits[idx] = (bt >> move) & 1 + } + } + return bits +} + +func convertTo830(msg string) []byte { + length := len(msg) + if length != 208 { + panic("invalid length") + } + // 字节转换为bit数组 + bits := convertStringBytesToBits(msg) + bits830 := bits[0:830] + return bits830 +} + +func convertToBalise1023(msg string) *Balise1023 { + length := len(msg) + if length != 256 { + panic("invalid length") + } + // 字节转换为bit数组 + bits := convertStringBytesToBits(msg) + bits1023 := bits[0:1023] + slog.Info("bits length", "len", len(bits1023)) + return newBalise1023(bits1023) +} + +// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组,除了第一个10位值,其余值求和,然后循环2的10次方次与其他值求和结果相加后模2的10次方,若结果和第一个10位值相同,则结束,此值即为原始的第一个10位值,将此值替换为第一个10位二进制数组,依然是左边为MSB +func revertFirst10Bits(b []byte) []byte { + if len(b) != 830 { + panic("invalid length") + } + // 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组 + bits := make([]uint16, 83) + for i := 0; i < 83; i++ { + bits[i] = uint16(balise.ToValLeftMsb(b[i*10 : i*10+10])) + // 打印输出 + for j := 0; j < 10; j++ { + fmt.Printf("%01b", b[i*10+j]) + } + print(" ") + if i != 0 && i%10 == 9 { + println() + } + } + println() + // 将除了第一个10位字整数求和 + sum := uint64(0) + for i := 1; i < 83; i++ { + sum += uint64(bits[i]) + } + // 循环2的10次方次与其他值求和结果相加后模2的10次方 + for i := 0; i < 1024; i++ { + test := sum + uint64(i) + if test%1024 == uint64(bits[0]) { + bits[0] = uint16(i) + break + } + } + slog.Info("还原第一个10位值", "sum", sum, "bits[0]", bits[0], "bits[0]b", fmt.Sprintf("%010b", bits[0])) + rbits := make([]byte, 830) + // 将整个10位数组转换为二进制数组,依然是MSB + u0bits := balise.ToBitsLeftMsb(int(bits[0]), 10) + for i := 0; i < 10; i++ { + rbits[i] = u0bits[i] + } + for i := 10; i < 830; i++ { + rbits[i] = b[i] + } + // compare830(b, rbits) + return rbits +} + +// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组,然后求和后模2的10次方,得到的结果覆盖第一个10位值,然后将整个10位数组转换为二进制数组,依然是左边为MSB +func replaceFirst10Bits(b []byte) []byte { + if len(b) != 830 { + panic("invalid length") + } + // 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组 + bits := make([]uint16, 83) + for i := 0; i < 83; i++ { + bits[i] = uint16(balise.ToValLeftMsb(b[i*10 : i*10+10])) + // 打印输出 + for j := 0; j < 10; j++ { + fmt.Printf("%01b", b[i*10+j]) + } + print(" ") + if i != 0 && i%10 == 9 { + println() + } + } + println() + // 将每一个10位字整数求和后模2的10次方,得到的结果覆盖第一个10位值 + sum := uint64(0) + for i := 0; i < 83; i++ { + sum += uint64(bits[i]) + // fmt.Printf("i=%d, v10=%d, v10b=%010b\n", i, bits[i], bits[i]) + } + bits[0] = uint16(sum % 1024) + slog.Info("替换第一个10位值", "sum", sum, "bits[0]", bits[0], "bits[0]b", fmt.Sprintf("%010b", bits[0])) + rbits := make([]byte, 830) + // 将整个10位数组转换为二进制数组,依然是MSB + u0bits := balise.ToBitsLeftMsb(int(bits[0]), 10) + for i := 0; i < 10; i++ { + rbits[i] = u0bits[i] + } + for i := 10; i < 830; i++ { + rbits[i] = b[i] + } + // compare830(b, rbits) + return rbits +} + +// 由加扰位计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 +func calculateS(sb []byte) uint32 { + // 由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 + if len(sb) != 12 { + panic("invalid length") + } + B := balise.ToValLeftMsb(sb) + const A uint64 = 2801775573 + S := uint32((A * uint64(B)) % (1 << 32)) + slog.Info("由12位加扰位计算得到整数S", "B", B, "S", S, "Sb", fmt.Sprintf("%032b", S)) + return S +} + +// 由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 +// 1. 生成一个32位的线性反馈移位寄存器,其初始状态为S(左边为MSB) +// 2. 系数h31,h30,h29,h27,h25和h0等于1(表示连接),所有其他系数都为0(表示不连接) +// 3. 然后电路被时钟驱动m-1次,其中m是数据位的数量,同时输入dn的每一位dn(m-1),dn(m-2),...,dn(0),便生成加扰后的码位(在第一个时钟之前读取第一个输出out(m-1)) +// 4. 生成的加扰码位是dn的每一位与S的最高位的异或值 +// 5. 生成的加扰码位会根据系数进行异或反馈回S的最低位 +// 几种可能性: +func scrambling(dn []byte, S uint32) []byte { + if len(dn) != 830 { + panic("invalid length") + } + // const Polynomial = 0x000000AF + out := make([]byte, len(dn)) + t := S // 寄存器初始值 + for i := 0; i < len(dn); i++ { + msb := (t >> 31) & 1 + out[i] = (dn[i] ^ byte(msb)) & 1 + // fmt.Printf("i=%d, t=%032b, msb=%d, dn=%d, out=%d\n", i, t, msb, dn[i], out[i]) + xor := uint32(out[i]) + t = (xor << 30) ^ (xor << 29) ^ (xor << 28) ^ (xor << 26) ^ (xor << 24) ^ t + t = (t << 1) | xor + } + return out +} + +func descrambling(dn []byte, S uint32) []byte { + if len(dn) != 830 { + panic("invalid length") + } + // const Polynomial = 0x000000AF + out := make([]byte, len(dn)) + t := S // 寄存器初始值 + for i := 0; i < len(dn); i++ { + msb := (t >> 31) & 1 + out[i] = (dn[i] ^ byte(msb)) & 1 + // fmt.Printf("i=%d, t=%032b, msb=%d, dn=%d, out=%d\n", i, t, msb, dn[i], out[i]) + xor := uint32(dn[i]) + t = (xor << 30) ^ (xor << 29) ^ (xor << 28) ^ (xor << 26) ^ (xor << 24) ^ t + t = (t << 1) | xor + } + return out +} + +// 将830位的二进制数组先以10位为一组分别转换为11位并组合 +func convert830To913(b830 []byte) []byte { + if len(b830) != 830 { + panic("invalid length") + } + b913 := make([]byte, 913) + for i := 0; i < 83; i++ { + b11 := balise.To11(b830[i*10 : i*10+10]) + for j := 0; j < 11; j++ { + b913[i*11+j] = b11[j] + } + } + return b913 +} + +func convert913To830(b913 []byte) []byte { + if len(b913) != 913 { + panic("invalid length") + } + b830 := make([]byte, 830) + for i := 0; i < 83; i++ { + b10, err := balise.From11(b913[i*11 : i*11+11]) + if err != nil { + panic(err) + } + for j := 0; j < 10; j++ { + b830[i*10+j] = b10[j] + } + } + return b830 +} + +func compare830(b830 []byte, compare830 []byte) { + if len(b830) != 830 { + panic("invalid length") + } + for i := 0; i < 83; i++ { + for j := 0; j < 10; j++ { + fmt.Printf("%01b", b830[i*10+j]) + } + println() + for j := 0; j < 10; j++ { + fmt.Printf("%01b", compare830[i*10+j]) + } + println() + println() + } + for i := 0; i < 830; i++ { + if b830[i] != compare830[i] { + slog.Info("error", "index", i, "b830", b830[i], "compare", compare830[i]) + panic("830 bit compare error") + } + } +} + +// 以11位为一组比较两个913位的报文 +func compare913(b913 []byte, b1023 *Balise1023) { + if len(b913) != 913 { + panic("invalid length") + } + compare := b1023.data + for i := 0; i < 913; i += 11 { + for j := 0; j < 11; j++ { + print(b913[i+j]) + } + println() + for j := 0; j < 11; j++ { + print(compare[i+j]) + } + println() + println() + } +} diff --git a/example/balise_1023_830/read_excel.go b/example/balise_1023_830/read_excel.go new file mode 100644 index 0000000..4ef46f1 --- /dev/null +++ b/example/balise_1023_830/read_excel.go @@ -0,0 +1,156 @@ +package main + +import ( + "log/slog" + "runtime/debug" + "strconv" + "strings" + + "github.com/xuri/excelize/v2" +) + +const ( + fileName = "北岗子-应答器报文清单.xlsx" + sheetName = "应答器报文清单" + codeColumn = "应答器编号" + nameColumn = "应答器名称" + typeColumn = "类型" + checkSumColumn = "校验码" + msg830strColumn = "用户报文(830bits)" + msg1023strColumn = "报文(1023bits)" +) + +var heads []string + +func init() { + initHeads() +} + +func initHeads() { + heads = append(heads, codeColumn) + heads = append(heads, nameColumn) + heads = append(heads, typeColumn) + heads = append(heads, checkSumColumn) + heads = append(heads, msg830strColumn) + heads = append(heads, msg1023strColumn) +} + +func buildHeadIndex(row []string) map[string]int { + headIdx := make(map[string]int) + for i, column := range row { + column = HandleStringSpace(column) + if column == codeColumn { + headIdx[column] = i + } else if column == nameColumn { + headIdx[column] = i + } else if column == typeColumn { + headIdx[column] = i + } else if column == checkSumColumn { + headIdx[column] = i + } else if column == msg830strColumn { + headIdx[column] = i + } else if column == msg1023strColumn { + headIdx[column] = i + } + } + // 检查headIndex是否完整 + if len(headIdx) <= 0 { + return nil + } + checkHeadsIndex(headIdx, fileName, sheetName, heads) + return headIdx +} + +func checkHeadsIndex(headIdx map[string]int, fileName, sheetName string, heads []string) { + // 检查headIndex是否完整 + for _, v := range heads { + if _, ok := headIdx[v]; !ok { + slog.Error("表头缺失", "文件名", fileName, "SheetName", sheetName, "表头", v) + panic("课时表头缺失") + } + } +} + +func ReadTransponders() map[string]Transponder { + return readExcel(fileName, sheetName, readRows) +} + +func readExcel[T any](fileName, sheetName string, handle func(rows [][]string) map[string]T) map[string]T { + f, err := excelize.OpenFile(fileName) + if err != nil { + slog.Error("打开表文件异常", "表名", fileName, "error", err) + debug.PrintStack() + panic("打开表文件异常") + } + defer func() { + if err := f.Close(); err != nil { + slog.Error("文件关闭异常", "error", err) + } + }() + + rows, err := f.GetRows(sheetName) + if err != nil { + slog.Error("读取Sheet异常", "SheetName", sheetName, "error", err) + panic(err) + } + // fmt.Println(rows) + return handle(rows) +} + +func readRows(rows [][]string) map[string]Transponder { + dataMap := make(map[string]Transponder) + var headIdx map[string]int + for _, row := range rows { + if headIdx == nil { + headIdx = buildHeadIndex(row) + // if headIdx != nil { + // slog.Info("读取到表头索引", "文件名", fileName, "表名", sheetName, "索引", headIdx) + // } + } else { + rowSize := len(row) + if rowSize <= 0 { + continue + } + if rowSize <= headIdx[msg1023strColumn] { + // slog.Info("非数据行", "row", row, "rowIndex", i) + continue + } + codeStr := row[headIdx[codeColumn]] + if codeStr == "" { + continue + } + codeStr = HandleStringSpace(codeStr) + code, err := strconv.ParseInt(codeStr, 10, 32) + if err != nil { + slog.Error("应答器编号错误", "编号", codeStr, "error", err) + panic("应答器编号错误") + } + name := row[headIdx[nameColumn]] + if name == "" { + continue + } + name = HandleStringSpace(name) + tp := row[headIdx[typeColumn]] + checkSum := row[headIdx[checkSumColumn]] + msg830 := row[headIdx[msg830strColumn]] + msg1023 := row[headIdx[msg1023strColumn]] + dataMap[name] = Transponder{ + Code: int(code), + Name: name, + Type: tp, + CheckSum: checkSum, + Msg830: msg830, + Msg1023: msg1023, + } + } + } + slog.Info("读取结果", "文件名", fileName, "SheetName", sheetName, "总数", len(dataMap)) + // fmt.Println(dataMap) + return dataMap +} + +func HandleStringSpace(s string) string { + s = strings.ReplaceAll(s, " ", "") + s = strings.ReplaceAll(s, "\n", "") + return s +} diff --git a/example/ex1/main.go b/example/ex1/main.go new file mode 100644 index 0000000..1b9564f --- /dev/null +++ b/example/ex1/main.go @@ -0,0 +1,32 @@ +package main + +import "log/slog" + +func main() { + a1 := calculateAvgAcc(136960.88, 24.41978) + a2 := calculateAvgAcc(34874, 14.97515) + slog.Info("根据位移和时间计算平均加速度", "通号平均加速度", a1, "动力学平均加速度", a2) + avt1 := calculateAvgAccByV(6.94444, 24.41978) + avt2 := calculateAvgAccByV(6.94444, 14.97515) + slog.Info("根据速度和时间计算平均加速度", "通号平均加速度", avt1, "动力学平均加速度", avt2) + s1 := calculateS(0.28437766432762146, 24.41978) + s2 := calculateS(0.46373090147972107, 14.97515) + slog.Info("根据加速度和时间计算位移", "通号最小位移", s1, "动力学最小位移", s2) + slog.Info("实际位移", "通号实际位移差", 136960.88-s1, "动力学实际位移差", 34874-s2) +} + +// 根据位移和时间计算平均加速度(初始速度为0) +// s单位为mm,t单位为s +func calculateAvgAcc(s float32, t float32) float32 { + return 2 * s / (t * t) / 1000 +} + +// 根据速度和时间计算平均加速度(初始速度为0) +func calculateAvgAccByV(v float32, t float32) float32 { + return v / t +} + +// 根据加速度和时间计算位移(初始速度为0) +func calculateS(a float32, t float32) float32 { + return 0.5 * a * t * t * 1000 +} diff --git a/example/lfsr/main.go b/example/lfsr/main.go new file mode 100644 index 0000000..1d72efe --- /dev/null +++ b/example/lfsr/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "fmt" + "log/slog" +) + +func main() { + // fib_lfsr() + galois_lfsr() +} + +/* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */ +func fib_lfsr() { + startState := uint16(0xACE1) + lfsr := startState + var bit uint16 + period := uint64(0) + for { + slog.Info("fib_lfsr", "bit", fmt.Sprintf("%01b", lfsr&1), "lfsr", fmt.Sprintf("%016b", lfsr)) + bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5)) & 1 + lfsr = (lfsr >> 1) | (bit << 15) + period++ + if period == 15 { + break + } + if lfsr == startState { + break + } + } + println(period) +} + +/* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */ +func galois_lfsr() { + startState := uint16(0xACE1) + lfsr := startState + var bit uint16 + period := uint64(0) + for { + slog.Info("galois_lfsr", "bit", fmt.Sprintf("%01b", lfsr&1), "lfsr", fmt.Sprintf("%016b", lfsr)) + bit = lfsr & 1 + lfsr >>= 1 + if bit == 1 { + lfsr ^= 0xB400 + } + period++ + // if period == 15 { + // break + // } + if lfsr == startState { + break + } + } + println(period) +} diff --git a/example/test/main.go b/example/test/main.go new file mode 100644 index 0000000..65e04e2 --- /dev/null +++ b/example/test/main.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + "math" +) + +func main() { + d2, d1, d0 := encodeAcc(6.742071875) + a := decode2Acc(d2, d1, d0) + fmt.Println(a) +} + +const G = 9.80665 + +func encodeAcc(a float32) (d2, d1, d0 byte) { + d2 = 0 + d1 = 0 + d0 = 0 + x := a / G + v := uint32(0) + for i := 17; i >= 0; i-- { + t := float32(1.0 / math.Pow(2, float64(17-i))) + if t > x { + continue + } else { + v |= 1 << i + x -= t + } + } + fmt.Printf("%b, %b\n", v, v<<6) + v <<= 6 + d0 = byte(v) + d1 = byte(v >> 8) + d2 = byte(v >> 16) + fmt.Printf("%b, %b, %b\n", d2, d1, d0) + return +} + +func decode2Acc(d2, d1, d0 byte) float32 { + v := uint32(d2)<<10 | uint32(d1)<<2 | uint32(d0>>6) + fmt.Printf("%b\n", v) + x := float32(0) + for i := 17; i >= 0; i-- { + if v&(1< 1022 { + panic("invalid range") + } + return bits[1022-start : 1022-(end-1)] +} + +// 转换128字节数据为1023位数据 +func convertTo1023Bits(byte128 []byte) []byte { + if len(byte128) != 128 { + panic("invalid length") + } + // 字节转换为bit数组 + bits := make([]byte, 1024) + for i, bt := range byte128 { + for j := 0; j < 8; j++ { + move := 7 - j + idx := i*8 + j + bits[idx] = (bt >> move) & 1 + } + } + bits1023 := bits[0:1023] + return bits1023 +} + +// 由加扰位计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 +func calculateS(sb []byte) uint32 { + // 由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 + if len(sb) != 12 { + panic("invalid length") + } + B := ToValLeftMsb(sb) + const A uint64 = 2801775573 + S := uint32((A * uint64(B)) % (1 << 32)) + slog.Info("由12位加扰位计算得到整数S", "B", B, "S", S, "Sb", fmt.Sprintf("%032b", S)) + return S +} + +// 以11位为一组比较两个913位的报文 +func compare913(b913 []byte, compare []byte) { + if len(b913) != 913 { + panic("invalid length") + } + for i := 0; i < 913; i += 11 { + for j := 0; j < 11; j++ { + print(b913[i+j]) + } + println() + for j := 0; j < 11; j++ { + print(compare[i+j]) + } + println() + println() + } +} + +// 比较830位数据 +func compare830(b830 []byte, compare830 []byte) { + if len(b830) != 830 { + panic("invalid length") + } + for i := 0; i < 83; i++ { + for j := 0; j < 10; j++ { + fmt.Printf("%01b", b830[i*10+j]) + } + println() + for j := 0; j < 10; j++ { + fmt.Printf("%01b", compare830[i*10+j]) + } + println() + println() + } + for i := 0; i < 830; i++ { + if b830[i] != compare830[i] { + slog.Info("error", "index", i, "b830", b830[i], "compare", compare830[i]) + panic("830 bit compare error") + } } } diff --git a/third_party/balise/conv.go b/third_party/balise/conv.go index 16adbbd..a6c67c1 100644 --- a/third_party/balise/conv.go +++ b/third_party/balise/conv.go @@ -113,14 +113,83 @@ var ConvWords = []uint16{ var convWordMap = make(map[uint16]int, 1024) func init() { + if len(ConvWords) != 1024 { + panic(fmt.Errorf("ConvWords长度不是1024, len=%d", len(ConvWords))) + } + // 检查,前512个字的累加和为267528,所有1024个字的累加和为1048064 + sum1 := 0 + sum2 := 0 + for i := 0; i < 1024; i++ { + if i < 512 { + sum1 += int(ConvWords[i]) + } + sum2 += int(ConvWords[i]) + } + if sum1 != 267528 { + panic(fmt.Errorf("前512个字的累加和不是267528, sum1=%d", sum1)) + } + if sum2 != 1048064 { + panic(fmt.Errorf("所有1024个字的累加和不是1048064, sum2=%d", sum2)) + } + // 检查,后一个字比前一个字大 + for i := 1; i < 1024; i++ { + if ConvWords[i] <= ConvWords[i-1] { + panic(fmt.Errorf("第%d个字比第%d个字小, %04o <= %04o", i, i-1, ConvWords[i], ConvWords[i-1])) + } + } for i, v := range ConvWords { convWordMap[v] = i + fmt.Printf("%04o: %d\n", v, i) + // slog.Info("构建10位到11位转换置换字", "i", i, "v", v) } + // 检查:翻转有效字的所有位能形成另一个有效字 + for _, v := range ConvWords { + rv := revertBits(v) + _, ok := convWordMap[rv] + if !ok { + panic(fmt.Errorf("构建10位到11位转换置换字失败, v=%04o, rv=%04o", v, rv)) + } + } +} + +// 翻转11位bit数组 +func revertBits(word uint16) uint16 { + bits11 := ToBitsLeftMsb(int(word), 11) + revert := make([]byte, 11) + for i := 0; i < 11; i++ { + if bits11[i] == 1 { + revert[i] = 0 + } else { + revert[i] = 1 + } + } + rw := ToValLeftMsb(revert) + // slog.Info("反转11位bit数组", "word", fmt.Sprintf("%04o", word), "bits11", bits11, "revert", revert, "revertWord", fmt.Sprintf("%04o", rw)) + return rw } // bit数组转换为数字,左边为最高有效位 // v - 0/1数组,数组的每个值都只能是0或1 -func ToVal(v []int) uint16 { +func ToValLeftMsb(v []byte) uint16 { + if len(v) > 15 { + panic(fmt.Errorf("不支持15位以上")) + } + val := uint16(0) + l := len(v) + elems := make([]string, l) + for i := 0; i < l; i++ { + elems[i] = fmt.Sprintf("%d", v[i]) + if v[i] == 1 { + val += (1 << (l - i - 1)) + } + } + // slog.Info("ToValLeftMsb", "len", l, "v", strings.Join(elems, ""), "val", fmt.Sprintf("%04o", val)) + return val +} + +// bit数组转换为数字,右边为最高有效位 +// v - 0/1数组,数组的每个值都只能是0或1 +func ToValRightMsb(v []byte) uint16 { if len(v) > 15 { panic(fmt.Errorf("不支持15位以上")) } @@ -128,15 +197,15 @@ func ToVal(v []int) uint16 { l := len(v) for i := 0; i < l; i++ { if v[i] == 1 { - val += (1 << (l - i - 1)) + val += (1 << i) } } return val } // 数字转换为bit数组,左边为最高有效位 -func ToBits(val int, count int) []int { - bs := make([]int, count) +func ToBitsLeftMsb(val int, count int) []byte { + bs := make([]byte, count) for i := 0; i < count; i++ { tmp := 1 << (count - 1 - i) if (val & (tmp)) == (tmp) { @@ -148,26 +217,42 @@ func ToBits(val int, count int) []int { return bs } +// 数字转换为bit数组,右边为最高有效位 +func ToBitsRightMsb(val int, count int) []byte { + bs := make([]byte, count) + for i := 0; i < count; i++ { + tmp := 1 << i + if (val & (tmp)) == (tmp) { + bs[i] = 1 + } else { + bs[i] = 0 + } + } + return bs +} + // 11位字转换回10位字 -func From11(b11 []int) ([]int, error) { - v11 := ToVal(b11) - v10, ok := convWordMap[uint16(v11)] +func From11(b11 []byte) ([]byte, error) { + v11 := ToValLeftMsb(b11) + v10, ok := convWordMap[v11] + // slog.Info("11位字转换回10位字", "v11", fmt.Sprintf("%04o", v11), "v11b", fmt.Sprintf("%011b", v11), "v10", v10, "ok", ok, "v10bits", fmt.Sprintf("%010b", v10), "to10Bits", ToBitsLeftMsb(v10, 10)) if ok { - return ToBits(v10, 10), nil + return ToBitsLeftMsb(v10, 10), nil } else { - return nil, fmt.Errorf("错误的11位字") + return nil, fmt.Errorf("错误的11位字,word11=%04o", v11) } } // 10位字转换为11位字 -func To11(b10 []int) []int { +func To11(b10 []byte) []byte { if len(b10) != 10 { panic(fmt.Errorf("应答器编码10位字转换为11位字参数异常: 位数不是10, len=%d", len(b10))) } - v10 := ToVal(b10) + v10 := ToValLeftMsb(b10) if v10 > 1023 { panic(fmt.Errorf("应答器编码10位字转换为11位字参数异常: 10位字转为整数不能大于1023, v10=%d", v10)) } v11 := ConvWords[v10] - return ToBits(int(v11), 11) + // slog.Info("10位字转换为11位字", "v10", v10, "v10b", fmt.Sprintf("%010b", v10), "v11", fmt.Sprintf("%04o", v11), "v11bits", fmt.Sprintf("%011b", v11), "to11Bits", ToBitsLeftMsb(int(v11), 11)) + return ToBitsLeftMsb(int(v11), 11) } diff --git a/third_party/balise/conv_test.go b/third_party/balise/conv_test.go index 30d363a..ff2a7c4 100644 --- a/third_party/balise/conv_test.go +++ b/third_party/balise/conv_test.go @@ -39,6 +39,6 @@ func TestConvList(t *testing.T) { } func TestTo11(t *testing.T) { - b10 := []int{0, 0, 0, 0, 0, 0, 0, 0, 0, 1} + b10 := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 1} balise.To11(b10) } diff --git a/third_party/balise/decode.go b/third_party/balise/decode.go new file mode 100644 index 0000000..4e58d1d --- /dev/null +++ b/third_party/balise/decode.go @@ -0,0 +1,88 @@ +package balise + +import ( + "fmt" + "log/slog" +) + +// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组,除了第一个10位值,其余值求和,然后循环2的10次方次与其他值求和结果相加后模2的10次方,若结果和第一个10位值相同,则结束,此值即为原始的第一个10位值,将此值替换为第一个10位二进制数组,依然是左边为MSB +func revertFirst10Bits(b []byte) []byte { + if len(b) != 830 { + panic("invalid length") + } + // 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组 + w10s := make([]uint16, 83) + for i := 0; i < 83; i++ { + w10s[i] = uint16(ToValLeftMsb(b[i*10 : i*10+10])) + // 打印输出 + for j := 0; j < 10; j++ { + fmt.Printf("%01b", b[i*10+j]) + } + print(" ") + if i != 0 && i%10 == 9 { + println() + } + } + println() + // 将除了第一个10位字整数求和 + sum := uint64(0) + for i := 1; i < 83; i++ { + sum += uint64(w10s[i]) + } + // 循环2的10次方次与其他值求和结果相加后模2的10次方 + for i := 0; i < 1024; i++ { + test := sum + uint64(i) + if test%1024 == uint64(w10s[0]) { + w10s[0] = uint16(i) + break + } + } + slog.Info("还原第一个10位值", "sum", sum, "bits[0]", w10s[0], "bits[0]b", fmt.Sprintf("%010b", w10s[0])) + bits := make([]byte, 830) + // 将整个10位数组转换为二进制数组,依然是MSB + u0bits := ToBitsLeftMsb(int(w10s[0]), 10) + for i := 0; i < 10; i++ { + bits[i] = u0bits[i] + } + for i := 10; i < 830; i++ { + bits[i] = b[i] + } + return bits +} + +// 解扰,由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行解扰 +func descrambling(dn []byte, S uint32) []byte { + if len(dn) != 830 { + panic("invalid length") + } + // const Polynomial = 0x000000AF + out := make([]byte, len(dn)) + t := S // 寄存器初始值 + for i := 0; i < len(dn); i++ { + msb := (t >> 31) & 1 + out[i] = (dn[i] ^ byte(msb)) & 1 + // fmt.Printf("i=%d, t=%032b, msb=%d, dn=%d, out=%d\n", i, t, msb, dn[i], out[i]) + xor := uint32(dn[i]) + t = (xor << 30) ^ (xor << 29) ^ (xor << 28) ^ (xor << 26) ^ (xor << 24) ^ t + t = (t << 1) | xor + } + return out +} + +// 转换913位数据为830位数据 +func convert913To830(b913 []byte) ([]byte, error) { + if len(b913) != 913 { + panic("invalid length") + } + b830 := make([]byte, 830) + for i := 0; i < 83; i++ { + b10, err := From11(b913[i*11 : i*11+11]) + if err != nil { + return nil, buildError(err.Error()) + } + for j := 0; j < 10; j++ { + b830[i*10+j] = b10[j] + } + } + return b830, nil +} diff --git a/third_party/balise/encode.go b/third_party/balise/encode.go new file mode 100644 index 0000000..2b0dd19 --- /dev/null +++ b/third_party/balise/encode.go @@ -0,0 +1,86 @@ +package balise + +import ( + "fmt" + "log/slog" +) + +// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组,然后求和后模2的10次方,得到的结果覆盖第一个10位值,然后将整个10位数组转换为二进制数组,依然是左边为MSB +func replaceFirst10Bits(b []byte) []byte { + if len(b) != 830 { + panic("invalid length") + } + // 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组 + bits := make([]uint16, 83) + for i := 0; i < 83; i++ { + bits[i] = uint16(ToValLeftMsb(b[i*10 : i*10+10])) + // 打印输出 + for j := 0; j < 10; j++ { + fmt.Printf("%01b", b[i*10+j]) + } + print(" ") + if i != 0 && i%10 == 9 { + println() + } + } + println() + // 将每一个10位字整数求和后模2的10次方,得到的结果覆盖第一个10位值 + sum := uint64(0) + for i := 0; i < 83; i++ { + sum += uint64(bits[i]) + // fmt.Printf("i=%d, v10=%d, v10b=%010b\n", i, bits[i], bits[i]) + } + bits[0] = uint16(sum % 1024) + slog.Info("替换第一个10位值", "sum", sum, "bits[0]", bits[0], "bits[0]b", fmt.Sprintf("%010b", bits[0])) + rbits := make([]byte, 830) + // 将整个10位数组转换为二进制数组,依然是MSB + u0bits := ToBitsLeftMsb(int(bits[0]), 10) + for i := 0; i < 10; i++ { + rbits[i] = u0bits[i] + } + for i := 10; i < 830; i++ { + rbits[i] = b[i] + } + // compare830(b, rbits) + return rbits +} + +// 由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰 +// 1. 生成一个32位的线性反馈移位寄存器,其初始状态为S(左边为MSB) +// 2. 系数h31,h30,h29,h27,h25和h0等于1(表示连接),所有其他系数都为0(表示不连接) +// 3. 然后电路被时钟驱动m-1次,其中m是数据位的数量,同时输入dn的每一位dn(m-1),dn(m-2),...,dn(0),便生成加扰后的码位(在第一个时钟之前读取第一个输出out(m-1)) +// 4. 生成的加扰码位是dn的每一位与S的最高位的异或值 +// 5. 生成的加扰码位会根据系数进行异或反馈回S的最低位 +// 几种可能性: +func scrambling(dn []byte, S uint32) []byte { + if len(dn) != 830 { + panic("invalid length") + } + // const Polynomial = 0x000000AF + out := make([]byte, len(dn)) + t := S // 寄存器初始值 + for i := 0; i < len(dn); i++ { + msb := (t >> 31) & 1 + out[i] = (dn[i] ^ byte(msb)) & 1 + // fmt.Printf("i=%d, t=%032b, msb=%d, dn=%d, out=%d\n", i, t, msb, dn[i], out[i]) + xor := uint32(out[i]) + t = (xor << 30) ^ (xor << 29) ^ (xor << 28) ^ (xor << 26) ^ (xor << 24) ^ t + t = (t << 1) | xor + } + return out +} + +// 将830位的二进制数组先以10位为一组分别转换为11位并组合 +func convert830To913(b830 []byte) []byte { + if len(b830) != 830 { + panic("invalid length") + } + b913 := make([]byte, 913) + for i := 0; i < 83; i++ { + b11 := To11(b830[i*10 : i*10+10]) + for j := 0; j < 11; j++ { + b913[i*11+j] = b11[j] + } + } + return b913 +} diff --git a/third_party/example/main.go b/third_party/example/main.go index 8480313..04e0059 100644 --- a/third_party/example/main.go +++ b/third_party/example/main.go @@ -46,13 +46,13 @@ func main() { // fmt.Println() // } // } - v10 := balise.ToVal([]int{ + v10 := balise.ToValLeftMsb([]byte{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}) fmt.Println(v10) - bs := balise.ToBits(1982, 11) + bs := balise.ToBitsLeftMsb(1982, 11) fmt.Println(bs) // fmt.Printf("%o\n", balise.ConvWords[511]) } diff --git a/北岗子-应答器报文清单.xlsx b/北岗子-应答器报文清单.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a9c08f0d961c1d5ca75260914d54c330e6d3a411 GIT binary patch literal 84293 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 s}0tOL#ABJy!M~} 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

W{$JKRu?asc$LEV2}5Zj<2=5yYIkaxo(x^ z=65z+CPxJAetV_8$>jOV35Aq{%oJ(qzRtjQPD5p;=INnhBLkBzM{~>Xt9)n@ zV*7P={3h_rXRBP_XYb|zRkW3{DYVQ;tUF)U#Gv%pLj_r7@KT^4>pWFg5<3;%u4cZ2 z$RkOBD!c$8*zENNY)HW$2tuD92lL}pPpC)Z)>m9d?M?xCYYCpp{&q2s&vc3ybdoxPV5b&1eAjUN^4<_c1T82W@$Y}!_9CiNm;twsD!bms2- zW|D-uL}Wlr{a3?=PwN@ECH zYR`;`_B^x4OwpMc6YV9im;xVnmnMPK)d6X@5Hb=B#Gh)INTRIaZX64=i9eiN2!IYx z1M2kPP6-qUb{`ff$1mUX0RXa{26XkrkAPsGVS)BGZP;V&~YgciKp~p>N31A=oKml4LIP}5*@S`AD0PH;(D1aYmu|SpJIPe0# zLjwztEJHJWeuzL=DMy4C6ck`65q2TX1sr(cXh}Z~eawSaHgxeZ4|iQc0TVr@9vq(m ziGzXU*WC~Vf$r_*#34Exw`T;wqI4H0cc*D9fk)o2+IPS*H3ZU`yBIfciowE~cqU^H z(?LxhpM>>tmPf>6_(ntbwIBnkZ&OGm=V+j2l7&2o3`kaf4IC~GS^WBrZP*|L#M^s* zfPiV=unB1y+eSDK(K(r^q0%AK06mZAd8355f0}F`Vt)qaZ1~UMndv`1#+kan1 zB_H@qQkp=ZKxkkfK2!tma<{-RS==N_zma6guqF^TTahp*D&Rw89F)~~sTjMhjduiW zD)K=-bKCOF0T)FJ4`tw-ja(YAJrc}AZWP{Ma8clP9_yDYdh!k-03{Y|khoD=JaJLr zB*3EN4EUCq0XDm(uqYQ8xF~Ssu_*Kig-<7dEjH5_O`gF;fx~USgAZsX5LCg>0uTl1 J^