75 lines
2.1 KiB
Go
75 lines
2.1 KiB
Go
package usp_handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
|
|
"github.com/OktopUSP/oktopus/backend/services/mtp/adapter/internal/db"
|
|
"github.com/OktopUSP/oktopus/backend/services/mtp/adapter/internal/nats"
|
|
"github.com/OktopUSP/oktopus/backend/services/mtp/adapter/internal/usp/usp_msg"
|
|
"github.com/OktopUSP/oktopus/backend/services/mtp/adapter/internal/usp/usp_record"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
func (h *Handler) HandleDeviceInfo(device, subject string, data []byte, mtp string, ack func()) {
|
|
defer ack()
|
|
log.Printf("Device %s info, mtp: %s", device, mtp)
|
|
deviceInfo := parseDeviceInfoMsg(device, subject, data, getMtp(mtp))
|
|
if deviceExists, _ := h.db.DeviceExists(deviceInfo.SN); !deviceExists {
|
|
fmtDeviceInfo, _ := json.Marshal(deviceInfo)
|
|
h.nc.Publish("device.v1.new", fmtDeviceInfo)
|
|
}
|
|
err := h.db.CreateDevice(deviceInfo)
|
|
if err != nil {
|
|
log.Printf("Failed to create device: %v", err)
|
|
}
|
|
}
|
|
|
|
func getMtp(mtp string) db.MTP {
|
|
switch mtp {
|
|
case nats.MQTT_STREAM_NAME:
|
|
return db.MQTT
|
|
case nats.WS_STREAM_NAME:
|
|
return db.WEBSOCKETS
|
|
case nats.STOMP_STREAM_NAME:
|
|
return db.STOMP
|
|
default:
|
|
return db.UNDEFINED
|
|
}
|
|
}
|
|
|
|
func parseDeviceInfoMsg(sn, subject string, data []byte, mtp db.MTP) db.Device {
|
|
var record usp_record.Record
|
|
var message usp_msg.Msg
|
|
|
|
err := proto.Unmarshal(data, &record)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
err = proto.Unmarshal(record.GetNoSessionContext().Payload, &message)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
var device db.Device
|
|
msg := message.Body.MsgBody.(*usp_msg.Body_Response).Response.GetGetResp()
|
|
|
|
device.Vendor = msg.ReqPathResults[0].ResolvedPathResults[0].ResultParams["Manufacturer"]
|
|
device.Model = msg.ReqPathResults[1].ResolvedPathResults[0].ResultParams["ModelName"]
|
|
device.Version = msg.ReqPathResults[2].ResolvedPathResults[0].ResultParams["SoftwareVersion"]
|
|
device.ProductClass = msg.ReqPathResults[4].ResolvedPathResults[0].ResultParams["ProductClass"]
|
|
device.SN = sn
|
|
switch db.MTP(mtp) {
|
|
case db.MQTT:
|
|
device.Mqtt = db.Online
|
|
case db.WEBSOCKETS:
|
|
device.Websockets = db.Online
|
|
case db.STOMP:
|
|
device.Stomp = db.Online
|
|
}
|
|
|
|
device.Status = db.Online
|
|
|
|
return device
|
|
}
|