An embeddable high-performance MQTT dealer server written in Golang
supporting distributed cluster, and compliant with the MQTT v3.0 and v3.1.1 and v5.0 specs for the event of IoT and smarthome tasks. The server can be utilized both as a standalone binary or embedded as a library in your personal tasks. CoMQTT message throughput is comparable with everybody’s favorites, resembling Mosquitto, Mosca, and VerneMQ.
What’s MQTT?
MQTT stands for MQ Telemetry Transport. It’s a publish/subscribe, very simple and light-weight messaging protocol, designed for constrained gadgets and low-bandwidth, high-latency or unreliable networks. Study extra
Co MQTT Options
- Paho MQTT 3.0 / 3.1.1 / 5.0 appropriate.
- Full MQTT Characteristic-set (QoS, Retained, $SYS).
- Interfaces for Consumer Authentication and Matter entry management. Auth&ACL primarily based on Redis/HTTP/Mysql is already supported.
- Trie-based Subscription mannequin.
- Ring Buffer packet codec.
- TCP, Websocket, (together with SSL/TLS) and Dashboard listeners.
- Bolt persistence and storage interfaces (see examples folder).
- Immediately Publishing from embedding service (
s.Publish(subject, message, retain)
). - Fundamental Occasion Hooks (
OnMessage
,onSubscribe
,onUnsubscribe
,OnConnect
,OnDisconnect
,onProcessMessage
,OnError
,OnStorage
). - ARM32 Appropriate.
- Distributed Cluster.
Roadmap
- Auth plugin
- Rule engine
- Bridge
- CoAP
Utilizing the Golang MQTT Dealer
CoMQTT can be utilized as a standalone dealer. Merely checkout this repository and run the essential.go
entry level within the cmd
folder which is able to expose tcp (:1883), websocket (:1882), and dashboard (:8080) listeners. A docker picture is coming quickly.
cd cmd
go construct -o commqtt && ./comqtt
Utilizing Docker
A easy Dockerfile is offered for operating the cmd/single/essential.go
Websocket, TCP, and Stats server:
docker construct -t comqtt:newest . docker run -p 1883:1883 -p 1882:1882 -p 8080:8080 comqtt:newest
Fast Begin with Golang
import ( mqtt "github.com/wind-c/comqtt/server" ) func essential() { // Create the brand new MQTT Server. server := mqtt.NewServer(nil) // Create a TCP listener on a regular port. tcp := listeners.NewTCP("t1", ":1883") // Add the listener to the server with default choices (nil). err := server.AddListener(tcp, nil) if err != nil { log.Deadly(err) } // Begin the dealer. Serve() is obstructing - see examples folder // for utilization concepts. err = server.Serve() if err != nil { log.Deadly(err) } }
Examples of operating the dealer with numerous configurations might be discovered within the examples
folder.
Community Listeners
The server comes with a wide range of pre-packaged community listeners which permit the dealer to just accept connections on completely different protocols. The present listeners are:
listeners.NewTCP(id, deal with string)
– A TCP Listener, taking a singular ID and a community deal with to bind.listeners.NewWebsocket(id, deal with string)
A Websocket Listenerlisteners.NewHTTPStats()
An HTTP $SYS information dashboard
Configuring Community Listeners
When a listener is added to the server utilizing server.AddListener
, a *listeners.Config
could also be handed because the second argument.
Authentication and ACL
Authentication and ACL could also be configured on a per-listener foundation by offering an Auth Controller to the listener configuration. Customized Auth Controllers ought to fulfill the auth.Controller
interface present in listeners/auth
. Two default controllers are offered, auth.Permit
, which permits all visitors, and auth.Disallow
, which denies all visitors.
err := server.AddListener(tcp, &listeners.Config{ Auth: new(auth.Permit), })
If no auth controller is offered within the listener configuration, the server will default to Disallowing all visitors to forestall unintentional safety points.
SSL
SSL could also be configured on each the TCP and Websocket listeners by offering a public-private PEM key pair to the listener configuration as []byte
slices.
err := server.AddListener(tcp, &listeners.Config{ Auth: new(auth.Permit), TLS: &listeners.TLS{ Certificates: publicCertificate, PrivateKey: privateKey, }, })
Observe the obligatory inclusion of the Auth Controller!
Occasion Hooks with Golang primarily based MQTT Server
Some fundamental Occasion Hooks have been added, permitting you to name your personal features when sure occasions happen. The execution of the features are blocking – if mandatory, please deal with goroutines throughout the embedding service.
Working examples might be discovered within the examples/occasions
folder. Please open a difficulty if there’s a specific occasion hook you have an interest in!