• Stars
    star
    127
  • Rank 282,790 (Top 6 %)
  • Language
    Go
  • License
    Eclipse Public Li...
  • Created over 10 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An MQTT broker written in Go

Hrotti

Hrotti is both a library that provides an MQTT server and a wrapper program around that library that provides a standalone MQTT server.

When used as a library you create a broker with the NewHrotti(maxQueueDepth int) function. This returns a broker with no listeners, the maxQueueDepth option is the number of messages that will be allowed to queue up for a client before any new messages that would be sent to that client are thrown away.

To add a new listener to the broker you use AddListener(name string, config *ListenerConfig) :) which takes a pointer to a broker as the receiver. name is just a string to identify this listener, config is a pointer to a ListenerConfig currently the only important field in a ListenerConfig is URL which is a url.URL

To stop a listener use StopListener(name string) which again takes a broker as the receiver, name is the name of the listener as given in AddListener(), it returns a nil error on success, otherwise an error to indicate it could not find the named listener. Calling StopListener() will disconnect all clients currently connected to that listener.

Here's a simple example that implements a tcp MQTT server on port 1883

package main

import (
	"github.com/alsm/hrotti/broker"
	"log"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	h := hrotti.NewHrotti(100)
	hrotti.INFO = log.New(os.Stdout, "INFO: ", log.Ldate|log.Ltime)
	h.AddListener("test", hrotti.NewListenerConfig("tcp://0.0.0.0:1883"))

	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt, syscall.SIGTERM)
	<-c
	h.Stop()
}

A slightly more extensive implementation is provided with this library, running go build in the project directory will produce a binary called hrotti which allows for configuration of multiple listeners with a json config file. If only a single listener is required though you can just set the HROTTI_URL environment variable. Only tcp and ws URL schemes are supported, eg: tcp://0.0.0.0:1883 or ws://0.0.0.0:1883/mqtt With a websocket URL if no path is specified it will automatically serve on /

Alternatively a configuration file in json can be provided allowing the creation of multiple listeners, currently all listeners share the same root node in the topic tree. To pass a configuration file use the command line option "-conf", for example;

hrotti -conf config.json

The configuration expects an object called "listeners" which is a map of the listener name to a json representation of a ListenerConfig, currently only the url can be specified.

A listener only listens via tcp or websockets and not both on the same port.

An example configuration file is shown below

{
	"maxQueueDepth": 100,
	"listeners":{
		"tcp":{
			"url":"tcp://0.0.0.0:1883"
		},
		"websockets":{
			"url":"ws://0.0.0.0:2000/mqtt"
		}
	}
}

The current persistence mechanism is in memory only.