67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
|
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))
|
||
|
}
|