utils.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package mqtt
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "strconv"
  9. )
  10. func Uint16ToByte(value uint16) []byte {
  11. buf := bytes.NewBuffer([]byte{})
  12. binary.Write(buf, binary.BigEndian, value)
  13. return buf.Bytes()
  14. }
  15. func ByteToUint16(buf []byte) uint16 {
  16. tmpBuf := bytes.NewBuffer(buf)
  17. var value uint16
  18. binary.Read(tmpBuf, binary.BigEndian, &value)
  19. return value
  20. }
  21. func DeviceIdToClientId(deviceid uint64) string {
  22. return strconv.FormatUint(deviceid, 16)
  23. }
  24. func ClientIDToDeviceID(identify string) (uint64, error) {
  25. deviceId, err := strconv.ParseUint(identify, 16, 64)
  26. if err != nil {
  27. return uint64(0), err
  28. }
  29. return deviceId, nil
  30. }
  31. func boolToByte(val bool) byte {
  32. if val {
  33. return byte(1)
  34. }
  35. return byte(0)
  36. }
  37. func encodeLength(length int32, buf *bytes.Buffer) {
  38. if length == 0 {
  39. buf.WriteByte(0)
  40. return
  41. }
  42. for length > 0 {
  43. digit := length & 0x7f
  44. length = length >> 7
  45. if length > 0 {
  46. digit = digit | 0x80
  47. }
  48. buf.WriteByte(byte(digit))
  49. }
  50. }
  51. func decodeLength(r io.Reader) (int32, error) {
  52. var v int32
  53. var buf [1]byte
  54. var shift uint
  55. for i := 0; i < 4; i++ {
  56. if _, err := io.ReadFull(r, buf[:]); err != nil {
  57. return 0, err
  58. }
  59. b := buf[0]
  60. v |= int32(b&0x7f) << shift
  61. if b&0x80 == 0 {
  62. return v, nil
  63. }
  64. shift += 7
  65. }
  66. return 0, errors.New("length decode error")
  67. }
  68. func setUint8(val uint8, buf *bytes.Buffer) {
  69. buf.WriteByte(byte(val))
  70. }
  71. func setUint16(val uint16, buf *bytes.Buffer) {
  72. buf.WriteByte(byte(val & 0xff00 >> 8))
  73. buf.WriteByte(byte(val & 0x00ff))
  74. }
  75. func setString(val string, buf *bytes.Buffer) {
  76. length := uint16(len(val))
  77. setUint16(length, buf)
  78. buf.WriteString(val)
  79. }
  80. func getUint8(r io.Reader, packetRemaining *int32) (uint8, error) {
  81. if *packetRemaining < 1 {
  82. return 0, errors.New("dataExceedPacketError")
  83. }
  84. var b [1]byte
  85. if _, err := io.ReadFull(r, b[:]); err != nil {
  86. return 0, err
  87. }
  88. *packetRemaining--
  89. return b[0], nil
  90. }
  91. func getUint16(r io.Reader, packetRemaining *int32) (uint16, error) {
  92. if *packetRemaining < 2 {
  93. return 0, errors.New("dataExceedPacketError")
  94. }
  95. var b [2]byte
  96. if _, err := io.ReadFull(r, b[:]); err != nil {
  97. return 0, err
  98. }
  99. *packetRemaining -= 2
  100. return uint16(b[0])<<8 | uint16(b[1]), nil
  101. }
  102. func getString(r io.Reader, packetRemaining *int32) (string, error) {
  103. var retString string
  104. len, err := getUint16(r, packetRemaining)
  105. if err != nil {
  106. return retString, err
  107. }
  108. strLen := int(len)
  109. if int(*packetRemaining) < strLen {
  110. return retString, errors.New("dataExceedPacketError")
  111. }
  112. b := make([]byte, strLen)
  113. if _, err := io.ReadFull(r, b); err != nil {
  114. return retString, err
  115. }
  116. *packetRemaining -= int32(strLen)
  117. return string(b), nil
  118. }
  119. func errorf(format string, a ...interface{}) error {
  120. err := fmt.Errorf(format, a...)
  121. return err
  122. }