# Learn MQTT with Go
Learning MQTT with Golang by doing. This repo is a simple example of using a Golang application as a client (pub & sub) of an MQTT broker.
1883, Eclipse Mosquitto unsecured (opening the port on the internet is not recommended).
## Architecture
![mqtt-arch ](./img/mqtt-architecture.svg )
Ideally I would like this application to resemble the above design. Conceptually, there
## Development
For local development we use [Mosquitto ](https://mosquitto.org/ ) as our MQTT broker, with TLS enabled.
```
sudo apt install mosquitto-clients
```
First generate local development certs using:
```
make gen-local-tls-certs
```
This will create CA, server, and client certificates suitable for local development. Server and CA certs are created in `./.mosquitto/certs` . The client cert is create in the project root.
Start the local development environment with:
```
make start-dev
```
Stop the local development environment with:
```
make stop-dev
```
### Testing
Unit tests can be run with:
```
make test
```
Integration tests are run via:
```
make test-integration
```
## Usage
To run the application end to end first start the development server:
```
make start-dev
```
Next we can start our subscriber. The following command connects to the TLS listener port.
```
go run cmd/subscriber/main.go --host 0.0.0.0 --port 8883
```
## Design Considerations
See [DESIGN_CONCIDERATIONS.md ](./DESIGN_CONCIDERATIONS.md )
## Resources:
- [Mosquitto Docs ](https://mosquitto.org/man/mosquitto-8.html )
- [Mosquitto TLS Tutorial ](https://cedalo.com/blog/mqtt-tls-configuration-guide/ )
- [Golang MQTT Tutorial ](https://www.emqx.com/en/blog/how-to-use-mqtt-in-golang )
- [MQTT as a Service ](https://cedalo.com/mqtt-broker-pro-mosquitto/ )
- [Using Wireshark for MQTT Analysis ](https://cedalo.com/blog/wireshark-mqtt-guide/ )
- [Caddy as reverse proxy ](https://github.com/caddyserver/caddy )
- [Using Python paho MQTT client with TLS ](https://cedalo.com/blog/configuring-paho-mqtt-python-client-with-examples/ )
- [ESP32 Micropython MQTT with TLS ](https://dev.to/bassparanoya/esp32-micropython-mqtt-tls-28fd ): Note cert file format for uPy MQTT client needs to be in .der format which is a binary format.
- [TLS refresher ](http://www.steves-internet-guide.com/ssl-certificates-explained/ )
- [HA Mosquitto in K8s ](https://sko.ai/blog/how-to-run-ha-mosquitto/ )
- [Lamport Timestamps Tutorial ](https://towardsdatascience.com/understanding-lamport-timestamps-with-pythons-multiprocessing-library-12a6427881c6 )
- [Vector Clocks Lecture ](https://www.youtube.com/watch?v=x-D8iFU1d-o )