ETRI_SMARTFARM_POC/bootstrap/cli.go

67 lines
1.3 KiB
Go
Raw Normal View History

2021-11-16 12:28:52 +00:00
package bootstrap
import (
"bytes"
"log"
gonet "net"
"github.com/plgd-dev/go-coap/v2/message"
"github.com/plgd-dev/go-coap/v2/message/codes"
"github.com/plgd-dev/go-coap/v2/mux"
"github.com/plgd-dev/go-coap/v2/net"
"github.com/plgd-dev/go-coap/v2/udp"
)
func handleMcast(w mux.ResponseWriter, r *mux.Message) {
path, err := r.Options.Path()
if err != nil {
log.Printf("cannot get path: %v", err)
return
}
log.Printf("Got mcast message: path=%q: from %v", path, w.Client().RemoteAddr())
w.SetResponse(codes.Content, message.TextPlain, bytes.NewReader([]byte("mcast response")))
}
func RunBootstrapServer() {
m := mux.NewRouter()
m.Handle("/bs", mux.HandlerFunc(handleMcast))
multicastAddr := "224.0.1.187:5683"
l, err := net.NewListenUDP("udp4", multicastAddr)
if err != nil {
log.Println(err)
return
}
ifaces, err := gonet.Interfaces()
if err != nil {
log.Println(err)
return
}
a, err := gonet.ResolveUDPAddr("udp", multicastAddr)
if err != nil {
log.Println(err)
return
}
for _, iface := range ifaces {
err := l.JoinGroup(&iface, a)
if err != nil {
log.Printf("cannot JoinGroup(%v, %v): %v", iface, a, err)
}
}
err = l.SetMulticastLoopback(true)
if err != nil {
log.Println(err)
return
}
defer l.Close()
s := udp.NewServer(udp.WithMux(m))
defer s.Stop()
log.Fatal(s.Serve(l))
}