update
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package mqtt
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"gitee.com/jhx1219/machine-go/utils/common/job"
|
||||
mqtt_client "gitee.com/jhx1219/machine-go/utils/common/mqtt"
|
||||
"gitee.com/jhx1219/machine-go/utils/common/receive"
|
||||
"gitee.com/jhx1219/machine-go/utils/common/task"
|
||||
|
||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||
)
|
||||
|
||||
type Payload map[string]interface{}
|
||||
|
||||
type Message struct {
|
||||
Payload Payload `json:"payload"`
|
||||
Topic string `json:"topic"`
|
||||
}
|
||||
|
||||
type FaceMqtt struct {
|
||||
MqttClient *mqtt_client.MqttClient
|
||||
subTopicList []string
|
||||
responseFunc func(*FaceMqtt, Message)
|
||||
ReceiveServer *receive.Receive
|
||||
JobServer *job.Job
|
||||
}
|
||||
|
||||
func NewFaceMqtt() *FaceMqtt {
|
||||
fm := &FaceMqtt{}
|
||||
fm.responseFunc = nil
|
||||
|
||||
// 初始化接收数据异步任务
|
||||
log.Println("初始化异步任务...")
|
||||
|
||||
// 初始化job异步任务
|
||||
job := job.NewJob()
|
||||
fm.JobServer = job
|
||||
|
||||
t := task.NewTask(os.Getenv("RECEIVE_PATH"))
|
||||
r := receive.NewReceive(t)
|
||||
|
||||
r.SetTaskFunc(func(msg string, task *task.Task) {
|
||||
job.LogJobTask(msg)
|
||||
})
|
||||
|
||||
fm.ReceiveServer = r
|
||||
|
||||
log.Println("异步任务初始化完成")
|
||||
|
||||
return fm
|
||||
}
|
||||
func (fm *FaceMqtt) SubTopic(topic string) {
|
||||
fm.subTopicList = append(fm.subTopicList, topic)
|
||||
}
|
||||
|
||||
func (fm *FaceMqtt) SetResponseFunc(f func(*FaceMqtt, Message)) {
|
||||
fm.responseFunc = f
|
||||
}
|
||||
|
||||
func (fm *FaceMqtt) PublishMsg(topic string, payload string) {
|
||||
fm.MqttClient.Publish(topic, []byte(payload))
|
||||
}
|
||||
|
||||
func (fm *FaceMqtt) MqttServer() {
|
||||
go func() {
|
||||
fm.ReceiveServer.ReceiveTaskServer()
|
||||
}()
|
||||
|
||||
// 初始化mqtt
|
||||
log.Println("初始化mqtt...")
|
||||
m := mqtt_client.NewMqttClient()
|
||||
|
||||
var subMsgChan = make(chan Message, 20)
|
||||
|
||||
handler := func(client mqtt.Client, msg mqtt.Message) {
|
||||
|
||||
p := make(Payload)
|
||||
|
||||
err := json.Unmarshal(msg.Payload(), &p)
|
||||
|
||||
if err != nil {
|
||||
log.Println("mqtt消息解析失败: " + err.Error())
|
||||
return
|
||||
}
|
||||
subMsgChan <- Message{
|
||||
Payload: p,
|
||||
Topic: msg.Topic(),
|
||||
}
|
||||
}
|
||||
|
||||
for _, topic := range fm.subTopicList {
|
||||
m.SubTopic(topic, handler)
|
||||
}
|
||||
|
||||
m.Connect(mqtt_client.MqttConf{
|
||||
Host: os.Getenv("MQTT_HOST"),
|
||||
Port: os.Getenv("MQTT_PORT"),
|
||||
Username: os.Getenv("MQTT_USERNAME"),
|
||||
Password: os.Getenv("MQTT_PASSWORD"),
|
||||
})
|
||||
|
||||
fm.MqttClient = m
|
||||
|
||||
go func() {
|
||||
fm.mqttSubMsgServer(subMsgChan)
|
||||
}()
|
||||
|
||||
log.Println("mqtt初始化完成")
|
||||
}
|
||||
|
||||
func (fm *FaceMqtt) mqttSubMsgServer(subMsgChan chan Message) {
|
||||
for {
|
||||
msg := <-subMsgChan
|
||||
go func() {
|
||||
// 记录到达消息
|
||||
logBytes, err := json.Marshal(msg)
|
||||
if err == nil {
|
||||
err = fm.ReceiveServer.LogReceice(string(logBytes))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
log.Printf("消息记录 %s 错误: %s\n", logBytes, err)
|
||||
return
|
||||
}
|
||||
// 处理回复
|
||||
if fm.responseFunc != nil {
|
||||
fm.responseFunc(fm, msg)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user