Files
PandaX/iothub/client/mqttclient/mqtt_api.go
lixxxww b74f8369a0 mqtt代码优化
Signed-off-by: lixxxww <941403820@qq.com>
2024-01-22 10:41:59 +00:00

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
}