PI-ws前置过滤/前置数据处理

前置过滤:就是放在函数前面的 剔除一些不满足处理条件的情况


案例1

原始LOG

 pack {1111 0200 1501 0D0A} 
 pack {1012 1000 DF5F35875BBC 14 00 80570023 E7DCDE9D 0D0A}  
 pack {0000 0000 00 0000}
 Invaild pack length, data:00

查询原因是:

cloud发送消息以后  不可避免多发一个全部为0的数据包!

 非常迷糊吧 那就我们自己接收端主动丢弃吧!

LOG的输出是在这里
func ParseByteArray(b []uint8) (PACK_DATA, error) {
    var p PACK_DATA
    if len(b) <= 6 {
        return p, errors.New("Invaild pack length")
    }
 

其实可以前置 也就是不必惊动这个函数 提前就丢弃!

ws是在连接的时候设置的
m_ws.Connect
go ReadMsg(disconn, ws_conn, bin_callback, text_callback)    
此时真相大白
        if msg_type == websocket.TextMessage {
            log.Printf("[m_ws] Recv: %s\r\n", string(message))
            if text_callback != nil {
                binary_data, err := b64.StdEncoding.DecodeString(string(message))
                if err != nil { // Base64 parse failed, means this data is not binary type.
                    text_callback(string(message))
                } else {
                    if len(binary_data) > 6 {
                        callback(binary_data)
                    }
                }
            }
        }

案例2:

过来一帧数据 处理
pack, err := ParseByteArray(binary_data)

解释一下
pack, err :是函数的返回值 参数1 是我们自己定的结构体
type PACK_DATA struct {
    Cmd      [2]uint8
    Data_len [2]uint8
    Data     []uint8
    End_byte [2]uint8
}
(它其实是T-L-V在追加的TAIL是\R\N 不是很好吧 看上去)

传入的参数是 []byte 是B64解析的网络数据
进入函数看看

func ParseByteArray(b []uint8) (PACK_DATA, error) {
	var p PACK_DATA
	if len(b) <= 6 {
		return p, errors.New("Invaild pack length")
	}
	if b[len(b)-2] != 0x0D && b[len(b)-1] != 0x0A {
		return p, errors.New("Invaild end bytes")
	}
	copy(p.Cmd[:], b[0:2])
	copy(p.Data_len[:], b[2:4])
    datalen=b[2]
	p.Data = b[4:(len(b) - 2)]
    arraylen=len(b)-2-4
    
       if(arraylen!=datalen){
		return p, errors.New("Invaild pack TLV")
	} 
	copy(p.End_byte[:], b[len(b)-2:len(b)])

	return p, nil
}

他就是把b []uint8 切割为结构体!主要是copy
这里面的放错 有一个遗漏
1----长度必须是>6 因为结构体定义了---ok
2---结尾尾巴必须是\R\N----ok
2---自洽描述的长度Data_len和真正的Data[]需要一样多---fail
现在是在后面写的函数

pack, err := ParseByteArray(binary_data)
pack_len := *(*uint16)(unsafe.Pointer(&(pack.Data_len)))---就是强转U8[2]为U16
log.Printf("[BG] pack_len=%d\r\n", pack_len)
if pack_len != uint16(len(pack.Data)) {-----len(pack.Data)求一个数组的长度
    log.Printf("[BG] Data length not equal\r\n")
    break
}
 

前置 放在函数里面 不是很好吗

这样还不如就写在前面的函数里面 del这里

func ParseByteArray(b []uint8) (PACK_DATA, error) {
	var p PACK_DATA
	if len(b) <= 6 {
		return p, errors.New("Invaild pack length")
	}
	if b[len(b)-2] != 0x0D && b[len(b)-1] != 0x0A {
		return p, errors.New("Invaild end bytes")
	}
	copy(p.Cmd[:], b[0:2])
	copy(p.Data_len[:], b[2:4])
	datalen := int(b[3]<<8 | b[2])
	p.Data = b[4:(len(b) - 2)]
	arraylen := len(b) - 2 - 4

	fmt.Println(arraylen, datalen, b[2], b[3], "--------------")
	if arraylen != datalen {
		return p, errors.New("Invaild pack TLV")
	}
	copy(p.End_byte[:], b[len(b)-2:len(b)])

	return p, nil
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值