mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 02:48:34 +08:00
120 lines
2.8 KiB
Go
120 lines
2.8 KiB
Go
package mqttclient
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"pandax/pkg/global"
|
|
"sync"
|
|
)
|
|
|
|
type MqttClient struct {
|
|
sync.Map
|
|
}
|
|
|
|
type MqttConfig struct {
|
|
HttpBroker string
|
|
Username string
|
|
Password string
|
|
Qos int
|
|
}
|
|
|
|
const (
|
|
ClientsInfo = "client"
|
|
SubscribeTopicsInfo = "subscribe"
|
|
)
|
|
|
|
var Session MqttClient
|
|
|
|
func GetEmqInfo(infoType string) ([]map[string]interface{}, error) {
|
|
var url string
|
|
switch infoType {
|
|
case ClientsInfo:
|
|
url = fmt.Sprintf("%s/v5/clients?_page=1&_limit=100000", global.Conf.Mqtt.HttpBroker)
|
|
case SubscribeTopicsInfo:
|
|
url = fmt.Sprintf("%s/v5/subscriptions?_page=1&_limit=100000", global.Conf.Mqtt.HttpBroker)
|
|
default:
|
|
return nil, errors.New("invalid infoType")
|
|
}
|
|
|
|
req, err := http.NewRequest(http.MethodGet, url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.SetBasicAuth(global.Conf.Mqtt.Username, global.Conf.Mqtt.Password)
|
|
req.Header.Set("Content-Type", "application/json")
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
global.Log.Debug("receive resp, ", string(body))
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, errors.New(resp.Status)
|
|
}
|
|
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
global.Log.Error("body Unmarshal error", err)
|
|
return nil, err
|
|
}
|
|
data, ok := result["data"].([]map[string]interface{})
|
|
if !ok {
|
|
return nil, errors.New("result error")
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
func Publish(topic, clientId string, payload interface{}) error {
|
|
if clientId == "" {
|
|
return errors.New("未获取到MQTT连接")
|
|
}
|
|
global.Log.Debugf("send data to clientId: %s, topic:%s, payload: %v", clientId, topic, payload)
|
|
url := fmt.Sprintf("%s/v5/publish", global.Conf.Mqtt.HttpBroker)
|
|
pubData := map[string]interface{}{
|
|
"topic": topic,
|
|
"payload": payload,
|
|
"qos": global.Conf.Mqtt.Qos,
|
|
"retain": false,
|
|
"clientid": clientId,
|
|
}
|
|
data, err := json.Marshal(pubData)
|
|
if err != nil {
|
|
global.Log.Error("error ", err)
|
|
return err
|
|
}
|
|
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req.SetBasicAuth(global.Conf.Mqtt.Username, global.Conf.Mqtt.Password)
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
global.Log.Errorf("Publish.DefaultClient.Do data=%s error=%s", string(data), err.Error())
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
global.Log.Error("error ReadAll", err)
|
|
return err
|
|
}
|
|
global.Log.Debug("receive resp, ", string(body))
|
|
if resp.StatusCode != http.StatusOK {
|
|
global.Log.Error("bad status ", resp.StatusCode)
|
|
return errors.New(resp.Status)
|
|
}
|
|
return nil
|
|
}
|