2017-09-25 17:56:28 +02:00
|
|
|
package adapter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"log"
|
|
|
|
"net"
|
|
|
|
|
|
|
|
"github.com/dustin/go-coap"
|
2018-03-11 18:06:01 +01:00
|
|
|
"github.com/mainflux/mainflux"
|
2017-09-25 17:56:28 +02:00
|
|
|
broker "github.com/nats-io/go-nats"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
2017-10-07 19:11:19 +02:00
|
|
|
const protocol string = "coap"
|
|
|
|
|
2017-09-25 17:56:28 +02:00
|
|
|
type Observer struct {
|
|
|
|
conn *net.UDPConn
|
|
|
|
addr *net.UDPAddr
|
|
|
|
message *coap.Message
|
|
|
|
}
|
|
|
|
|
|
|
|
type CoAPAdapter struct {
|
|
|
|
obsMap map[string][]Observer
|
|
|
|
logger *zap.Logger
|
2018-03-11 18:06:01 +01:00
|
|
|
pub mainflux.MessagePublisher
|
2017-09-25 17:56:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewCoAPAdapter creates new CoAP adapter struct
|
2018-03-11 18:06:01 +01:00
|
|
|
func NewCoAPAdapter(logger *zap.Logger, pub mainflux.MessagePublisher) *CoAPAdapter {
|
2017-09-25 17:56:28 +02:00
|
|
|
ca := &CoAPAdapter{
|
|
|
|
logger: logger,
|
2018-03-11 18:06:01 +01:00
|
|
|
pub: pub,
|
|
|
|
obsMap: make(map[string][]Observer),
|
2017-09-25 17:56:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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())
|
|
|
|
}
|
|
|
|
|
2018-04-18 22:36:24 +02:00
|
|
|
// BridgeHandler functions is a handler for messages received via NATS
|
2017-10-07 19:11:19 +02:00
|
|
|
func (ca *CoAPAdapter) BridgeHandler(nm *broker.Msg) {
|
2017-09-25 17:56:28 +02:00
|
|
|
log.Printf("Received a message: %s\n", string(nm.Data))
|
|
|
|
|
|
|
|
// And write it into the database
|
2018-03-11 18:06:01 +01:00
|
|
|
m := mainflux.RawMessage{}
|
2017-09-25 17:56:28 +02:00
|
|
|
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)
|
|
|
|
}
|