70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package agwpe
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
type Header struct {
|
|
Port byte
|
|
Reserved0 [3]byte
|
|
DataKind byte
|
|
Reserved1 byte
|
|
PID byte
|
|
Reserved2 byte
|
|
CallFrom [10]byte
|
|
CallTo [10]byte
|
|
DataLen uint32
|
|
User [4]byte
|
|
}
|
|
|
|
func serializeHeader(h Header) []byte {
|
|
data := make([]byte, 36)
|
|
|
|
data[0] = h.Port
|
|
// Ignore reserved bytes 1 to 3
|
|
data[4] = h.DataKind
|
|
// Ignore reserved byte 5
|
|
data[6] = h.PID
|
|
// Ignore reserved byte 7
|
|
copy(data[8:18], h.CallFrom[:])
|
|
copy(data[18:28], h.CallTo[:])
|
|
binary.LittleEndian.PutUint32(data[28:32], h.DataLen)
|
|
copy(data[32:36], h.User[:])
|
|
|
|
return data
|
|
}
|
|
|
|
type Frame interface {
|
|
Header() Header
|
|
}
|
|
|
|
type VersionFrame struct {
|
|
header Header
|
|
major, minor uint16
|
|
}
|
|
|
|
func NewVersionFrame() *VersionFrame {
|
|
return &VersionFrame{
|
|
header: Header{
|
|
Port: 0x01,
|
|
DataKind: 0x52},
|
|
}
|
|
}
|
|
|
|
func (f *VersionFrame) Header() Header {
|
|
return f.header
|
|
}
|
|
|
|
func (f *VersionFrame) Serialize() ([]byte, error) {
|
|
data := serializeHeader(f.header)
|
|
|
|
return data, nil
|
|
}
|
|
|
|
func (f *VersionFrame) parseVersion(data []byte) {
|
|
f.major = (uint16(data[37]) << 8) | uint16(data[36])
|
|
f.minor = (uint16(data[41]) << 8) | uint16(data[40])
|
|
fmt.Printf("AGWPE version: %d.%d\n", f.major, f.minor)
|
|
}
|