From 5da536ed961ecd16876993690365c7aefe2d2679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Ant=C3=B4nio=20Farias=20Machado?= Date: Mon, 12 Jun 2023 20:12:15 -0300 Subject: [PATCH] feat(api): get supported parameters from device --- .../services/controller/internal/api/api.go | 54 +++++++++++++++++-- .../controller/internal/utils/utils.go | 20 ++++++- 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/backend/services/controller/internal/api/api.go b/backend/services/controller/internal/api/api.go index 62d53b3..5a1df4b 100644 --- a/backend/services/controller/internal/api/api.go +++ b/backend/services/controller/internal/api/api.go @@ -47,6 +47,7 @@ func StartApi(a Api) { iot.HandleFunc("/{sn}/add", a.deviceCreateMsg).Methods("PUT") iot.HandleFunc("/{sn}/del", a.deviceDeleteMsg).Methods("PUT") iot.HandleFunc("/{sn}/set", a.deviceUpdateMsg).Methods("PUT") + iot.HandleFunc("/{sn}/parameters", a.deviceGetSupportedParametersMsg).Methods("PUT") //TODO: Create operation action handler iot.HandleFunc("/device/{sn}/act", a.deviceUpdateMsg).Methods("PUT") @@ -91,6 +92,51 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) { return } +func (a *Api) deviceGetSupportedParametersMsg(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + sn := vars["sn"] + a.deviceExists(sn, w) + + var receiver usp_msg.GetSupportedDM + + err := json.NewDecoder(r.Body).Decode(&receiver) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + msg := utils.NewGetSupportedParametersMsg(receiver) + encodedMsg, err := proto.Marshal(&msg) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + record := utils.NewUspRecord(encodedMsg, sn) + tr369Message, err := proto.Marshal(&record) + if err != nil { + log.Fatalln("Failed to encode tr369 record:", err) + } + + //a.Broker.Request(tr369Message, usp_msg.Header_GET, "oktopus/v1/agent/"+sn, "oktopus/v1/get/"+sn) + a.MsgQueue[msg.Header.MsgId] = make(chan usp_msg.Msg) + a.Broker.Publish(tr369Message, "oktopus/v1/agent/"+sn, "oktopus/v1/api/"+sn) + + select { + case msg := <-a.MsgQueue[msg.Header.MsgId]: + log.Printf("Received Msg: %s", msg.Header.MsgId) + json.NewEncoder(w).Encode(msg.Body.GetResponse().GetSetResp()) + return + case <-time.After(time.Second * 28): + log.Printf("Request %s Timed Out", msg.Header.MsgId) + w.WriteHeader(http.StatusGatewayTimeout) + json.NewEncoder(w).Encode("Request Timed Out") + return + } +} + func (a *Api) deviceCreateMsg(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) sn := vars["sn"] @@ -128,7 +174,7 @@ func (a *Api) deviceCreateMsg(w http.ResponseWriter, r *http.Request) { log.Printf("Received Msg: %s", msg.Header.MsgId) json.NewEncoder(w).Encode(msg.Body.GetResponse().GetAddResp()) return - case <-time.After(time.Second * 5): + case <-time.After(time.Second * 28): log.Printf("Request %s Timed Out", msg.Header.MsgId) w.WriteHeader(http.StatusGatewayTimeout) json.NewEncoder(w).Encode("Request Timed Out") @@ -173,7 +219,7 @@ func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) { log.Printf("Received Msg: %s", msg.Header.MsgId) json.NewEncoder(w).Encode(msg.Body.GetResponse().GetGetResp()) return - case <-time.After(time.Second * 5): + case <-time.After(time.Second * 30): log.Printf("Request %s Timed Out", msg.Header.MsgId) w.WriteHeader(http.StatusGatewayTimeout) json.NewEncoder(w).Encode("Request Timed Out") @@ -218,7 +264,7 @@ func (a *Api) deviceDeleteMsg(w http.ResponseWriter, r *http.Request) { log.Printf("Received Msg: %s", msg.Header.MsgId) json.NewEncoder(w).Encode(msg.Body.GetResponse().GetDeleteResp()) return - case <-time.After(time.Second * 5): + case <-time.After(time.Second * 28): log.Printf("Request %s Timed Out", msg.Header.MsgId) w.WriteHeader(http.StatusGatewayTimeout) json.NewEncoder(w).Encode("Request Timed Out") @@ -263,7 +309,7 @@ func (a *Api) deviceUpdateMsg(w http.ResponseWriter, r *http.Request) { log.Printf("Received Msg: %s", msg.Header.MsgId) json.NewEncoder(w).Encode(msg.Body.GetResponse().GetSetResp()) return - case <-time.After(time.Second * 5): + case <-time.After(time.Second * 28): log.Printf("Request %s Timed Out", msg.Header.MsgId) w.WriteHeader(http.StatusGatewayTimeout) json.NewEncoder(w).Encode("Request Timed Out") diff --git a/backend/services/controller/internal/utils/utils.go b/backend/services/controller/internal/utils/utils.go index c7599bc..f02f735 100644 --- a/backend/services/controller/internal/utils/utils.go +++ b/backend/services/controller/internal/utils/utils.go @@ -7,7 +7,7 @@ import ( "net" ) -//Status are saved at database as numbers +// Status are saved at database as numbers const ( Online = iota Associating @@ -115,3 +115,21 @@ func NewSetMsg(updateStuff usp_msg.Set) usp_msg.Msg { }, } } + +func NewGetSupportedParametersMsg(getStuff usp_msg.GetSupportedDM) usp_msg.Msg { + return usp_msg.Msg{ + Header: &usp_msg.Header{ + MsgId: uuid.NewString(), + MsgType: usp_msg.Header_GET_SUPPORTED_DM, + }, + Body: &usp_msg.Body{ + MsgBody: &usp_msg.Body_Request{ + Request: &usp_msg.Request{ + ReqType: &usp_msg.Request_GetSupportedDm{ + GetSupportedDm: &getStuff, + }, + }, + }, + }, + } +}