Implement Frames
This commit is contained in:
69
frame.go
Normal file
69
frame.go
Normal file
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user