pack_senddataack.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package zigbee
  2. import (
  3. "encoding/binary"
  4. "github.com/valyala/bytebufferpool"
  5. )
  6. type PackSendDataAck struct {
  7. M1Flag uint16 //固定为F1F1
  8. M1Leng uint16 //包体1长度
  9. M1Cmd uint8 //1字节
  10. Result uint8 //0接收成功,1接收失败,2地址编码错误
  11. M1Crc uint16 //整包CRC
  12. }
  13. func (o *PackSendDataAck) SetData(result uint8) {
  14. o.Result = result
  15. }
  16. func (o *PackSendDataAck) EnCode() (*bytebufferpool.ByteBuffer, error) {
  17. buff := bytebufferpool.Get()
  18. buff.Write([]byte{0xF1, 0xF1}) //M1Flag uint16 //固定为F1F1
  19. tmp := make([]byte, 2)
  20. binary.BigEndian.PutUint16(tmp, 1)
  21. buff.Write(tmp) //M1Leng uint16 //包体1长度
  22. buff.WriteByte(CmdSendDataAck) //M1Cmd uint8 //1字节
  23. buff.WriteByte(o.Result)
  24. crc16 := CRC16(buff.B)
  25. tmp2 := make([]byte, 2)
  26. binary.BigEndian.PutUint16(tmp2, crc16)
  27. buff.Write(tmp2) //外层CRC16
  28. return buff, nil
  29. }
  30. func (o *PackSendDataAck) DeCode(Data []byte) error {
  31. if len(Data) < 7 {
  32. return ErrorProtocol
  33. }
  34. if Data[0] != 0xF1 || Data[1] != 0xF1 {
  35. return ErrorProtocol
  36. }
  37. o.M1Flag = binary.BigEndian.Uint16(Data[0:2])
  38. o.M1Leng = binary.BigEndian.Uint16(Data[2:4])
  39. o.M1Cmd = Data[4]
  40. o.M1Crc = binary.BigEndian.Uint16(Data[o.M1Leng+5 : o.M1Leng+7])
  41. //校验CRC1
  42. crc := CRC16(Data[0 : o.M1Leng+5])
  43. if o.M1Crc != crc {
  44. return ErrorInvalidCrc1
  45. }
  46. return nil
  47. }