coap

package module
v0.0.0-...-8e55328 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 11, 2019 License: MIT Imports: 11 Imported by: 164

README

Constrained Application Protocol Client and Server for go

You can read more about CoAP in RFC 7252. I also did some preliminary work on SUBSCRIBE support from an early draft.

Documentation

Overview

Package coap provides a CoAP client and server.

Index

Constants

View Source
const (
	// ResponseTimeout is the amount of time to wait for a
	// response.
	ResponseTimeout = time.Second * 2
	// ResponseRandomFactor is a multiplier for response backoff.
	ResponseRandomFactor = 1.5
	// MaxRetransmit is the maximum number of times a message will
	// be retransmitted.
	MaxRetransmit = 4
)
View Source
const (
	TCP_MESSAGE_LEN13_BASE = 13
	TCP_MESSAGE_LEN14_BASE = 269
	TCP_MESSAGE_LEN15_BASE = 65805
	TCP_MESSAGE_MAX_LEN    = 0x7fff0000 // Large number that works in 32-bit builds.
)

Variables

View Source
var (
	ErrInvalidTokenLen   = errors.New("invalid token length")
	ErrOptionTooLong     = errors.New("option is too long")
	ErrOptionGapTooLarge = errors.New("option gap too large")
)

Message encoding errors.

Functions

func ListenAndServe

func ListenAndServe(n, addr string, rh Handler) error

ListenAndServe binds to the given address and serve requests forever.

func Serve

func Serve(listener *net.UDPConn, rh Handler) error

Serve processes incoming UDP packets on the given listener, and processes these requests forever (or until the listener is closed).

func Transmit

func Transmit(l *net.UDPConn, a *net.UDPAddr, m Message) error

Transmit a message.

Types

type COAPCode

type COAPCode uint8

COAPCode is the type used for both request and response codes.

const (
	GET    COAPCode = 1
	POST   COAPCode = 2
	PUT    COAPCode = 3
	DELETE COAPCode = 4
)

Request Codes

const (
	Created               COAPCode = 65
	Deleted               COAPCode = 66
	Valid                 COAPCode = 67
	Changed               COAPCode = 68
	Content               COAPCode = 69
	BadRequest            COAPCode = 128
	Unauthorized          COAPCode = 129
	BadOption             COAPCode = 130
	Forbidden             COAPCode = 131
	NotFound              COAPCode = 132
	MethodNotAllowed      COAPCode = 133
	NotAcceptable         COAPCode = 134
	PreconditionFailed    COAPCode = 140
	RequestEntityTooLarge COAPCode = 141
	UnsupportedMediaType  COAPCode = 143
	InternalServerError   COAPCode = 160
	NotImplemented        COAPCode = 161
	BadGateway            COAPCode = 162
	ServiceUnavailable    COAPCode = 163
	GatewayTimeout        COAPCode = 164
	ProxyingNotSupported  COAPCode = 165
)

Response Codes

func (COAPCode) String

func (c COAPCode) String() string

type COAPType

type COAPType uint8

COAPType represents the message type.

const (
	// Confirmable messages require acknowledgements.
	Confirmable COAPType = 0
	// NonConfirmable messages do not require acknowledgements.
	NonConfirmable COAPType = 1
	// Acknowledgement is a message indicating a response to confirmable message.
	Acknowledgement COAPType = 2
	// Reset indicates a permanent negative acknowledgement.
	Reset COAPType = 3
)

func (COAPType) String

func (t COAPType) String() string

type Conn

type Conn struct {
	// contains filtered or unexported fields
}

Conn is a CoAP client connection.

func Dial

func Dial(n, addr string) (*Conn, error)

Dial connects a CoAP client.

func (*Conn) Receive

func (c *Conn) Receive() (Message, error)

Receive a message.

func (*Conn) Send

func (c *Conn) Send(req Message) (Message, error)

Send a message. Get a response if there is one.

type DgramMessage

type DgramMessage struct {
	MessageBase
}

DgramMessage implements Message interface.

func NewDgramMessage

func NewDgramMessage(p MessageParams) *DgramMessage

func ParseDgramMessage

func ParseDgramMessage(data []byte) (*DgramMessage, error)

ParseDgramMessage extracts the Message from the given input.

func (*DgramMessage) MarshalBinary

func (m *DgramMessage) MarshalBinary() ([]byte, error)

MarshalBinary produces the binary form of this DgramMessage.

func (*DgramMessage) UnmarshalBinary

func (m *DgramMessage) UnmarshalBinary(data []byte) error

UnmarshalBinary parses the given binary slice as a DgramMessage.

type Handler

type Handler interface {
	// Handle the message and optionally return a response message.
	ServeCOAP(l *net.UDPConn, a *net.UDPAddr, m Message) Message
}

Handler is a type that handles CoAP messages.

func FuncHandler

func FuncHandler(f func(l *net.UDPConn, a *net.UDPAddr, m Message) Message) Handler

FuncHandler builds a handler from a function.

type MediaType

type MediaType uint16

MediaType specifies the content type of a message.

const (
	TextPlain     MediaType = 0  // text/plain;charset=utf-8
	AppLinkFormat MediaType = 40 // application/link-format
	AppXML        MediaType = 41 // application/xml
	AppOctets     MediaType = 42 // application/octet-stream
	AppExi        MediaType = 47 // application/exi
	AppJSON       MediaType = 50 // application/json
)

Content types.

type Message

type Message interface {
	Type() COAPType
	Code() COAPCode
	MessageID() uint16
	Token() []byte
	Payload() []byte
	AllOptions() options

	IsConfirmable() bool
	Options(o OptionID) []interface{}
	Option(o OptionID) interface{}

	Path() []string
	PathString() string
	SetPathString(s string)
	SetPath(s []string)
	SetURIQuery(s string)
	SetObserve(b int)
	SetPayload(p []byte)
	RemoveOption(opID OptionID)
	AddOption(opID OptionID, val interface{})
	SetOption(opID OptionID, val interface{})
	MarshalBinary() ([]byte, error)
	UnmarshalBinary(data []byte) error
	// contains filtered or unexported methods
}

func Receive

func Receive(l *net.UDPConn, buf []byte) (Message, error)

Receive a message.

type MessageBase

type MessageBase struct {
	// contains filtered or unexported fields
}

MessageBase is a CoAP message.

func (*MessageBase) AddOption

func (m *MessageBase) AddOption(opID OptionID, val interface{})

AddOption adds an option.

func (*MessageBase) AllOptions

func (m *MessageBase) AllOptions() options

func (*MessageBase) Code

func (m *MessageBase) Code() COAPCode

func (*MessageBase) IsConfirmable

func (m *MessageBase) IsConfirmable() bool

IsConfirmable returns true if this message is confirmable.

func (*MessageBase) MessageID

func (m *MessageBase) MessageID() uint16

func (*MessageBase) Option

func (m *MessageBase) Option(o OptionID) interface{}

Option gets the first value for the given option ID.

func (*MessageBase) Options

func (m *MessageBase) Options(o OptionID) []interface{}

Options gets all the values for the given option.

func (*MessageBase) Path

func (m *MessageBase) Path() []string

Path gets the Path set on this message if any.

func (*MessageBase) PathString

func (m *MessageBase) PathString() string

PathString gets a path as a / separated string.

func (*MessageBase) Payload

func (m *MessageBase) Payload() []byte

func (*MessageBase) RemoveOption

func (m *MessageBase) RemoveOption(opID OptionID)

RemoveOption removes all references to an option

func (*MessageBase) SetObserve

func (m *MessageBase) SetObserve(b int)

Set Observer attribute to the message

func (*MessageBase) SetOption

func (m *MessageBase) SetOption(opID OptionID, val interface{})

SetOption sets an option, discarding any previous value

func (*MessageBase) SetPath

func (m *MessageBase) SetPath(s []string)

SetPath updates or adds a URIPath attribute on this message.

func (*MessageBase) SetPathString

func (m *MessageBase) SetPathString(s string)

SetPathString sets a path by a / separated string.

func (*MessageBase) SetPayload

func (m *MessageBase) SetPayload(p []byte)

SetPayload

func (*MessageBase) SetURIQuery

func (m *MessageBase) SetURIQuery(s string)

Set URIQuery attibute to the message

func (*MessageBase) Token

func (m *MessageBase) Token() []byte

func (*MessageBase) Type

func (m *MessageBase) Type() COAPType

type MessageParams

type MessageParams struct {
	Type      COAPType
	Code      COAPCode
	MessageID uint16
	Token     []byte
	Payload   []byte
}

type OptionID

type OptionID uint8

OptionID identifies an option in a message.

const (
	IfMatch       OptionID = 1
	URIHost       OptionID = 3
	ETag          OptionID = 4
	IfNoneMatch   OptionID = 5
	Observe       OptionID = 6
	URIPort       OptionID = 7
	LocationPath  OptionID = 8
	URIPath       OptionID = 11
	ContentFormat OptionID = 12
	MaxAge        OptionID = 14
	URIQuery      OptionID = 15
	Accept        OptionID = 17
	LocationQuery OptionID = 20
	ProxyURI      OptionID = 35
	ProxyScheme   OptionID = 39
	Size1         OptionID = 60
)

Option IDs.

type ServeMux

type ServeMux struct {
	// contains filtered or unexported fields
}

ServeMux provides mappings from a common endpoint to handlers by request path.

func NewServeMux

func NewServeMux() *ServeMux

NewServeMux creates a new ServeMux.

func (*ServeMux) Handle

func (mux *ServeMux) Handle(pattern string, handler Handler)

Handle configures a handler for the given path.

func (*ServeMux) HandleFunc

func (mux *ServeMux) HandleFunc(pattern string,
	f func(l *net.UDPConn, a *net.UDPAddr, m Message) Message)

HandleFunc configures a handler for the given path.

func (*ServeMux) ServeCOAP

func (mux *ServeMux) ServeCOAP(l *net.UDPConn, a *net.UDPAddr, m Message) Message

ServeCOAP handles a single COAP message. The message arrives from the given listener having originated from the given UDPAddr.

type TcpMessage

type TcpMessage struct {
	MessageBase
}

TcpMessage is a CoAP MessageBase that can encode itself for TCP transport.

func Decode

func Decode(r io.Reader) (*TcpMessage, error)

Decode reads a single message from its input.

func NewTcpMessage

func NewTcpMessage(p MessageParams) *TcpMessage

func PullTcp

func PullTcp(data []byte) (*TcpMessage, []byte, error)

PullTcp extracts a complete TCP CoAP message from the front of a byte queue.

Return values:

*TcpMessage: On success, points to the extracted message; nil if a complete
             message could not be extracted.
[]byte: The unread portion of of the supplied byte buffer.  If a message
        was not extracted, this is the unchanged buffer that was passed in.
error: Non-nil if the buffer contains an invalid CoAP message.

Note: It is not an error if the supplied buffer does not contain a complete message. In such a case, nil *TclMessage and error values are returned along with the original buffer.

func (*TcpMessage) MarshalBinary

func (m *TcpMessage) MarshalBinary() ([]byte, error)

func (*TcpMessage) UnmarshalBinary

func (m *TcpMessage) UnmarshalBinary(data []byte) error

Directories

Path Synopsis
example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL