Documentation ¶
Overview ¶
Package gomavlib is a library that implements Mavlink 2.0 and 1.0 in the Go programming language. It can power UGVs, UAVs, ground stations, monitoring systems or routers acting in a Mavlink network.
Mavlink is a lighweight and transport-independent protocol that is mostly used to communicate with unmanned ground vehicles (UGV) and unmanned aerial vehicles (UAV, drones, quadcopters, multirotors). It is supported by the most common open-source flight controllers (Ardupilot and PX4).
Basic example (more are available at https://github.com/team-rocos/gomavlib/tree/master/examples):
package main import ( "fmt" "github.com/team-rocos/gomavlib" "github.com/team-rocos/gomavlib/dialects/ardupilotmega" ) func main() { node, err := gomavlib.NewNode(gomavlib.NodeConf{ Endpoints: []gomavlib.EndpointConf{ gomavlib.EndpointSerial{"/dev/ttyUSB0:57600"}, }, Dialect: ardupilotmega.Dialect, OutVersion: gomavlib.V2, OutSystemId: 10, }) if err != nil { panic(err) } defer node.Close() for evt := range node.Events() { if frm,ok := evt.(*gomavlib.EventFrame); ok { fmt.Printf("received: id=%d, %+v\n", frm.Message().GetId(), frm.Message()) } } }
Index ¶
- Constants
- Variables
- func SetMessageField(m Message, field string, value interface{}) error
- type Channel
- type Dialect
- type DialectCT
- type DialectFieldType
- type DialectMessageCT
- func (mp *DialectMessageCT) Decode(buf []byte, isFrameV2 bool) (Message, error)
- func (mp *DialectMessageCT) Encode(msg Message, isFrameV2 bool) ([]byte, error)
- func (mp *DialectMessageCT) GetCRCExtra() byte
- func (mp *DialectMessageCT) GetSizeExtended() byte
- func (mp *DialectMessageCT) GetSizeNormal() byte
- type DialectMessageField
- func (f *DialectMessageField) GetArrayLength() byte
- func (f *DialectMessageField) GetFType() DialectFieldType
- func (f *DialectMessageField) GetIndex() int
- func (f *DialectMessageField) GetIsEnum() bool
- func (f *DialectMessageField) GetIsExtension() bool
- func (f *DialectMessageField) GetName() string
- type DialectMessageRT
- func (mp *DialectMessageRT) Decode(buf []byte, isFrameV2 bool) (Message, error)
- func (mp *DialectMessageRT) Encode(msg Message, isFrameV2 bool) ([]byte, error)
- func (mp *DialectMessageRT) GenerateJSONSchema(prefix string, topic string) ([]byte, error)
- func (mp *DialectMessageRT) GetCRCExtra() byte
- func (mp *DialectMessageRT) GetMessageId() int
- func (mp *DialectMessageRT) GetSizeExtended() uint
- func (mp *DialectMessageRT) GetSizeNormal() uint
- type DialectRT
- type DynamicMessage
- func (d DynamicMessage) GenerateJSONSchema(prefix string, topic string) ([]byte, error)
- func (d DynamicMessage) GetId() uint32
- func (d DynamicMessage) GetName() string
- func (d *DynamicMessage) MarshalJSON() ([]byte, error)
- func (d DynamicMessage) SetField(field string, value interface{}) error
- func (d *DynamicMessage) UnmarshalJSON(buf []byte) error
- type Endpoint
- type EndpointConf
- type EndpointCustom
- type EndpointSerial
- type EndpointTcpClient
- type EndpointTcpServer
- type EndpointUdpBroadcast
- type EndpointUdpClient
- type EndpointUdpServer
- type Event
- type EventChannelClose
- type EventChannelOpen
- type EventFrame
- type EventParseError
- type EventStreamRequested
- type Frame
- type FrameV1
- type FrameV2
- type Hash16
- type JsonFloat32
- type JsonFloat64
- type Key
- type Message
- type MessageRaw
- type Node
- func (n *Node) Close()
- func (n *Node) Events() chan Event
- func (n *Node) WriteFrameAll(frame Frame)
- func (n *Node) WriteFrameExcept(exceptChannel *Channel, frame Frame)
- func (n *Node) WriteFrameTo(channel *Channel, frame Frame)
- func (n *Node) WriteMessageAll(message Message)
- func (n *Node) WriteMessageExcept(exceptChannel *Channel, message Message)
- func (n *Node) WriteMessageTo(channel *Channel, message Message)
- type NodeConf
- type NullEndpoint
- type Parser
- type ParserConf
- type ParserError
- type Signature
- type Version
Constants ¶
const ( //Sep is a namespace separator string Sep = "/" //GlobalNS is the global namespace initial separator string GlobalNS = "/" //PrivateNS is private namespace initial separator string PrivateNS = "~" )
JSON Variables
Variables ¶
var DialectFieldTypeFromGo = map[string]DialectFieldType{
"float64": typeDouble,
"uint64": typeUint64,
"int64": typeInt64,
"float32": typeFloat,
"uint32": typeUint32,
"int32": typeInt32,
"uint16": typeUint16,
"int16": typeInt16,
"uint8": typeUint8,
"int8": typeInt8,
"string": typeChar,
}
DialectFieldTypeFromGo provides mavlink/Go type name conversion
var DialectFieldTypeSizes = map[DialectFieldType]byte{ // contains filtered or unexported fields }
DialectFieldTypeSizes is a map providing byte sizes of DialectFieldType
var DialectFieldTypeString = map[DialectFieldType]string{ // contains filtered or unexported fields }
DialectFieldTypeString provides type/string conversion
Functions ¶
func SetMessageField ¶
Types ¶
type Channel ¶
type Channel struct { // the endpoint which the channel belongs to Endpoint Endpoint // contains filtered or unexported fields }
Channel is a communication channel created by an endpoint. For instance, a TCP client endpoint creates a single channel, while a TCP server endpoint creates a channel for each incoming connection.
type Dialect ¶
type Dialect interface {
// contains filtered or unexported methods
}
Dialect : Interface
type DialectCT ¶
type DialectCT struct { Messages map[uint32]*DialectMessageCT // contains filtered or unexported fields }
DialectCT : compile time dialect struct
func MustDialectCT ¶
MustDialectCT is like NewDialect but panics in case of error.
type DialectMessageCT ¶
type DialectMessageCT struct { Fields []*DialectMessageField // contains filtered or unexported fields }
func (*DialectMessageCT) Decode ¶
func (mp *DialectMessageCT) Decode(buf []byte, isFrameV2 bool) (Message, error)
Decode is a public function necessary for testing
func (*DialectMessageCT) Encode ¶
func (mp *DialectMessageCT) Encode(msg Message, isFrameV2 bool) ([]byte, error)
Encode is a public function necessary for testing
func (*DialectMessageCT) GetCRCExtra ¶
func (mp *DialectMessageCT) GetCRCExtra() byte
GetCRCExtra returns crcExtra of DialectMessageCT
func (*DialectMessageCT) GetSizeExtended ¶
func (mp *DialectMessageCT) GetSizeExtended() byte
GetSizeExtended returns sizeExtended of DialectMessageCT
func (*DialectMessageCT) GetSizeNormal ¶
func (mp *DialectMessageCT) GetSizeNormal() byte
GetSizeNormal returns sizeNormal of DialectMessageCT
type DialectMessageField ¶
type DialectMessageField struct {
// contains filtered or unexported fields
}
func (*DialectMessageField) GetArrayLength ¶
func (f *DialectMessageField) GetArrayLength() byte
GetArrayLength return arrayLength of DialectMessageField
func (*DialectMessageField) GetFType ¶
func (f *DialectMessageField) GetFType() DialectFieldType
GetFType return ftype of DialectMessageField
func (*DialectMessageField) GetIndex ¶
func (f *DialectMessageField) GetIndex() int
GetIndex return index of DialectMessageField
func (*DialectMessageField) GetIsEnum ¶
func (f *DialectMessageField) GetIsEnum() bool
GetIsEnum return isEnum of DialectMessageField
func (*DialectMessageField) GetIsExtension ¶
func (f *DialectMessageField) GetIsExtension() bool
GetIsExtension return isExtension of DialectMessageField
func (*DialectMessageField) GetName ¶
func (f *DialectMessageField) GetName() string
GetName return name of DialectMessageField
type DialectMessageRT ¶
type DialectMessageRT struct { Msg *libgen.OutMessage // contains filtered or unexported fields }
DialectMessageRT is a run time dialect message which contains the message information and a pointer to the DialectRT to which it belongs.
func (*DialectMessageRT) Decode ¶
func (mp *DialectMessageRT) Decode(buf []byte, isFrameV2 bool) (Message, error)
Decode is a public function necessary for testing
func (*DialectMessageRT) Encode ¶
func (mp *DialectMessageRT) Encode(msg Message, isFrameV2 bool) ([]byte, error)
Encode is a public function necessary for testing
func (*DialectMessageRT) GenerateJSONSchema ¶
func (mp *DialectMessageRT) GenerateJSONSchema(prefix string, topic string) ([]byte, error)
GenerateJSONSchema generates a (primitive) JSON schema for the associated DynamicMessage; however note that since we are mostly interested in making schema's for particular _topics_, the function takes a string prefix, and string topic name, which are used to id the resulting schema.
func (*DialectMessageRT) GetCRCExtra ¶
func (mp *DialectMessageRT) GetCRCExtra() byte
GetCRCExtra returns crcExtra of DialectMessageRT
func (*DialectMessageRT) GetMessageId ¶
func (mp *DialectMessageRT) GetMessageId() int
GetMessageId returns the id of the dialectMessageRT
func (*DialectMessageRT) GetSizeExtended ¶
func (mp *DialectMessageRT) GetSizeExtended() uint
GetSizeExtended returns sizeExtended of DialectMessageRT
func (*DialectMessageRT) GetSizeNormal ¶
func (mp *DialectMessageRT) GetSizeNormal() uint
GetSizeNormal returns sizeNormal of DialectMessageRT
type DialectRT ¶
type DialectRT struct { Messages map[uint32]*DialectMessageRT // contains filtered or unexported fields }
DialectRT contains available messages and the configuration needed to encode and decode them.
func NewDialectRT ¶
func NewDialectRT(version uint, outDefs []*libgen.OutDefinition) (*DialectRT, error)
NewDialectRT allocates a Dialect.
func (*DialectRT) CreateMessageById ¶
func (d *DialectRT) CreateMessageById(id uint32) (*DynamicMessage, error)
CreateMessageById returns a DynamicMessage created from finding the message in the DialectRT given corresponding to id. The Fields map in the DynamicMessage created is empty.
func (*DialectRT) CreateMessageByName ¶
func (d *DialectRT) CreateMessageByName(name string) (*DynamicMessage, error)
CreateMessageByName returns a DynamicMessage created from finding the message in the DialectRT given corresponding to name. The Fields map in the DynamicMessage created is empty.
func (*DialectRT) GetVersion ¶
GetVersion returns the uint version of DialectRT
type DynamicMessage ¶
type DynamicMessage struct { T *DialectMessageRT Fields map[string]interface{} }
DynamicMessage : Used for RT message generation
func (DynamicMessage) GenerateJSONSchema ¶
func (d DynamicMessage) GenerateJSONSchema(prefix string, topic string) ([]byte, error)
GenerateJSONSchema DynamicMessage exported function
func (DynamicMessage) GetId ¶
func (d DynamicMessage) GetId() uint32
GetId returns the MAVLink message ID (mID) of the DynamicMessage.
func (DynamicMessage) GetName ¶
func (d DynamicMessage) GetName() string
GetName returns OriginalName (in mavlink format)
func (*DynamicMessage) MarshalJSON ¶
func (d *DynamicMessage) MarshalJSON() ([]byte, error)
MarshalJSON provides a custom implementation of JSON marshalling, so that when the DynamicMessage is recursively marshalled using the standard Go json.marshal() mechanism, the resulting JSON representation is a compact representation of just the important message payload (and not the message definition). It's important that this representation matches the schema generated by GenerateJSONSchema().
func (DynamicMessage) SetField ¶
func (d DynamicMessage) SetField(field string, value interface{}) error
SetField sets DynamicMessage field matching field string, and based on its Type
func (*DynamicMessage) UnmarshalJSON ¶
func (d *DynamicMessage) UnmarshalJSON(buf []byte) error
UnmarshalJSON provides a custom implementation of JSON unmarshalling. Using the DynamicMessage provided, d.t.msg is used to determine the individual parsing of each JSON encoded payload item into the correct Type. It is important each type is correct so that the message serializes correctly and is understood by the MAVlink system
type Endpoint ¶
type Endpoint interface { // Conf returns the configuration used to initialize the endpoint Conf() interface{} // contains filtered or unexported methods }
Endpoint represents an endpoint, which contains zero or more channels.
type EndpointConf ¶
type EndpointConf interface {
// contains filtered or unexported methods
}
EndpointConf is the interface implemented by all endpoint configurations.
type EndpointCustom ¶
type EndpointCustom struct { // the struct or interface implementing Read(), Write() and Close() ReadWriteCloser io.ReadWriteCloser }
EndpointCustom sets up a endpoint that works through a custom interface that provides the Read(), Write() and Close() functions.
type EndpointSerial ¶
type EndpointSerial struct { // the address of the serial port in format name:baudrate // example: /dev/ttyUSB0:57600 Address string }
EndpointSerial sets up a endpoint that works through a serial port.
type EndpointTcpClient ¶
type EndpointTcpClient struct { // domain name or IP of the server to connect to, example: 1.2.3.4:5600 Address string }
EndpointTcpClient sets up a endpoint that works through a TCP client. TCP is fit for routing frames through the internet, but is not the most appropriate way for transferring frames from a UAV to a GCS, since it does not allow frame losses.
type EndpointTcpServer ¶
type EndpointTcpServer struct { // listen address, example: 0.0.0.0:5600 Address string }
EndpointTcpServer sets up a endpoint that works through a TCP server. TCP is fit for routing frames through the internet, but is not the most appropriate way for transferring frames from a UAV to a GCS, since it does not allow frame losses.
type EndpointUdpBroadcast ¶
type EndpointUdpBroadcast struct { // the broadcast address to which sending outgoing frames, example: 192.168.5.255:5600 BroadcastAddress string // (optional) the listening address. if empty, it will be computed // from the broadcast address. LocalAddress string }
EndpointUdpBroadcast sets up a endpoint that works through UDP broadcast packets.
type EndpointUdpClient ¶
type EndpointUdpClient struct { // domain name or IP of the server to connect to, example: 1.2.3.4:5600 Address string }
EndpointUdpClient sets up a endpoint that works through a UDP client.
type EndpointUdpServer ¶
type EndpointUdpServer struct { // listen address, example: 0.0.0.0:5600 Address string }
EndpointUdpServer sets up a endpoint that works through an UDP server. This is the most appropriate way for transferring frames from a UAV to a GCS if they are connected to the same network.
type Event ¶
type Event interface {
// contains filtered or unexported methods
}
Event is the interface implemented by all events received through node.Events().
type EventChannelClose ¶
type EventChannelClose struct {
Channel *Channel
}
EventChannelClose is the event fired when a channel gets closed.
type EventChannelOpen ¶
type EventChannelOpen struct {
Channel *Channel
}
EventChannelOpen is the event fired when a channel gets opened.
type EventFrame ¶
type EventFrame struct { // the frame Frame Frame // the channel from which the frame was received Channel *Channel }
EventFrame is the event fired when a frame is received.
func (*EventFrame) ComponentId ¶
func (res *EventFrame) ComponentId() byte
ComponentId returns the frame component id.
func (*EventFrame) GetSeq ¶
func (res *EventFrame) GetSeq() byte
GetSeq returns the SequenceId of the frame. Works for both V1 and V2 frames.
func (*EventFrame) Message ¶
func (res *EventFrame) Message() Message
Message returns the message inside the frame.
func (*EventFrame) SystemId ¶
func (res *EventFrame) SystemId() byte
SystemId returns the frame system id.
type EventParseError ¶
type EventParseError struct { // the error Error error // the channel used to send the frame Channel *Channel }
EventParseError is the event fired when a parse error occurs.
type EventStreamRequested ¶
type EventStreamRequested struct { // the channel to which the stream request is addressed Channel *Channel // the system id to which the stream requests is addressed SystemId byte // the component id to which the stream requests is addressed ComponentId byte }
EventStreamRequested is the event fired when an automatic stream request is sent.
type Frame ¶
type Frame interface { // the frame version. GetVersion() int // the system id of the author of the frame. GetSystemId() byte // the component id of the author of the frame. GetComponentId() byte // the message encapsuled in the frame. GetMessage() Message // the frame checksum. GetChecksum() uint16 // generate a clone of the frame Clone() Frame // the sequence id of the frame GetSequenceId() byte }
Frame is the interface implemented by frames of every supported version.
type FrameV1 ¶
type FrameV1 struct { SequenceId byte SystemId byte ComponentId byte Message Message Checksum uint16 }
FrameV1 represents a 1.0 frame.
func (*FrameV1) GetChecksum ¶
GetChecksum is part of the Frame interface.
func (*FrameV1) GetComponentId ¶
GetComponentId is part of the Frame interface.
func (*FrameV1) GetMessage ¶
GetMessage is part of the Frame interface.
func (*FrameV1) GetSequenceId ¶
GetSequenceId returns the SequenceId of the frame
func (*FrameV1) GetSystemId ¶
GetSystemId is part of the Frame interface.
func (*FrameV1) GetVersion ¶
GetVersion is part of the Frame interface.
type FrameV2 ¶
type FrameV2 struct { IncompatibilityFlag byte CompatibilityFlag byte SequenceId byte SystemId byte ComponentId byte Message Message Checksum uint16 SignatureLinkId byte SignatureTimestamp uint64 Signature *Signature }
FrameV2 represents a 2.0 frame.
func (*FrameV2) GetChecksum ¶
GetChecksum is part of the Frame interface.
func (*FrameV2) GetComponentId ¶
GetComponentId is part of the Frame interface.
func (*FrameV2) GetMessage ¶
GetMessage is part of the Frame interface.
func (*FrameV2) GetSequenceId ¶
GetSequenceId returns the SequenceId of the frame
func (*FrameV2) GetSystemId ¶
GetSystemId is part of the Frame interface.
func (*FrameV2) GetVersion ¶
GetVersion is part of the Frame interface.
type Hash16 ¶
Hash16 is an interface modeled on the standard hash.Hash32 and hash.Hash64. In this library, it is implemented by NewX25().
type JsonFloat32 ¶
type JsonFloat32 struct {
F float32
}
func (JsonFloat32) MarshalJSON ¶
func (f JsonFloat32) MarshalJSON() ([]byte, error)
func (JsonFloat32) String ¶
func (f JsonFloat32) String() string
type JsonFloat64 ¶
type JsonFloat64 struct {
F float64
}
func (JsonFloat64) MarshalJSON ¶
func (f JsonFloat64) MarshalJSON() ([]byte, error)
func (JsonFloat64) String ¶
func (f JsonFloat64) String() string
type Message ¶
Message is the interface that all Mavlink messages must implements. Furthermore, message structs must be labeled MessageNameOfMessage.
type MessageRaw ¶
MessageRaw is a special struct that contains a byte-encoded message, available in Content. It is used:
* as intermediate step in the encoding/decoding process
* when the parser receives an unknown message
func (*MessageRaw) GetId ¶
func (m *MessageRaw) GetId() uint32
GetId implements the message interface.
func (*MessageRaw) SetField ¶
func (m *MessageRaw) SetField(field string, value interface{}) error
type Node ¶
type Node struct {
// contains filtered or unexported fields
}
Node is a high-level Mavlink encoder and decoder that works with endpoints.
func (*Node) Close ¶
func (n *Node) Close()
Close halts node operations and waits for all routines to return.
func (*Node) Events ¶
Events returns a channel from which receiving events. Possible events are:
*EventChannelOpen *EventChannelClose *EventFrame *EventParseError *EventStreamRequested
See individual events for meaning and content.
func (*Node) WriteFrameAll ¶
WriteFrameAll writes a frame to all channels. This function is intended only for routing pre-existing frames to other nodes, since all frame fields must be filled manually.
func (*Node) WriteFrameExcept ¶
WriteFrameExcept writes a frame to all channels except specified channel. This function is intended only for routing pre-existing frames to other nodes, since all frame fields must be filled manually.
func (*Node) WriteFrameTo ¶
WriteFrameTo writes a frame to given channel. This function is intended only for routing pre-existing frames to other nodes, since all frame fields must be filled manually.
func (*Node) WriteMessageAll ¶
WriteMessageAll writes a message to all channels.
func (*Node) WriteMessageExcept ¶
WriteMessageExcept writes a message to all channels except specified channel.
func (*Node) WriteMessageTo ¶
WriteMessageTo writes a message to given channel.
type NodeConf ¶
type NodeConf struct { // the endpoints with which this node will // communicate. Each endpoint contains zero or more channels Endpoints []EndpointConf // (optional) the dialect which contains the messages that will be encoded and decoded. // If not provided, messages are decoded in the MessageRaw struct. D Dialect // (optional) the secret key used to validate incoming frames. // Non signed frames are discarded, as well as frames with a version < 2.0. InKey *Key // Mavlink version used to encode messages. See Version // for the available options. OutVersion Version // the system id, added to every outgoing frame and used to identify this // node in the network. OutSystemId byte // (optional) the component id, added to every outgoing frame, defaults to 1. OutComponentId byte // (optional) the secret key used to sign outgoing frames. // This feature requires a version >= 2.0. OutKey *Key // (optional) disables the periodic sending of heartbeats to open channels. HeartbeatDisable bool // (optional) the period between heartbeats. It defaults to 5 seconds. HeartbeatPeriod time.Duration // (optional) the system type advertised by heartbeats. // It defaults to MAV_TYPE_GCS HeartbeatSystemType int // (optional) the autopilot type advertised by heartbeats. // It defaults to MAV_AUTOPILOT_GENERIC HeartbeatAutopilotType int // (optional) automatically request streams to detected Ardupilot devices, // that need an explicit request in order to emit telemetry stream. StreamRequestEnable bool // (optional) the requested stream frequency in Hz. It defaults to 4. StreamRequestFrequency int }
NodeConf allows to configure a Node.
type NullEndpoint ¶
type NullEndpoint struct {
// contains filtered or unexported fields
}
NullEndpoint implements io.ReadWriteCloser. it does not read or write anything. the only requirement is that Close() must release Read().
func NewNullEndpoint ¶
func NewNullEndpoint() *NullEndpoint
NewNullEndpoint returns a pointer to a new NullEndpoint
func (*NullEndpoint) Close ¶
func (c *NullEndpoint) Close() error
Close closes the channel c.readChan
type Parser ¶
type Parser struct {
// contains filtered or unexported fields
}
Parser is a low-level Mavlink encoder and decoder that works with a Reader and a Writer.
func NewParser ¶
func NewParser(conf ParserConf) (*Parser, error)
NewParser allocates a Parser, a low level frame encoder and decoder. See ParserConf for the options.
func (*Parser) Read ¶
Read reads a Frame from the reader. It must not be called by multiple routines in parallel.
func (*Parser) WriteFrame ¶
WriteFrame writes a Frame into the writer. It must not be called by multiple routines in parallel. This function is intended only for routing pre-existing frames to other nodes, since all frame fields must be filled manually.
func (*Parser) WriteMessage ¶
WriteMessage writes a Message into the writer. It must not be called by multiple routines in parallel.
type ParserConf ¶
type ParserConf struct { // the reader from which frames will be read. Reader io.Reader // the writer to which frames will be written. Writer io.Writer // (optional) the dialect which contains the messages that will be encoded and decoded. // If not provided, messages are decoded in the MessageRaw struct. D Dialect // (optional) the secret key used to validate incoming frames. // Non-signed frames are discarded. This feature requires v2 frames. InKey *Key // Mavlink version used to encode messages. See Version // for the available options. OutVersion Version // the system id, added to every outgoing frame and used to identify this // node in the network. OutSystemId byte // (optional) the component id, added to every outgoing frame, defaults to 1. OutComponentId byte // (optional) the value to insert into the signature link id. // This feature requires v2 frames. OutSignatureLinkId byte // (optional) the secret key used to sign outgoing frames. // This feature requires v2 frames. OutKey *Key }
ParserConf configures a Parser.
type ParserError ¶
type ParserError struct {
// contains filtered or unexported fields
}
ParserError is the error returned in case of non-fatal parsing errors.
func (*ParserError) Error ¶
func (e *ParserError) Error() string
Source Files ¶
- channel.go
- channelaccepter.go
- dialect.go
- dialectCT.go
- dialectRT.go
- dynamic_message.go
- endpoint.go
- endpoint_broadcast.go
- endpoint_client.go
- endpoint_custom.go
- endpoint_null.go
- endpoint_serial.go
- endpoint_server.go
- events.go
- frame.go
- json_float.go
- message.go
- node.go
- node_heartbeat.go
- node_streamrequest.go
- parser.go
- udplistener.go
- various.go
- x25.go