85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
|
package device
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
"github.com/spf13/cast"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
UsrTypeRaw = "raw"
|
||
|
)
|
||
|
|
||
|
type UsrN520 struct {
|
||
|
sync.Mutex
|
||
|
deviceId string
|
||
|
client mqtt.Client
|
||
|
callback Callback
|
||
|
brand string
|
||
|
model string
|
||
|
}
|
||
|
|
||
|
func NewUsrN520(deviceId string, client mqtt.Client, call Callback) *UsrN520 {
|
||
|
u := &UsrN520{
|
||
|
deviceId: deviceId,
|
||
|
client: client,
|
||
|
callback: call,
|
||
|
brand: BrandUsr,
|
||
|
model: "n520",
|
||
|
}
|
||
|
if call != nil {
|
||
|
|
||
|
if deviceId != "#" {
|
||
|
client.Subscribe(fmt.Sprintf("%s/%s/%s/#", u.brand, u.model, deviceId), 2, u.Callback)
|
||
|
} else {
|
||
|
client.Subscribe(fmt.Sprintf("%s/%s/#", u.brand, u.model), 2, u.Callback)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
func (u *UsrN520) KeepAlive() error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (u *UsrN520) Operate(string) error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (u *UsrN520) getDeviceId(topic string) string {
|
||
|
devId := u.deviceId
|
||
|
if devId == "#" {
|
||
|
fields := strings.Split(topic, "/")
|
||
|
if len(fields) >= 3 {
|
||
|
devId = fields[2]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return devId
|
||
|
}
|
||
|
|
||
|
func (s *UsrN520) Callback(client mqtt.Client, message mqtt.Message) {
|
||
|
s.Lock()
|
||
|
defer s.Unlock()
|
||
|
|
||
|
topic := message.Topic()
|
||
|
payload := message.Payload()
|
||
|
log.Debugf("[%s][%s] deviceId[%s] topic[%s] payloyad[%s]", s.brand, s.model, s.deviceId, topic, string(payload))
|
||
|
|
||
|
var callMsg Message
|
||
|
callMsg.MsgType = UsrTypeRaw
|
||
|
callMsg.MsgTime = time.Now().Unix()
|
||
|
callMsg.MsgId = cast.ToString(message.MessageID())
|
||
|
callMsg.DeviceId = s.getDeviceId(topic)
|
||
|
callMsg.Topic = topic
|
||
|
callMsg.Data = make(map[string]interface{})
|
||
|
json.Unmarshal([]byte(payload), &callMsg.Data)
|
||
|
s.callback(&callMsg)
|
||
|
}
|