| package coap |
| |
| import ( |
| "net" |
| "time" |
| ) |
| |
| 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 |
| ) |
| |
| // Conn is a CoAP client connection. |
| type Conn struct { |
| conn *net.UDPConn |
| buf []byte |
| } |
| |
| // Dial connects a CoAP client. |
| func Dial(n, addr string) (*Conn, error) { |
| uaddr, err := net.ResolveUDPAddr(n, addr) |
| if err != nil { |
| return nil, err |
| } |
| |
| s, err := net.DialUDP("udp", nil, uaddr) |
| if err != nil { |
| return nil, err |
| } |
| |
| return &Conn{s, make([]byte, maxPktLen)}, nil |
| } |
| |
| // Send a message. Get a response if there is one. |
| func (c *Conn) Send(req Message) (Message, error) { |
| err := Transmit(c.conn, nil, req) |
| if err != nil { |
| return nil, err |
| } |
| |
| if !req.IsConfirmable() { |
| return nil, nil |
| } |
| |
| rv, err := Receive(c.conn, c.buf) |
| if err != nil { |
| return nil, err |
| } |
| |
| return rv, nil |
| } |
| |
| // Receive a message. |
| func (c *Conn) Receive() (Message, error) { |
| rv, err := Receive(c.conn, c.buf) |
| if err != nil { |
| return nil, err |
| } |
| return rv, nil |
| } |