Files
mqtt2ws/main.go
2021-10-03 02:32:08 +01:00

79 lines
1.5 KiB
Go

package main
import (
"flag"
"io"
"log"
"net"
"github.com/eclipse/paho.mqtt.golang"
"github.com/eclipse/paho.mqtt.golang/packets"
)
var listen = flag.String("listen", ":1883", "listen tcp socket")
var url = flag.String("url", "ws://broker.hivemq.com:8000/mqtt", "websocket url")
func main() {
// Parse Flags
flag.Parse()
// Listen on TCP Socket
log.Println("Listening on:", *listen)
listener, err := net.Listen("tcp", *listen)
if err != nil {
log.Println("Listen error", err)
return
}
defer listener.Close()
// Set up context with cancel
// Loop forever
for {
// Accept TCP connection
s, err := listener.Accept()
if err != nil {
log.Println("Accept error", err)
return
}
go func() {
// Defer closing TCP connection
defer s.Close()
// Create MQTT-WS client
ws, err := mqtt.NewWebsocket(*url, nil, 0, nil, nil)
if err != nil {
log.Println("Websocket error", err)
return
}
// Defer closing Websocket connection
defer ws.Close()
// If either direction is done, both are done
done := make(chan bool)
// Read from s, write to ws
go func() {
defer func() { done <- true }()
for {
p, err := packets.ReadPacket(s)
if err != nil {
log.Println("Error reading from TCP socket", err)
return
}
err = p.Write(ws)
if err != nil {
log.Println("Error writing to Websocket", err)
return
}
}
}()
// Read from ws, write to s
go func() {
defer func() { done <- true }()
io.Copy(s, ws)
}()
<-done
}()
}
}