Skip to main content

Usando o HiveMQ com Go

1. Iniciando o projeto

go mod init goHive

2. Subscriber

subscriber.go
package main

import (
"fmt"
mqtt "github.com/eclipse/paho.mqtt.golang"
godotenv "github.com/joho/godotenv"
"os"
)

var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("Recebido: %s do tópico: %s com QoS: %d\n", msg.Payload(), msg.Topic(), msg.Qos())
}

var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
fmt.Println("Connected")
}

var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
fmt.Printf("Connection lost: %v", err)
}

func main() {
err := godotenv.Load(".env")
if err != nil {
fmt.Printf("Error loading .env file: %s", err)
}

var broker = os.Getenv("BROKER_ADDR")
var port = 8883
opts := mqtt.NewClientOptions()
opts.AddBroker(fmt.Sprintf("tls://%s:%d", broker, port))
opts.SetClientID("Subscriber")
opts.SetUsername(os.Getenv("HIVE_USER"))
opts.SetPassword(os.Getenv("HIVE_PSWD"))
opts.SetDefaultPublishHandler(messagePubHandler)
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectLostHandler

client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() && token.Error() != nil {
panic(token.Error())
}

if token := client.Subscribe("test/topic", 1, nil); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
return
}

fmt.Println("Subscriber está rodando. Pressione CTRL+C para sair.")
select {} // Bloqueia indefinidamente
client.Disconnect(250)
}

3. Publisher

publisher.go
package main

import (
"fmt"
mqtt "github.com/eclipse/paho.mqtt.golang"
godotenv "github.com/joho/godotenv"
"os"
"time"
)

var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
fmt.Println("Connected")
}

var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
fmt.Printf("Connection lost: %v", err)
}

func main() {
err := godotenv.Load(".env")
if err != nil {
fmt.Printf("Error loading .env file: %s", err)
}

var broker = os.Getenv("BROKER_ADDR")
var port = 8883
opts := mqtt.NewClientOptions()
opts.AddBroker(fmt.Sprintf("tls://%s:%d", broker, port))
opts.SetClientID("Publisher")
opts.SetUsername(os.Getenv("HIVE_USER"))
opts.SetPassword(os.Getenv("HIVE_PSWD"))
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectLostHandler

client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() && token.Error() != nil {
panic(token.Error())
}

for {
text := "Hello MQTT " + time.Now().Format(time.RFC3339)
token := client.Publish("test/topic", 1, false, text)
token.Wait()
fmt.Println("Publicado:", text)
time.Sleep(2 * time.Second)
}
client.Disconnect(250)
}

4. Rodando

go mod tidy
go run subscriber.go
go run publisher.go