diff --git a/README.md b/README.md
index 009ce85..cb05965 100644
--- a/README.md
+++ b/README.md
@@ -73,6 +73,9 @@ Run app using Docker:
user@user-laptop:~$ cd oktopus/deploy/compose
user@user-laptop:~/oktopus/deploy/compose$ COMPOSE_PROFILES=nats,controller,mqtt,stomp,ws,adapter,frontend,portainer docker compose up -d
+ UI will open at port 3000:
+
+
Device test agent (obuspa):
diff --git a/backend/services/controller/internal/api/info.go b/backend/services/controller/internal/api/info.go
index 737d904..7610985 100644
--- a/backend/services/controller/internal/api/info.go
+++ b/backend/services/controller/internal/api/info.go
@@ -20,6 +20,7 @@ type StatusCount struct {
type GeneralInfo struct {
MqttRtt string
WebsocketsRtt string
+ StompRtt string
ProductClassCount []entity.ProductClassCount
StatusCount StatusCount
VendorsCount []entity.VendorsCount
@@ -73,28 +74,34 @@ func (a *Api) generalInfo(w http.ResponseWriter, r *http.Request) {
result.ProductClassCount = productclasscount.Msg
now := time.Now()
- _, err = bridge.NatsReq[time.Duration](
+ _, err = bridge.NatsReqWithoutHttpSet[time.Duration](
local.NATS_WS_ADAPTER_SUBJECT_PREFIX+"rtt",
[]byte(""),
- w,
a.nc,
)
- if err != nil {
- return
+ if err == nil {
+ result.WebsocketsRtt = time.Until(now).String()
}
- result.WebsocketsRtt = time.Until(now).String()
now = time.Now()
- _, err = bridge.NatsReq[time.Duration](
- local.NATS_MQTT_ADAPTER_SUBJECT_PREFIX+"rtt",
+ _, err = bridge.NatsReqWithoutHttpSet[time.Duration](
+ local.NATS_STOMP_ADAPTER_SUBJECT_PREFIX+"rtt",
[]byte(""),
- w,
a.nc,
)
- if err != nil {
- return
+ if err == nil {
+ result.StompRtt = time.Until(now).String()
+ }
+
+ now = time.Now()
+ _, err = bridge.NatsReqWithoutHttpSet[time.Duration](
+ local.NATS_MQTT_ADAPTER_SUBJECT_PREFIX+"rtt",
+ []byte(""),
+ a.nc,
+ )
+ if err == nil {
+ result.MqttRtt = time.Until(now).String()
}
- result.MqttRtt = time.Until(now).String()
err = json.NewEncoder(w).Encode(result)
if err != nil {
diff --git a/backend/services/controller/internal/bridge/bridge.go b/backend/services/controller/internal/bridge/bridge.go
index 6f3a66d..af3bc1a 100644
--- a/backend/services/controller/internal/bridge/bridge.go
+++ b/backend/services/controller/internal/bridge/bridge.go
@@ -172,3 +172,35 @@ func NatsReq[T entity.DataType](
return answer, nil
}
+
+func NatsReqWithoutHttpSet[T entity.DataType](
+ subj string,
+ body []byte,
+ nc *nats.Conn,
+) (*entity.MsgAnswer[T], error) {
+
+ var answer *entity.MsgAnswer[T]
+
+ msg, err := nc.Request(subj, body, local.NATS_REQUEST_TIMEOUT)
+ if err != nil {
+ log.Println(err)
+ return nil, err
+ }
+
+ err = json.Unmarshal(msg.Data, &answer)
+ if err != nil {
+
+ var errMsg *entity.MsgAnswer[*string]
+ err = json.Unmarshal(msg.Data, &errMsg)
+
+ if err != nil {
+ log.Println("Bad answer message formatting: ", err.Error())
+ return nil, err
+ }
+
+ log.Printf("Error message received, msg: %s, code: %d", *errMsg.Msg, errMsg.Code)
+ return nil, errNatsMsgReceivedWithErrorData
+ }
+
+ return answer, nil
+}
diff --git a/backend/services/controller/internal/nats/nats.go b/backend/services/controller/internal/nats/nats.go
index a24e65a..f2b4998 100644
--- a/backend/services/controller/internal/nats/nats.go
+++ b/backend/services/controller/internal/nats/nats.go
@@ -10,16 +10,17 @@ import (
)
const (
- NATS_ACCOUNT_SUBJ_PREFIX = "account-manager.v1."
- NATS_REQUEST_TIMEOUT = 10 * time.Second
- NATS_MQTT_SUBJECT_PREFIX = "mqtt.usp.v1."
- NATS_MQTT_ADAPTER_SUBJECT_PREFIX = "mqtt-adapter.usp.v1."
- NATS_ADAPTER_SUBJECT = "adapter.usp.v1."
- NATS_WS_SUBJECT_PREFIX = "ws.usp.v1."
- NATS_WS_ADAPTER_SUBJECT_PREFIX = "ws-adapter.usp.v1."
- DEVICE_SUBJECT_PREFIX = "device.usp.v1."
- BUCKET_NAME = "devices-auth"
- BUCKET_DESCRIPTION = "Devices authentication"
+ NATS_ACCOUNT_SUBJ_PREFIX = "account-manager.v1."
+ NATS_REQUEST_TIMEOUT = 10 * time.Second
+ NATS_MQTT_SUBJECT_PREFIX = "mqtt.usp.v1."
+ NATS_MQTT_ADAPTER_SUBJECT_PREFIX = "mqtt-adapter.usp.v1."
+ NATS_ADAPTER_SUBJECT = "adapter.usp.v1."
+ NATS_WS_SUBJECT_PREFIX = "ws.usp.v1."
+ NATS_WS_ADAPTER_SUBJECT_PREFIX = "ws-adapter.usp.v1."
+ NATS_STOMP_ADAPTER_SUBJECT_PREFIX = "stomp-adapter.usp.v1."
+ DEVICE_SUBJECT_PREFIX = "device.usp.v1."
+ BUCKET_NAME = "devices-auth"
+ BUCKET_DESCRIPTION = "Devices authentication"
)
func StartNatsClient(c config.Nats) (jetstream.JetStream, *nats.Conn, jetstream.KeyValue) {
diff --git a/frontend/public/assets/mtp/boot-stomp.svg b/frontend/public/assets/mtp/boot-stomp.svg
new file mode 100644
index 0000000..289c0b1
--- /dev/null
+++ b/frontend/public/assets/mtp/boot-stomp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/public/assets/mtp/websocket.svg b/frontend/public/assets/mtp/websocket.svg
new file mode 100644
index 0000000..522ad53
--- /dev/null
+++ b/frontend/public/assets/mtp/websocket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/pages/index.js b/frontend/src/pages/index.js
index b98018e..1ba7351 100644
--- a/frontend/src/pages/index.js
+++ b/frontend/src/pages/index.js
@@ -143,12 +143,6 @@ const Page = () => {
container
spacing={3}
>
-
-
{
>
+
+
+
@@ -176,6 +184,12 @@ const Page = () => {
sm={6}
lg={3}
>
+
{
- var { value, sx } = props;
+ var { value, mtp, sx, type } = props;
var valueRaw;
if( value !== undefined) {
valueRaw = value.substring(1);
+ console.log("rtt:", valueRaw)
}
+ const formatMilliseconds = (timeString) => {
+
+ if (timeString === "") {
+ return "";
+ }
+ // Regular expression to extract value and unit
+ const regex = /^(\d+(\.\d+)?)\s*([mµ]?s|s)?$/;
+
+ // Extract value and unit
+ const matches = timeString.match(regex);
+ if (!matches) {
+ return "Invalid time format";
+ }
+
+ let value = parseFloat(matches[1]);
+ const unit = matches[3] || "ms";
+
+ // Convert units to milliseconds
+ switch (unit) {
+ case "s":
+ value *= 1000;
+ break;
+ case "µs":
+ value /= 1000;
+ break;
+ default:
+ // For "ms", do nothing
+ break;
+ }
+
+ // Round the number to two decimal places
+ const roundedValue = value.toFixed(2);
+
+ return `${roundedValue}ms`;
+}
+
+const showIcon = (mtpType) => {
+ if (valueRaw === "") {
+ return
+ }
+ switch (mtpType) {
+ case "mqtt":
+ return
+ case "stomp":
+ return ;
+ case "websocket":
+ return ;
+ default:
+ return ;
+ }
+}
+
return (
@@ -34,10 +89,10 @@ export const OverviewTasksProgress = (props) => {
gutterBottom
variant="overline"
>
- Conexão MQTT
+ {mtp}
- {valueRaw}
+ {formatMilliseconds(valueRaw)}
{
width: 56
}}
>
-
-
-
+ {showIcon(type)}