telegraf/plugins/outputs/mqtt/mqtt_v3.go

93 lines
1.8 KiB
Go

package mqtt
import (
"fmt"
"time"
// Library that supports v3.1.1
mqttv3 "github.com/eclipse/paho.mqtt.golang"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/internal"
)
type mqttv311Client struct {
*MQTT
client mqttv3.Client
}
func newMQTTv311Client(cfg *MQTT) *mqttv311Client {
return &mqttv311Client{MQTT: cfg}
}
func (m *mqttv311Client) Connect() error {
opts := mqttv3.NewClientOptions()
opts.KeepAlive = m.KeepAlive
if m.Timeout < config.Duration(time.Second) {
m.Timeout = config.Duration(5 * time.Second)
}
opts.WriteTimeout = time.Duration(m.Timeout)
if m.ClientID != "" {
opts.SetClientID(m.ClientID)
} else {
opts.SetClientID("Telegraf-Output-" + internal.RandomString(5))
}
tlsCfg, err := m.ClientConfig.TLSConfig()
if err != nil {
return err
}
opts.SetTLSConfig(tlsCfg)
user := m.Username
if user != "" {
opts.SetUsername(user)
}
password := m.Password
if password != "" {
opts.SetPassword(password)
}
if len(m.Servers) == 0 {
return fmt.Errorf("could not get server informations")
}
servers, err := parseServers(m.Servers)
if err != nil {
return err
}
for _, server := range servers {
if tlsCfg != nil {
server.Scheme = "tls"
}
broker := server.String()
opts.AddBroker(broker)
m.MQTT.Log.Debugf("registered mqtt broker: %v", broker)
}
opts.SetAutoReconnect(true)
m.client = mqttv3.NewClient(opts)
if token := m.client.Connect(); token.Wait() && token.Error() != nil {
return token.Error()
}
return nil
}
func (m *mqttv311Client) Publish(topic string, body []byte) error {
token := m.client.Publish(topic, byte(m.QoS), m.Retain, body)
token.WaitTimeout(time.Duration(m.Timeout))
if token.Error() != nil {
return token.Error()
}
return nil
}
func (m *mqttv311Client) Close() error {
if m.client.IsConnected() {
m.client.Disconnect(20)
}
return nil
}