1package main23import (4 "net"5)67type CoapEndpoint struct {8 conn net.PacketConn9 lastAddr *net.Addr10 // XXX: mutex?1112 RX <-chan []byte13 TX chan<- []byte14}1516func NewCoapEP(addr string) (*CoapEndpoint, error) {17 conn, err := net.ListenPacket("udp", addr)18 if err != nil {19 return nil, err20 }2122 rx := make(chan []byte)23 tx := make(chan []byte)2425 ep := &CoapEndpoint{26 conn: conn,27 lastAddr: nil,28 RX: rx,29 TX: tx,30 }3132 go ep.sndLoop(tx)33 go ep.rcvLoop(rx)3435 return ep, nil36}3738func (c *CoapEndpoint) sndLoop(ch <-chan []byte) {39 for {40 data := <-ch4142 if c.lastAddr == nil {43 logger.Println("[CoapEndpoint] Unexpected CoAP send")44 continue45 }4647 _, err := c.conn.WriteTo(data, *c.lastAddr)48 if err != nil {49 logger.Println("[CoapEndpoint] WriteTo failed", err)50 continue51 }52 }53}5455func (c *CoapEndpoint) rcvLoop(ch chan<- []byte) {56 buf := make([]byte, bufSize)5758 for {59 n, addr, err := c.conn.ReadFrom(buf)60 if err != nil {61 logger.Println("[CoapEndpoint] ReadFrom failed", err)62 continue63 }6465 c.lastAddr = &addr66 ch <- buf[0:n]67 }68}6970func (c *CoapEndpoint) Close() {71 // close(c.Chan)72 c.conn.Close()73}