123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package mqtt
- import (
- "bytes"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "strconv"
- )
- func Uint16ToByte(value uint16) []byte {
- buf := bytes.NewBuffer([]byte{})
- binary.Write(buf, binary.BigEndian, value)
- return buf.Bytes()
- }
- func ByteToUint16(buf []byte) uint16 {
- tmpBuf := bytes.NewBuffer(buf)
- var value uint16
- binary.Read(tmpBuf, binary.BigEndian, &value)
- return value
- }
- func DeviceIdToClientId(deviceid uint64) string {
- return strconv.FormatUint(deviceid, 16)
- }
- func ClientIDToDeviceID(identify string) (uint64, error) {
- deviceId, err := strconv.ParseUint(identify, 16, 64)
- if err != nil {
- return uint64(0), err
- }
- return deviceId, nil
- }
- func boolToByte(val bool) byte {
- if val {
- return byte(1)
- }
- return byte(0)
- }
- func encodeLength(length int32, buf *bytes.Buffer) {
- if length == 0 {
- buf.WriteByte(0)
- return
- }
- for length > 0 {
- digit := length & 0x7f
- length = length >> 7
- if length > 0 {
- digit = digit | 0x80
- }
- buf.WriteByte(byte(digit))
- }
- }
- func decodeLength(r io.Reader) (int32, error) {
- var v int32
- var buf [1]byte
- var shift uint
- for i := 0; i < 4; i++ {
- if _, err := io.ReadFull(r, buf[:]); err != nil {
- return 0, err
- }
- b := buf[0]
- v |= int32(b&0x7f) << shift
- if b&0x80 == 0 {
- return v, nil
- }
- shift += 7
- }
- return 0, errors.New("length decode error")
- }
- func setUint8(val uint8, buf *bytes.Buffer) {
- buf.WriteByte(byte(val))
- }
- func setUint16(val uint16, buf *bytes.Buffer) {
- buf.WriteByte(byte(val & 0xff00 >> 8))
- buf.WriteByte(byte(val & 0x00ff))
- }
- func setString(val string, buf *bytes.Buffer) {
- length := uint16(len(val))
- setUint16(length, buf)
- buf.WriteString(val)
- }
- func getUint8(r io.Reader, packetRemaining *int32) (uint8, error) {
- if *packetRemaining < 1 {
- return 0, errors.New("dataExceedPacketError")
- }
- var b [1]byte
- if _, err := io.ReadFull(r, b[:]); err != nil {
- return 0, err
- }
- *packetRemaining--
- return b[0], nil
- }
- func getUint16(r io.Reader, packetRemaining *int32) (uint16, error) {
- if *packetRemaining < 2 {
- return 0, errors.New("dataExceedPacketError")
- }
- var b [2]byte
- if _, err := io.ReadFull(r, b[:]); err != nil {
- return 0, err
- }
- *packetRemaining -= 2
- return uint16(b[0])<<8 | uint16(b[1]), nil
- }
- func getString(r io.Reader, packetRemaining *int32) (string, error) {
- var retString string
- len, err := getUint16(r, packetRemaining)
- if err != nil {
- return retString, err
- }
- strLen := int(len)
- if int(*packetRemaining) < strLen {
- return retString, errors.New("dataExceedPacketError")
- }
- b := make([]byte, strLen)
- if _, err := io.ReadFull(r, b); err != nil {
- return retString, err
- }
- *packetRemaining -= int32(strLen)
- return string(b), nil
- }
- func errorf(format string, a ...interface{}) error {
- err := fmt.Errorf(format, a...)
- return err
- }
|