55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package meshtastic
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"errors"
|
|
)
|
|
|
|
const (
|
|
minPacketSize = 4 + 4 + 4 + 1 + 1 + 1 + 1
|
|
maxPayloadSize = 237
|
|
)
|
|
|
|
var (
|
|
// ErrInvalidPacket signals the source buffer does not contain a valid packet.
|
|
ErrInvalidPacket = errors.New("meshtastic: invalid packet")
|
|
)
|
|
|
|
type Packet struct {
|
|
Destination NodeID
|
|
Source NodeID
|
|
ID uint32
|
|
Flags uint8
|
|
ChannelHash uint8
|
|
NextHop uint8
|
|
RelayNode uint8
|
|
PayloadLength int
|
|
Payload [maxPayloadSize]byte
|
|
}
|
|
|
|
func (packet *Packet) Decode(data []byte) error {
|
|
if len(data) < minPacketSize {
|
|
return ErrInvalidPacket
|
|
}
|
|
|
|
packet.Destination = parseNodeID(data[0:])
|
|
packet.Source = parseNodeID(data[4:])
|
|
packet.ID = binary.LittleEndian.Uint32(data[8:])
|
|
packet.Flags = data[12]
|
|
packet.ChannelHash = data[13]
|
|
packet.NextHop = data[14]
|
|
packet.RelayNode = data[15]
|
|
packet.PayloadLength = len(data[16:])
|
|
copy(packet.Payload[:], data[16:])
|
|
|
|
return nil
|
|
}
|
|
|
|
func (packet *Packet) HopLimit() int {
|
|
return
|
|
}
|
|
|
|
func parseNodeID(data []byte) NodeID {
|
|
return NodeID(binary.LittleEndian.Uint32(data))
|
|
}
|