- 部署开源emqx Broker
mongodb:
container_name: mongodb
image: mongo:5.0.10
restart: always
ports:
- 27017:27017
command: mongod --auth
volumes:
- /www/conf/mongodb/data:/data/db
- /www/conf/mongodb/log:/var/log/mongodb
- /www/conf/mongodb/config:/etc/mongo
networks:
- mynet
emqx:
container_name: emqx
image: emqx/emqx:5.0.0
restart: always
ports:
- 1883:1883
- 8083:8083
- 8883:8883
- 8084:8084
- 18083:18083
environment:
- EMQX_DASHBOARD__DEFAULT_USER__LOGIN=root
- EMQX_DASHBOARD__DEFAULT_USER__PASSWORD=root@2022
- EMQX_NODE__MAX_PORTS=65535
- EMQX_MQTT__MAX_PACKET_SIZE=16MB
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
volumes:
- /www/conf/emqx/data:/opt/emqx/data
networks:
- mynet
2.运行docker-compose up -d
3.访问127.0.0.1:18083 默认账号:admin 密码 :public
4.设置中英文
5.设置mongodb 认证
db.users.insertOne(
{
"username": "user123",
"s": "salt",
"is": true,
"ph": "bede90386d450cea8b77b822f8887065e4e5abf132c2f9dccfcc7fbd4cba5e35"
}
);
2. golang 客户端连接
package main
import (
"fmt"
mqtt "github.com/eclipse/paho.mqtt.golang"
"time"
)
var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
}
var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
fmt.Println("Connected")
}
var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
fmt.Printf("Connect lost: %v", err)
}
func main() {
var broker = "127.0.0.1"
var port = 1883
opts := mqtt.NewClientOptions()
opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port))
opts.SetClientID("mqttx_4102ff83sss")
opts.SetUsername("user123")
opts.SetPassword("secret")
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())
fmt.Println("ddd")
}
sub(client)
publish(client)
client.Disconnect(250)
}
// 发布消息
func publish(client mqtt.Client) {
num := 10
for i := 0; i < num; i++ {
text := fmt.Sprintf("Message %d", i)
token := client.Publish("topic/test", 0, false, text)
token.Wait()
time.Sleep(time.Second)
}
}
// 订阅
func sub(client mqtt.Client) {
topic := "topic/test"
token := client.Subscribe(topic, 1, nil)
token.Wait()
fmt.Printf("Subscribed to topic: %s", topic)
}