mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-26 13:48:53 +08:00
59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package adapter
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"net"
|
|
|
|
"github.com/dustin/go-coap"
|
|
"github.com/mainflux/mainflux/writer"
|
|
broker "github.com/nats-io/go-nats"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type Observer struct {
|
|
conn *net.UDPConn
|
|
addr *net.UDPAddr
|
|
message *coap.Message
|
|
}
|
|
|
|
type CoAPAdapter struct {
|
|
obsMap map[string][]Observer
|
|
logger *zap.Logger
|
|
}
|
|
|
|
// NewCoAPAdapter creates new CoAP adapter struct
|
|
func NewCoAPAdapter(logger *zap.Logger) *CoAPAdapter {
|
|
ca := &CoAPAdapter{
|
|
logger: logger,
|
|
}
|
|
|
|
ca.obsMap = make(map[string][]Observer)
|
|
|
|
return ca
|
|
}
|
|
|
|
// Serve function starts CoAP server
|
|
func (ca *CoAPAdapter) Serve(addr string) error {
|
|
ca.logger.Info("Starting CoAP server", zap.String("address", addr))
|
|
return coap.ListenAndServe("udp", addr, ca.COAPServer())
|
|
}
|
|
|
|
// MsgHandler functions is a handler for messages recieved via NATS
|
|
func (ca *CoAPAdapter) MsgHandler(nm *broker.Msg) {
|
|
log.Printf("Received a message: %s\n", string(nm.Data))
|
|
|
|
// And write it into the database
|
|
m := writer.RawMessage{}
|
|
if len(nm.Data) > 0 {
|
|
if err := json.Unmarshal(nm.Data, &m); err != nil {
|
|
log.Println("Can not decode adapter msg")
|
|
return
|
|
}
|
|
}
|
|
|
|
log.Println("Calling obsTransmit()")
|
|
log.Println(m.Publisher, m.Protocol, m.Channel, m.Payload)
|
|
ca.obsTransmit(m)
|
|
}
|