From f816e19f754662d511e0fd01b9e8a084fdccf366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Ant=C3=B4nio=20Farias=20Machado?= Date: Tue, 28 Mar 2023 11:49:10 -0300 Subject: [PATCH] feat(controller): send publish to IoT and watch new connections --- .../services/controller/cmd/oktopus/main.go | 28 ++-- .../controller/internal/mqtt/mqtt-client.go | 142 +++++++++++++++--- .../services/controller/internal/mtp/mtp.go | 2 +- backend/services/mochi/img.png | Bin 0 -> 42553 bytes 4 files changed, 133 insertions(+), 39 deletions(-) create mode 100644 backend/services/mochi/img.png diff --git a/backend/services/controller/cmd/oktopus/main.go b/backend/services/controller/cmd/oktopus/main.go index 3978781..f56aa37 100755 --- a/backend/services/controller/cmd/oktopus/main.go +++ b/backend/services/controller/cmd/oktopus/main.go @@ -25,10 +25,9 @@ func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) log.Println("Starting Oktopus Project TR-369 Controller Version:", VERSION) - //flBroker := flag.Bool("m", false, "Defines if mosquitto container must run or not") // fl_endpointId := flag.String("endpoint_id", "proto::oktopus-controller", "Defines the enpoint id the Agent must trust on.") - flSubTopic := flag.String("s", "oktopus/+/agent/+", "That's the topic agent must publish to, and the controller keeps on listening.") - // fl_pub_topic := flag.String("pub_topic", "oktopus/v1/controller", "That's the topic controller must publish to, and the agent keeps on listening.") + flDevicesTopic := flag.String("d", "oktopus/devices", "That's the topic mqtt broker end new devices info.") + flSubTopic := flag.String("sub", "oktopus/+/controller/+", "That's the topic agent must publish to, and the controller keeps on listening.") flBrokerAddr := flag.String("a", "localhost", "Mqtt broker adrress") flBrokerPort := flag.String("p", "1883", "Mqtt broker port") flTlsCert := flag.String("ca", "", "TLS ca certificate") @@ -44,10 +43,6 @@ func main() { flag.Usage() os.Exit(0) } - //if *flBroker { - // log.Println("Starting Mqtt Broker") - // mqtt.StartMqttBroker() - //} /* This context suppress our needs, but we can use a more sofisticate approach with cancel and timeout options passing it through paho mqtt functions. @@ -58,15 +53,16 @@ func main() { If you want to use another message protocol just make it implement Broker interface. */ mqttClient := mqtt.Mqtt{ - Addr: *flBrokerAddr, - Port: *flBrokerPort, - Id: *flBrokerClientId, - User: *flBrokerUsername, - Passwd: *flBrokerPassword, - Ctx: ctx, - QoS: *flBrokerQos, - SubTopic: *flSubTopic, - CA: *flTlsCert, + Addr: *flBrokerAddr, + Port: *flBrokerPort, + Id: *flBrokerClientId, + User: *flBrokerUsername, + Passwd: *flBrokerPassword, + Ctx: ctx, + QoS: *flBrokerQos, + SubTopic: *flSubTopic, + DevicesTopic: *flDevicesTopic, + CA: *flTlsCert, } mtp.MtpService(&mqttClient, done) diff --git a/backend/services/controller/internal/mqtt/mqtt-client.go b/backend/services/controller/internal/mqtt/mqtt-client.go index 0a49591..9df597f 100644 --- a/backend/services/controller/internal/mqtt/mqtt-client.go +++ b/backend/services/controller/internal/mqtt/mqtt-client.go @@ -4,25 +4,31 @@ import ( "context" "crypto/tls" "crypto/x509" + usp_msg "github.com/leandrofars/oktopus/internal/usp_message" + "github.com/leandrofars/oktopus/internal/usp_record" + "google.golang.org/protobuf/proto" "io/ioutil" "log" "net" + "strings" "sync" + "time" "github.com/eclipse/paho.golang/paho" "github.com/leandrofars/oktopus/internal/utils" ) type Mqtt struct { - Addr string - Port string - Id string - User string - Passwd string - Ctx context.Context - QoS int - SubTopic string - CA string + Addr string + Port string + Id string + User string + Passwd string + Ctx context.Context + QoS int + SubTopic string + DevicesTopic string + CA string } var c *paho.Client @@ -30,15 +36,20 @@ var c *paho.Client /* ------------------- Implementations of broker interface ------------------ */ func (m *Mqtt) Connect() { - msgChan := make(chan *paho.Publish) - go messageHandler(msgChan) - clientConfig := startClient(m.Addr, m.Port, m.CA, m.Ctx, msgChan) + devices := make(chan *paho.Publish) + controller := make(chan *paho.Publish) + go m.messageHandler(devices, controller) + clientConfig := m.startClient(devices, controller) connParameters := startConnection(m.Id, m.User, m.Passwd) conn, err := clientConfig.Connect(m.Ctx, &connParameters) if err != nil { log.Println(err) } + if conn.ReasonCode != 0 { + log.Fatalf("Failed to connect to %s : %d - %s", m.Addr+m.Port, conn.ReasonCode, conn.Properties.ReasonString) + } + // Sets global client to be used by other mqtt functions c = clientConfig @@ -60,24 +71,48 @@ func (m *Mqtt) Disconnect() { func (m *Mqtt) Subscribe() { if _, err := c.Subscribe(m.Ctx, &paho.Subscribe{ Subscriptions: map[string]paho.SubscribeOptions{ - m.SubTopic: {QoS: byte(m.QoS), NoLocal: true}, + m.SubTopic: {QoS: byte(m.QoS), NoLocal: true}, + m.DevicesTopic: {QoS: byte(m.QoS), NoLocal: true}, }, }); err != nil { log.Fatalln(err) } log.Printf("Subscribed to %s", m.SubTopic) + log.Printf("Subscribed to %s", m.DevicesTopic) +} + +func (m *Mqtt) Publish(msg []byte, topic, respTopic string) { + if _, err := c.Publish(context.Background(), &paho.Publish{ + Topic: topic, + QoS: byte(m.QoS), + Retain: false, + Payload: msg, + Properties: &paho.PublishProperties{ + ResponseTopic: respTopic, + }, + }); err != nil { + log.Println("error sending message:", err) + } + + log.Printf("Published to %s", topic) } /* -------------------------------------------------------------------------- */ -func startClient(addr string, port string, tlsCa string, ctx context.Context, msgChan chan *paho.Publish) *paho.Client { - singleHandler := paho.NewSingleHandlerRouter(func(m *paho.Publish) { - msgChan <- m +func (m *Mqtt) startClient(devices, controller chan *paho.Publish) *paho.Client { + singleHandler := paho.NewSingleHandlerRouter(func(p *paho.Publish) { + if p.Topic == m.DevicesTopic { + devices <- p + } else if strings.Contains(p.Topic, "controller") { + controller <- p + } else { + log.Println("No handler for topic: ", p.Topic) + } }) - if tlsCa != "" { - conn := connWithTls(tlsCa, addr+":"+port, ctx) + if m.CA != "" { + conn := connWithTls(m.CA, m.Addr+":"+m.Port, m.Ctx) clientConfig := paho.ClientConfig{ Conn: conn, Router: singleHandler, @@ -91,7 +126,7 @@ func startClient(addr string, port string, tlsCa string, ctx context.Context, ms return paho.NewClient(clientConfig) } - conn, err := net.Dial("tcp", addr+":"+port) + conn, err := net.Dial("tcp", m.Addr+":"+m.Port) if err != nil { log.Println(err) } @@ -179,8 +214,71 @@ func startConnection(id, user, pass string) paho.Connect { return connParameters } -func messageHandler(msg chan *paho.Publish) { - for m := range msg { - log.Println("Received message:", string(m.Payload)) +func (m *Mqtt) messageHandler(devices, controller chan *paho.Publish) { + for { + select { + case d := <-devices: + payload := string(d.Payload) + log.Println("New device: ", payload) + m.handleNewDevice(payload) + case c := <-controller: + m.handleDevicesResponse(c.Payload) + } } } + +func (m *Mqtt) handleNewDevice(deviceMac string) { + payload := usp_msg.Msg{ + Header: &usp_msg.Header{ + MsgId: "uniqueIdentifierForThismessage", + MsgType: usp_msg.Header_GET, + }, + Body: &usp_msg.Body{ + MsgBody: &usp_msg.Body_Request{ + Request: &usp_msg.Request{ + ReqType: &usp_msg.Request_Get{ + Get: &usp_msg.Get{ + ParamPaths: []string{"Device.DeviceInfo."}, + MaxDepth: 1, + }, + }, + }, + }, + }, + } + teste, _ := proto.Marshal(&payload) + record := usp_record.Record{ + Version: "0.1", + ToId: deviceMac, + FromId: "leleco", + PayloadSecurity: usp_record.Record_PLAINTEXT, + RecordType: &usp_record.Record_NoSessionContext{ + NoSessionContext: &usp_record.NoSessionContextRecord{ + Payload: teste, + }, + }, + } + + tr369Message, err := proto.Marshal(&record) + if err != nil { + log.Fatalln("Failed to encode address book:", err) + } + time.Sleep(5 * time.Second) + m.Publish(tr369Message, "oktopus/v1/agent/"+deviceMac, "oktopus/v1/controller/"+deviceMac) +} + +func (m *Mqtt) handleDevicesResponse(p []byte) { + var record usp_record.Record + var message usp_msg.Msg + + err := proto.Unmarshal(p, &record) + if err != nil { + log.Fatal(err) + } + err = proto.Unmarshal(record.GetNoSessionContext().Payload, &message) + if err != nil { + log.Fatal(err) + } + + log.Printf("Received a usp_message: %s\n", message.String()) +} diff --git a/backend/services/controller/internal/mtp/mtp.go b/backend/services/controller/internal/mtp/mtp.go index d910f31..5ba3583 100644 --- a/backend/services/controller/internal/mtp/mtp.go +++ b/backend/services/controller/internal/mtp/mtp.go @@ -13,7 +13,7 @@ import ( type Broker interface { Connect() Disconnect() - // Publish() + Publish(msg []byte, topic, respTopic string) Subscribe() } diff --git a/backend/services/mochi/img.png b/backend/services/mochi/img.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2f50a0e02264f3a6ecbc6311f6b3161fddcc16 GIT binary patch literal 42553 zcmb4qby!s0*S3n%DLphuND2&HIy54UNDBxK-Cd%Tz<`K^0@58rcc+B3Gz=j*bPPib z^Nr8*d*1lo-*;W_cm6up-gB-qd!4=4y4Skz^-)VhnFt?%f9K8}B2^UyojZ51Ab0NE zeTa*V88N(m5`O2-yF021&-8rE_LeS;DGb&{k8Y&q?l}}(@V}s-q)0SV_~yZ@t-#BL zFWLhzb^r$e5h?k7j{rHUXM&1Wz@(nnzS&BF?H5wjQUpU(He?XeLnc{j>a=vP&Aq+G zi(%SjKjYO0tbbo`m#ffNWPe@pl=5tU-!=A(sVMw)@e2YU{yq7e5c2oX@6YPsDK>F` zmg3XTnOp^Y)3C0#J*M0ku4lib63E2Cqt_)lV?^DN1MXTf-VgGB+ViPJKw>fF) zT(M${O~a^xB9;-XD3i;~*VKSSjz=#A`m1co$!vgKLtozANR*7F zQ9sD*uKGYKzYb@w$vApXrI(o7t?3*Z!9tu75z^|#kQX*b__ZcvvKc*#1XipP#_lhrxk;h7GKhwZs`^;5t=gs4W}@eB0Us+9e-@^;Kb+hWP_)*6Z0UGm z9uDH6H_vhja8I(DPYdH3q$6PRR{oZ_s#4@EZ{whOeT@I2zc4rQd%Q!Sw2s<0En!Xi zk0$TBO0}O9=WT4nYL+iTPzKv;pG>AAcR4Ce=THQQjiDIOZ~9J6+Z&Dv#G@HsH}?18Bzt<{;QT>6oO5NbB?B<*u04 zJRI95GkWLCv&AAc)q5;n5n5N|>3c*i^-YcK9>>VD^s%DJ=q>HpAca*+J&Kr6Gsm5k z*kW77&L2;oqj*F%;|b#mh4k8mX*<757KXwSx$U=I1%OS9ZH>B3^od=FT1%8~xYZj^ zI*vHJI=q2sEmI&iHc1xB2g&B(z%Hb-$gm^K3aqE4R0Js-v+XsL-qC^2Yf1P09Cx$6 zuk^yPw}*!MoNvnfcW!TCO*!n-JHgtn+qfiz`2q6x;0D56GFZQNeWgJ7X<1zFk3n`W zCZ@-U7sS@Z9rP4pqOTR+MXy(K?wjkca&7mZbR$@8)$B*F%+GI$Y61u2jm-{j20s@u zNw}SJx-tO5gc7ZRI%!5)&P;%fU4!z#!C!w)Hj&|oe2yfQtuPfE+w|{On;MPJjY2hz z-XrD`K9SPnLLyAxf+!)Xd_&r@rEeeg%el+G`~|6!PS*zvq)HApnI0o1*#-RRESV5mRb$#|Dr_;d$h zlsdLe`{CvR&v**$f#uSO3R_^~@lyRdH|Rv$$Q<05s9u;MIBE2WalATkJ!P(t2QY3= z$L}oXE(~m1ZnJ*G##vc#dygY(h|@zrpd4B!L}GD!_lV|b-xC2(W}ycBJg>h`p6$0g z`bCuPT#+sBl*c{5ZG(6(*?X~Vo|Bj?>+VD{u}qfwDp{De=kq7F>M7BlQY`!CW*4`3 z`)vB+ZI(Nz)fM(b*wclAR1^NgH)#KKSWtpgyH}b+y8%k|3Lo-v*M~DpyF6&gA%h4EnLVU)gb8T^ABfe9bB5!MRDp9gDp@6-F teuu`)Vxml+oGKwXbSx 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 ^MD!Dcd5p{_P7F5w{heA058@LiOf)RT1Hv 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 k|9