pack_getpid.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package zigbee
  2. import (
  3. "encoding/binary"
  4. "github.com/valyala/bytebufferpool"
  5. )
  6. type PackGetPid struct {
  7. M1Flag uint16 //固定为F1F1
  8. M1Leng uint16 //包体1长度
  9. M1Cmd uint8 //1字节
  10. M1Crc uint16 //整包CRC
  11. }
  12. func (o *PackGetPid) EnCode() (*bytebufferpool.ByteBuffer, error) {
  13. buff := bytebufferpool.Get()
  14. buff.Write([]byte{0xF1, 0xF1}) //M1Flag uint16 //固定为F1F1
  15. tmp := make([]byte, 2)
  16. binary.BigEndian.PutUint16(tmp, 0)
  17. buff.Write(tmp) //M1Leng uint16 //包体1长度
  18. buff.WriteByte(CmdGetPid) //M1Cmd uint8 //1字节
  19. //crc1
  20. crc16 := CRC16(buff.B)
  21. tmp2 := make([]byte, 2)
  22. binary.BigEndian.PutUint16(tmp2, crc16)
  23. buff.Write(tmp2) //外层CRC16
  24. return buff, nil
  25. }
  26. func (o *PackGetPid) DeCode(Data []byte) error {
  27. if len(Data) < 7 {
  28. return ErrorProtocol
  29. }
  30. if Data[0] != 0xF1 || Data[1] != 0xF1 {
  31. return ErrorProtocol
  32. }
  33. o.M1Flag = binary.BigEndian.Uint16(Data[0:2])
  34. o.M1Leng = binary.BigEndian.Uint16(Data[2:4])
  35. o.M1Cmd = Data[4]
  36. o.M1Crc = binary.BigEndian.Uint16(Data[o.M1Leng+5 : o.M1Leng+7])
  37. //校验CRC1
  38. crc := CRC16(Data[0 : o.M1Leng+5])
  39. if o.M1Crc != crc {
  40. return ErrorInvalidCrc1
  41. }
  42. return ErrorProtocol
  43. }
  44. type PackGetPidAck struct {
  45. M1Flag uint16 //固定为F1F1
  46. M1Leng uint16 //包体1长度
  47. M1Cmd uint8 //1字节
  48. Body1 PidFreq
  49. M1Crc uint16 //整包CRC
  50. }
  51. func (o *PackGetPidAck) SetData(pid uint16, freq byte) {
  52. o.Body1.PID = pid
  53. o.Body1.Frequency = freq
  54. }
  55. func (o *PackGetPidAck) EnCode() (*bytebufferpool.ByteBuffer, error) {
  56. bytebuf, err := o.Body1.EnCode()
  57. defer func() {
  58. if bytebuf != nil {
  59. bytebufferpool.Put(bytebuf)
  60. }
  61. }()
  62. if err != nil {
  63. return nil, err
  64. }
  65. buff := bytebufferpool.Get()
  66. buff.Write([]byte{0xF1, 0xF1}) //M1Flag uint16 //固定为F1F1
  67. tmp := make([]byte, 2)
  68. binary.BigEndian.PutUint16(tmp, uint16(bytebuf.Len()))
  69. buff.Write(tmp) //M1Leng uint16 //包体1长度
  70. buff.WriteByte(CmdGetPidAck) //M1Cmd uint8 //1字节
  71. buff.Write(bytebuf.B) //包体1
  72. //crc1
  73. crc16 := CRC16(buff.B)
  74. tmp2 := make([]byte, 2)
  75. binary.BigEndian.PutUint16(tmp2, crc16)
  76. buff.Write(tmp2) //外层CRC16
  77. return buff, nil
  78. }
  79. func (o *PackGetPidAck) DeCode(Data []byte) error {
  80. if len(Data) < 7 {
  81. return ErrorProtocol
  82. }
  83. if Data[0] != 0xF1 || Data[1] != 0xF1 {
  84. return ErrorProtocol
  85. }
  86. o.M1Flag = binary.BigEndian.Uint16(Data[0:2])
  87. o.M1Leng = binary.BigEndian.Uint16(Data[2:4])
  88. o.M1Cmd = Data[4]
  89. o.M1Crc = binary.BigEndian.Uint16(Data[o.M1Leng+5 : o.M1Leng+7])
  90. //校验CRC1
  91. crc := CRC16(Data[0 : o.M1Leng+5])
  92. if o.M1Crc != crc {
  93. return ErrorInvalidCrc1
  94. }
  95. if o.M1Leng > 0 {
  96. return o.Body1.DeCode(Data[5 : o.M1Leng+5])
  97. }
  98. return ErrorProtocol
  99. }