From 2ea433f93e2293842485001079dbbdd9ac6ccc43 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Wed, 20 May 2026 11:17:17 +0200 Subject: [PATCH] Implement Frames --- agwpe.go | 32 ------------------------ frame.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ frame_test.go | 13 ++++++++++ 3 files changed, 82 insertions(+), 32 deletions(-) create mode 100644 frame.go create mode 100644 frame_test.go diff --git a/agwpe.go b/agwpe.go index 0ac13ad..c573708 100644 --- a/agwpe.go +++ b/agwpe.go @@ -64,35 +64,3 @@ func (pe *PacketEngine) Disconnect() error { return nil } - -// import "encoding/binary" - -// type Frame 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 (f *Frame) Serialize() []byte { -// buf := make([]byte, 36) - -// buf[0] = f.Port -// // Ignore reserved bytes 1 to 3 -// buf[4] = f.DataKind -// // Ignore reserved byte 5 -// buf[6] = f.PID -// // Ignore reserved byte 7 -// copy(buf[8:18], f.CallFrom[:]) -// copy(buf[18:28], f.CallTo[:]) -// binary.LittleEndian.PutUint32(buf[28:32], f.DataLen) -// copy(buf[32:36], f.User[:]) - -// return buf -// } diff --git a/frame.go b/frame.go new file mode 100644 index 0000000..d13b392 --- /dev/null +++ b/frame.go @@ -0,0 +1,69 @@ +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) +} diff --git a/frame_test.go b/frame_test.go new file mode 100644 index 0000000..9470f90 --- /dev/null +++ b/frame_test.go @@ -0,0 +1,13 @@ +package agwpe + +import ( + "testing" +) + +func TestNewFrameHeader(t *testing.T) { + +} + +func TestFrameHeader_Serialize(t *testing.T) { + +}