Features supported:
- CoAP over UDP RFC 7252.
- CoAP over TCP/TLS RFC 8232
- Observe resources in CoAP RFC 7641
- Block-wise transfers in CoAP RFC 7959
- request multiplexer
- multicast
- CoAP NoResponse option in CoAP RFC 7967
- CoAP over DTLS pion/dtls
// Server
// See /examples/simple/server/main.go
func handleA(w coap.ResponseWriter, req *coap.Request) {
log.Printf("Got message in handleA: path=%q: %#v from %v", req.Msg.Path(), req.Msg, req.Client.RemoteAddr())
w.SetContentFormat(coap.TextPlain)
log.Printf("Transmitting from A")
ctx, cancel := context.WithTimeout(req.Ctx, time.Second)
defer cancel()
if _, err := w.WriteWithContext(ctx, []byte("hello world")); err != nil {
log.Printf("Cannot send response: %v", err)
}
}
func main() {
mux := coap.NewServeMux()
mux.Handle("/a", coap.HandlerFunc(handleA))
listenerErrorHandler := func(err error) bool {
log.Printf("Error occurred on listener: %v", err)
return true
}
log.Fatal(coap.ListenAndServe("udp", ":5688", mux, listenerErrorHandler))
// for tcp
// log.Fatal(coap.ListenAndServe("tcp", ":5688", mux, listenerErrorHandler))
// for tcp-tls
// log.Fatal(coap.ListenAndServeTLS("tcp-tls", ":5688", &tls.Config{...}, mux, listenerErrorHandler))
// for udp-dtls
// log.Fatal(coap.ListenAndServeDTLS("udp-dtls", ":5688", &dtls.Config{...}, mux, listenerErrorHandler))
}
// Client
// See /examples/simpler/client/main.go
func main() {
co, err := coap.Dial("udp", "localhost:5688")
// for tcp
// co, err := coap.Dial("tcp", "localhost:5688")
// for tcp-tls
// co, err := coap.DialTLS("tcp-tls", localhost:5688", &tls.Config{...})
// for udp-dtls
// co, err := coap.DialDTLS("udp-dtls", "localhost:5688", &dtls.Config{...}, mux))
if err != nil {
log.Fatalf("Error dialing: %v", err)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
resp, err := co.GetWithContext(ctx, path)
if err != nil {
log.Fatalf("Error sending request: %v", err)
}
log.Printf("Response payload: %v", resp.Payload())
}
Look to examples/observe/server/main.go
Look to examples/observe/client/main.go
Look to examples/mcast/server/main.go
Look to examples/mcast/client/main.go
In order to run the tests that the CI will run locally, the following two commands can be used to build the Docker image and run the tests. When making changes, these are the tests that the CI will run, so please make sure that the tests work locally before committing.
$ docker build . --network=host -t go-coap:build --target build
$ docker run --mount type=bind,source="$(pwd)",target=/shared,readonly --network=host go-coap:build go test './...'
Apache 2.0