Golang的MQTT服务端库mqtt(Broker)

简介

Mochi MQTT 是一个用 Go 编写的嵌入式高性能 MQTT 代理服务器,符合 MQTT v3.0 和 v3.1.1 规范,用于开发 IoT 和智能家居项目。服务器可以作为独立的二进制文件使用,也可以作为库嵌入到您自己的项目中。

https://github.com/mochi-co/mqtt

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main

import (
	"fmt"
	"log"
	"os"
	"os/signal"
	"syscall"

	mqtt "github.com/mochi-co/mqtt/server"
	"github.com/mochi-co/mqtt/server/listeners"
)

func main() {
	// 监听控制信号
	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-sigs
		done <- true
	}()

	server := mqtt.NewServer(nil)

	// TCP
	tcp := listeners.NewTCP("tcp", ":1883")
	err := server.AddListener(tcp, nil)
	if err != nil {
		log.Fatalln(err)
	}

	// WebSocket v3.1.1
	ws := listeners.NewWebsocket("ws", ":1882")
	err = server.AddListener(ws, nil)
	if err != nil {
		log.Fatalln(err)
	}

	// Http
	http := listeners.NewHTTPStats("http", ":8080")
	err = server.AddListener(http, nil)
	if err != nil {
		log.Fatal(err)
	}

	// 启动服务,注意不会阻塞,需要自己处理防止退出
	err = server.Serve()
	if err != nil {
		log.Fatalln(err)
	}
	defer server.Close()

	fmt.Println("Started!")

	// 等待退出信号
	<-done
	fmt.Println("Caught Signal")
	fmt.Println("Finished")
}