packet.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package cli
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "io"
  6. "math"
  7. "git.nspix.com/golang/micro/helper/unsafestr"
  8. )
  9. var (
  10. feature = []byte{67, 76, 73}
  11. )
  12. const (
  13. PacketTypeCompleter byte = 0x01
  14. PacketTypeData = 0x02
  15. PacketTypeEcho = 0x03
  16. )
  17. const (
  18. FlagPart = 0x00
  19. FlagComplete = 0x01
  20. )
  21. type Frame struct {
  22. Feature []byte
  23. Type byte `json:"type"`
  24. Flag byte `json:"flag"`
  25. Seq uint16 `json:"seq"`
  26. Data []byte `json:"data"`
  27. Error string `json:"error"`
  28. Timestamp int64 `json:"timestamp"`
  29. }
  30. func nextFrame(r io.Reader) (frame *Frame, err error) {
  31. var (
  32. n int
  33. dataLength uint16
  34. errorLength uint16
  35. errBuf []byte
  36. )
  37. frame = &Frame{Feature: make([]byte, 3)}
  38. if _, err = io.ReadFull(r, frame.Feature); err != nil {
  39. return
  40. }
  41. if !bytes.Equal(frame.Feature, feature) {
  42. err = io.ErrUnexpectedEOF
  43. return
  44. }
  45. if err = binary.Read(r, binary.LittleEndian, &frame.Type); err != nil {
  46. return
  47. }
  48. if err = binary.Read(r, binary.LittleEndian, &frame.Flag); err != nil {
  49. return
  50. }
  51. if err = binary.Read(r, binary.LittleEndian, &frame.Seq); err != nil {
  52. return
  53. }
  54. if err = binary.Read(r, binary.LittleEndian, &frame.Timestamp); err != nil {
  55. return
  56. }
  57. if err = binary.Read(r, binary.LittleEndian, &dataLength); err != nil {
  58. return
  59. }
  60. if err = binary.Read(r, binary.LittleEndian, &errorLength); err != nil {
  61. return
  62. }
  63. if dataLength > 0 {
  64. frame.Data = make([]byte, dataLength)
  65. if n, err = io.ReadFull(r, frame.Data); err == nil {
  66. if n < int(dataLength) {
  67. err = io.ErrShortBuffer
  68. }
  69. }
  70. }
  71. if errorLength > 0 {
  72. errBuf = make([]byte, errorLength)
  73. if n, err = io.ReadFull(r, errBuf); err == nil {
  74. if n < int(dataLength) {
  75. err = io.ErrShortBuffer
  76. } else {
  77. frame.Error = unsafestr.BytesToString(errBuf)
  78. }
  79. }
  80. }
  81. return
  82. }
  83. func writeFrame(w io.Writer, frame *Frame) (err error) {
  84. var (
  85. n int
  86. dl int
  87. dataLength uint16
  88. errorLength uint16
  89. errBuf []byte
  90. )
  91. if _, err = w.Write(feature); err != nil {
  92. return
  93. }
  94. if frame.Data != nil {
  95. dl = len(frame.Data)
  96. if dl > math.MaxUint16 {
  97. return io.ErrNoProgress
  98. }
  99. dataLength = uint16(dl)
  100. }
  101. if frame.Error != "" {
  102. errBuf = unsafestr.StringToBytes(frame.Error)
  103. errorLength = uint16(len(errBuf))
  104. }
  105. if err = binary.Write(w, binary.LittleEndian, frame.Type); err != nil {
  106. return
  107. }
  108. if err = binary.Write(w, binary.LittleEndian, frame.Flag); err != nil {
  109. return
  110. }
  111. if err = binary.Write(w, binary.LittleEndian, frame.Seq); err != nil {
  112. return
  113. }
  114. if err = binary.Write(w, binary.LittleEndian, frame.Timestamp); err != nil {
  115. return
  116. }
  117. if err = binary.Write(w, binary.LittleEndian, dataLength); err != nil {
  118. return
  119. }
  120. if err = binary.Write(w, binary.LittleEndian, errorLength); err != nil {
  121. return
  122. }
  123. if dataLength > 0 {
  124. if n, err = w.Write(frame.Data); err == nil {
  125. if n < int(dataLength) {
  126. err = io.ErrShortWrite
  127. }
  128. }
  129. }
  130. if errorLength > 0 {
  131. if n, err = w.Write(errBuf); err == nil {
  132. if n < int(errorLength) {
  133. err = io.ErrShortWrite
  134. }
  135. }
  136. }
  137. return
  138. }
  139. func (f *Frame) SetSeq(n uint16) *Frame {
  140. f.Seq = n
  141. return f
  142. }
  143. func newFrame(t, f byte, data []byte) *Frame {
  144. return &Frame{
  145. Type: t,
  146. Flag: f,
  147. Data: data,
  148. }
  149. }
  150. func newErrorFrame(t, f byte, err string) *Frame {
  151. return &Frame{
  152. Type: t,
  153. Flag: f,
  154. Error: err,
  155. }
  156. }