2024-06-06 17:57:30 +08:00
|
|
|
|
package btm_vobc
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/hex"
|
|
|
|
|
"fmt"
|
|
|
|
|
"joylink.club/bj-rtsts-server/third_party/message"
|
|
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
WAIT_FF_C1 = 0x00
|
|
|
|
|
WAIT_FF_C2 = 0x01
|
|
|
|
|
WAIT_NO_FF = 0x02
|
|
|
|
|
WAIT_FF_POS = 0x03
|
|
|
|
|
ABNORMAL_STATE = 0x04
|
|
|
|
|
|
|
|
|
|
/*FFFE数据接收状态*/
|
|
|
|
|
COM_WAIT_START_FF = 0x00
|
|
|
|
|
COM_WAIT_START_FE = 0x01
|
|
|
|
|
COM_WAIT_STOP_FF = 0x02
|
|
|
|
|
COM_WAIT_STOP_FD = 0x03
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// TranslateFromFFFE 将经过FFFE转义处理后的数据(已经去掉了头FFFE及尾FFFD)还原为原始数据。
|
|
|
|
|
func TranslateFromFFFE(pSrc []byte) ([]byte, uint16) {
|
|
|
|
|
var (
|
|
|
|
|
srcPos, tgtPos, nonFFCount, nextFFPos uint16
|
|
|
|
|
char uint8
|
|
|
|
|
state int
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if len(pSrc) == 0 {
|
|
|
|
|
return nil, 0 // 入参错误
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pTgt := make([]byte, len(pSrc)) // 预分配与输入等长的缓冲区
|
|
|
|
|
tgtPos = 0
|
|
|
|
|
state = WAIT_FF_C1
|
|
|
|
|
nonFFCount = 0
|
|
|
|
|
|
|
|
|
|
for srcPos = 0; srcPos < uint16(len(pSrc)); srcPos++ {
|
|
|
|
|
char = pSrc[srcPos]
|
|
|
|
|
switch state {
|
|
|
|
|
case WAIT_FF_C1:
|
|
|
|
|
if char == 0xFF {
|
|
|
|
|
pTgt[tgtPos] = char
|
|
|
|
|
tgtPos++
|
|
|
|
|
state = WAIT_FF_C2
|
|
|
|
|
} else {
|
|
|
|
|
pTgt[tgtPos] = char
|
|
|
|
|
tgtPos++
|
|
|
|
|
}
|
|
|
|
|
case WAIT_FF_C2:
|
|
|
|
|
if char == 0xFD || char == 0xFE || char == 0xFF {
|
|
|
|
|
state = ABNORMAL_STATE
|
|
|
|
|
} else {
|
|
|
|
|
if char == 0 {
|
|
|
|
|
state = WAIT_NO_FF
|
|
|
|
|
} else if char == 1 {
|
|
|
|
|
pTgt[tgtPos] = 0xFF
|
|
|
|
|
tgtPos++
|
|
|
|
|
state = WAIT_FF_C1
|
|
|
|
|
} else {
|
|
|
|
|
nextFFPos = srcPos + uint16(char) - 1
|
|
|
|
|
state = WAIT_FF_POS
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case WAIT_NO_FF:
|
|
|
|
|
nonFFCount++
|
|
|
|
|
if char == 0xFF && nonFFCount < 252 {
|
|
|
|
|
state = ABNORMAL_STATE
|
|
|
|
|
} else {
|
|
|
|
|
pTgt[tgtPos] = char
|
|
|
|
|
tgtPos++
|
|
|
|
|
if nonFFCount == 252 {
|
|
|
|
|
nonFFCount = 0
|
|
|
|
|
state = WAIT_FF_C1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case WAIT_FF_POS:
|
|
|
|
|
if char == 0xFF {
|
|
|
|
|
state = ABNORMAL_STATE
|
|
|
|
|
} else {
|
|
|
|
|
pTgt[tgtPos] = char
|
|
|
|
|
tgtPos++
|
|
|
|
|
if srcPos == nextFFPos {
|
|
|
|
|
pTgt[tgtPos] = 0xFF
|
|
|
|
|
tgtPos++
|
|
|
|
|
state = WAIT_FF_C1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
state = ABNORMAL_STATE
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if state == ABNORMAL_STATE {
|
|
|
|
|
tgtPos = 0
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 退出时的状态判断
|
|
|
|
|
if state == WAIT_FF_C2 || state == WAIT_FF_POS {
|
|
|
|
|
tgtPos = 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return pTgt[:tgtPos], tgtPos
|
|
|
|
|
}
|
|
|
|
|
func TestTss(t *testing.T) {
|
|
|
|
|
ss := "fffee601804f004d00921d21002a00ea014fef63995bff009122ce0000000000000000000000000000211d90000000000000000000007b07310379cefffd"
|
|
|
|
|
ss = "fffee601804f004d00444a1c002a00473bbfa11d4b3b029122a800000000000000000000000000001c4a42000000000000000000008970492fff00d0fffd"
|
|
|
|
|
dd, _ := hex.DecodeString(ss)
|
|
|
|
|
frameType, dataText, _ := message.BtmVobcDecode(dd)
|
|
|
|
|
if frameType == message.COMMAND_TYPE {
|
|
|
|
|
fmt.Println("1111111111111111")
|
|
|
|
|
} else if frameType == message.REQUEST_TYPE {
|
|
|
|
|
|
|
|
|
|
req := &message.BtmVobcReq{}
|
|
|
|
|
req.Decode(dataText)
|
|
|
|
|
fmt.Println("22222222222222222222")
|
|
|
|
|
} else {
|
|
|
|
|
fmt.Println("zzzzzzzzzzzzzzzzzzzzz")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestFffe(t *testing.T) {
|
|
|
|
|
var testUserBtmMsg = "90007F8181B60B10183280003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
|
|
|
|
userMsg, _ := hex.DecodeString(testUserBtmMsg)
|
|
|
|
|
|
|
|
|
|
msg := &message.BtmVobcMessage{FontTtl: 5, BtmStatus: 0x00, DecodeTime: 10, BackTtl: 4, BtmMsg: userMsg, ResponseTime: 10,
|
|
|
|
|
VobcLifeNum: 123, BaseBtmVobc: message.BaseBtmVobc{AutoIdFrame: 123}}
|
|
|
|
|
sendData := msg.Encode()
|
|
|
|
|
fmt.Println(hex.EncodeToString(sendData))
|
|
|
|
|
}
|
|
|
|
|
func TestDecode232(t *testing.T) {
|
|
|
|
|
var dd uint32 = 888888888
|
|
|
|
|
fmt.Println(dd)
|
|
|
|
|
fmt.Println(uint16(dd))
|
|
|
|
|
ss := "9287a8000511006464000a000000000000000000000490007f8181b60b10183280003fff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff01ff000a0023438bf4c27929"
|
|
|
|
|
userMsg, _ := hex.DecodeString(ss)
|
|
|
|
|
arr, _ := TranslateFromFFFE(userMsg)
|
|
|
|
|
fmt.Println(arr)
|
|
|
|
|
fmt.Println(hex.EncodeToString(arr))
|
|
|
|
|
|
|
|
|
|
}
|
2024-06-06 18:56:25 +08:00
|
|
|
|
|
|
|
|
|
func TestDecode2311(t *testing.T) {
|
|
|
|
|
var data uint16 // 初始化为0
|
|
|
|
|
|
|
|
|
|
// 将第0, 1, 2, 3位设置为1(二进制中的1111)
|
|
|
|
|
data |= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)
|
|
|
|
|
|
|
|
|
|
// 第4-5位设置为0(不需要操作,因为初始就是0)
|
|
|
|
|
// 但如果需要明确设置,可以这样做:
|
|
|
|
|
// data &= ^((1 << 4) | (1 << 5)) // 使用按位取反和按位与来清除这些位
|
|
|
|
|
|
|
|
|
|
// 第6-7位设置为3(二进制中的11)
|
|
|
|
|
data |= (3 << 6)
|
|
|
|
|
|
|
|
|
|
// 打印结果
|
|
|
|
|
|
|
|
|
|
fmt.Printf("The modified data is: %04X\n", data)
|
|
|
|
|
fmt.Printf("The modified data is: %b\n", data)
|
|
|
|
|
}
|