198 lines
5.9 KiB
Go
198 lines
5.9 KiB
Go
package hello
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
"github.com/gogf/gf/v2/util/guid"
|
|
"remote-msg/internal/model"
|
|
"remote-msg/internal/service"
|
|
"sync"
|
|
|
|
"remote-msg/api/hello/v1"
|
|
)
|
|
|
|
var (
|
|
subscribeTopic string
|
|
publishTopic string
|
|
)
|
|
|
|
type MqttInstance struct {
|
|
mqttClient *service.MqttClient
|
|
}
|
|
|
|
var once sync.Once
|
|
var mqttInstance *MqttInstance
|
|
|
|
func GetMqttInstance() *MqttInstance {
|
|
once.Do(func() {
|
|
mqttInstance = &MqttInstance{}
|
|
mqttInstance.MqttConnect()
|
|
})
|
|
return mqttInstance
|
|
}
|
|
|
|
func (c *MqttInstance) MqttConnect() {
|
|
c.mqttClient = &service.MqttClient{
|
|
ClientId: "ctwingListener_" + guid.S(),
|
|
}
|
|
ctwingBroker, _ := g.Cfg().Get(context.Background(), "mqtt.ctwing.broker")
|
|
ctwingUsername, _ := g.Cfg().Get(context.Background(), "mqtt.ctwing.username")
|
|
ctwingPassword, _ := g.Cfg().Get(context.Background(), "mqtt.ctwing.password")
|
|
c.mqttClient.Broker = ctwingBroker.String()
|
|
c.mqttClient.UserName = ctwingUsername.String()
|
|
c.mqttClient.PassWord = ctwingPassword.String()
|
|
|
|
err := c.mqttClient.Connect()
|
|
if err != nil {
|
|
panic("mqtt监听失败")
|
|
}
|
|
}
|
|
|
|
func (c *ControllerV1) Hello(ctx context.Context, req *v1.HelloReq) (res *v1.HelloRes, err error) {
|
|
g.RequestFromCtx(ctx).Response.Writeln("Hello World!")
|
|
return
|
|
}
|
|
|
|
func (c *ControllerV1) Get(ctx context.Context, req *v1.GetReq) (res *v1.GetRes, err error) {
|
|
//获取get请求参数
|
|
param := g.RequestFromCtx(ctx).URL.Query()
|
|
fmt.Println(gconv.String(param))
|
|
g.RequestFromCtx(ctx).Response.Writeln("get success!")
|
|
return
|
|
}
|
|
|
|
func (c *ControllerV1) Post(ctx context.Context, req *v1.PostReq) (res *v1.PostRes, err error) {
|
|
res = new(v1.PostRes)
|
|
//获取post请求参数
|
|
body := g.RequestFromCtx(ctx).GetBody()
|
|
var dataMap = make(map[string]interface{})
|
|
err = json.Unmarshal(body, &dataMap)
|
|
if IMEI, ok := dataMap["IMEI"]; ok {
|
|
publishTopic = "/drgyen/" + gconv.String(IMEI) + "/up/"
|
|
} else if imei, ok := dataMap["imei"]; ok {
|
|
publishTopic = "/drgyen/" + gconv.String(imei) + "/up/"
|
|
} else {
|
|
g.Log().Error(ctx, "invalid device imei")
|
|
return
|
|
}
|
|
if dataMap["messageType"] == "dataReport" {
|
|
var postDataDto model.PostDataDto
|
|
err = json.Unmarshal(body, &postDataDto)
|
|
var pushData model.PostParamDto
|
|
pushData.Action = "post_P"
|
|
pushData.Timestamp = postDataDto.Timestamp
|
|
pushData.MsgId = gconv.String(postDataDto.Timestamp)
|
|
pushData.DeviceSN = gconv.String(postDataDto.IMEI)
|
|
pushData.Gateway = gconv.String(postDataDto.IMEI)
|
|
var postParamData model.PostParamData
|
|
postParamData.Data = gconv.String(postDataDto.Payload)
|
|
postParamData.Len = postDataDto.ServiceId
|
|
pushData.Data = append(pushData.Data, postParamData)
|
|
|
|
err = PublishMessage(pushData)
|
|
if err != nil {
|
|
g.Log().Error(ctx, "publish message error", err)
|
|
return
|
|
}
|
|
writeStr := gconv.String(pushData)
|
|
res.Data = writeStr
|
|
return
|
|
|
|
} else if dataMap["messageType"] == "eventReport" {
|
|
var eventPull model.EventPullDto
|
|
err = json.Unmarshal(body, &eventPull)
|
|
var pushData model.PostParamDto
|
|
pushData.Action = "post_E"
|
|
pushData.Timestamp = eventPull.Timestamp
|
|
pushData.MsgId = gconv.String(eventPull.Timestamp)
|
|
pushData.DeviceSN = gconv.String(eventPull.IMEI)
|
|
pushData.Gateway = gconv.String(eventPull.IMEI)
|
|
var postEventData model.PostEventData
|
|
postEventData.Timestamp = eventPull.Timestamp
|
|
eventDataMap := make(map[string]interface{})
|
|
switch eventPull.ServiceId {
|
|
case 1001:
|
|
postEventData.EventCode = "SmokeAlarm"
|
|
var smokeAlarm model.SmokeAlarm
|
|
gconv.Struct(eventPull.EventContent, &smokeAlarm)
|
|
eventDataMap["state"] = smokeAlarm.SmokeState
|
|
eventDataMap["value"] = smokeAlarm.SmokeValue
|
|
break
|
|
case 1002:
|
|
postEventData.EventCode = "TemperatureAlarm"
|
|
var temperatureAlarm model.TemperatureAlarm
|
|
gconv.Struct(eventPull.EventContent, &temperatureAlarm)
|
|
eventDataMap["state"] = temperatureAlarm.TemperatureState
|
|
eventDataMap["value"] = temperatureAlarm.Temperature
|
|
break
|
|
case 1003:
|
|
postEventData.EventCode = "BatteryVoltageLowAlarm"
|
|
var temperatureAlarm model.BatteryVoltageLowAlarm
|
|
gconv.Struct(eventPull.EventContent, &temperatureAlarm)
|
|
eventDataMap["state"] = temperatureAlarm.BatteryState
|
|
eventDataMap["value"] = temperatureAlarm.BatteryVoltage
|
|
break
|
|
case 1004:
|
|
postEventData.EventCode = "TamperAlarm"
|
|
var tamperAlarm model.TamperAlarm
|
|
gconv.Struct(eventPull.EventContent, &tamperAlarm)
|
|
eventDataMap["state"] = tamperAlarm.TamperState
|
|
eventDataMap["value"] = tamperAlarm.TamperState
|
|
break
|
|
case 1005:
|
|
postEventData.EventCode = "ErrorCodeReport"
|
|
var temperatureAlarm model.ErrorCodeReport
|
|
gconv.Struct(eventPull.EventContent, &temperatureAlarm)
|
|
eventDataMap["state"] = temperatureAlarm.ErrorCode
|
|
eventDataMap["value"] = temperatureAlarm.ErrorCode
|
|
break
|
|
default:
|
|
return
|
|
}
|
|
postEventData.Data = append(postEventData.Data, eventDataMap)
|
|
pushData.Data = append(pushData.Data, postEventData)
|
|
err = PublishMessage(pushData)
|
|
if err != nil {
|
|
g.Log().Error(ctx, "publish message error", err)
|
|
return
|
|
}
|
|
writeStr := gconv.String(pushData)
|
|
res.Data = writeStr
|
|
return
|
|
} else if dataMap["messageType"] == "deviceOnlineOfflineReport" {
|
|
var reportPull model.ReportPullDto
|
|
err = json.Unmarshal(body, &reportPull)
|
|
writeStr := gconv.String(reportPull.ModuleParams)
|
|
err = PublishMessage(writeStr)
|
|
if err != nil {
|
|
g.Log().Error(ctx, "publish message error", err)
|
|
return
|
|
}
|
|
res.Data = writeStr
|
|
return
|
|
} else {
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func PublishMessage(message interface{}) error {
|
|
mqttClient := GetMqttInstance().mqttClient
|
|
if mqttClient != nil && !mqttClient.GetClient().IsConnected() {
|
|
return gerror.New("mqtt client is not connected")
|
|
}
|
|
if mqttClient == nil {
|
|
return gerror.New("mqtt client is not connected")
|
|
}
|
|
if publishTopic == "" {
|
|
return gerror.New("publish topic is empty")
|
|
}
|
|
|
|
return mqttClient.Publish(publishTopic, false, gconv.String(message))
|
|
|
|
}
|