forked from ngocphu811/mqttwss
/
mqttwss.go
103 lines (94 loc) · 2.37 KB
/
mqttwss.go
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"fmt"
"net"
"flag"
"net/http"
"crypto/tls"
"code.google.com/p/go.net/websocket"
"github.com/huin/mqtt"
"bufio"
"bytes"
)
var (
bs = flag.Bool("bs", false, "SSL/TLS broker connection")
bhost = flag.String("bhost", "localhost", "Broker host")
bport = flag.String("bport", "1883", "Broker port")
bsinsec = flag.Bool("skip-verify", false, "Insecure Skip Verify")
bcert = flag.String("bcert", "", "SSL/TLS broker certificate")
bkey = flag.String("bkey", "", "SSL/TLS broker key")
ws = flag.Bool("ws", false, "SSL/TLS websocket connection")
wsport = flag.String("wport", "9999", "Websocket listening port")
wscert = flag.String("wscert", "", "CA file for secure server")
wskey = flag.String("wskey", "", "Key file for secure server")
)
func wshandler(ws *websocket.Conn) {
flag.Parse()
var mqcon net.Conn
var err error
if *bs {
conf := tls.Config{InsecureSkipVerify: *bsinsec}
if *bcert != "" && *bkey != "" {
Cert, err := tls.LoadX509KeyPair(*bcert, *bkey)
if err != nil {
fmt.Println("LoadX509KeyPair:", err)
return
}
conf.Certificates = []tls.Certificate{Cert}
}
mqcon, err = tls.Dial("tcp", *bhost + ":" + *bport, &conf)
} else {
mqcon, err = net.Dial("tcp", *bhost + ":" + *bport)
}
if err != nil {
fmt.Println("mqcon error:", err.Error())
ws.Close()
return
}
ws.PayloadType = websocket.BinaryFrame
bmqcon := bufio.NewReadWriter(bufio.NewReader(mqcon), bufio.NewWriter(mqcon))
bws := bufio.NewReadWriter(bufio.NewReader(ws), bufio.NewWriter(ws))
go func() {
for {
msg, err := mqtt.DecodeOneMessage(bmqcon, nil)
// fmt.Println("brok->", msg)
if err != nil {
mqcon.Close()
return
}
wbuffer := new(bytes.Buffer)
msg.Encode(wbuffer)
bws.Write(wbuffer.Bytes())
bws.Flush()
wbuffer.Truncate(wbuffer.Len())
}
}()
for {
msg, err := mqtt.DecodeOneMessage(bws, nil)
// fmt.Println("webs->", msg)
if err != nil {
ws.Close()
return
}
msg.Encode(bmqcon)
bmqcon.Flush()
}
}
func main() {
flag.Parse()
http.Handle("/mqtt", websocket.Handler(wshandler))
var err error
if *ws {
if *wscert == "" || *wskey == "" {
fmt.Println("-ws need a certificate and a key specified")
return
}
err = http.ListenAndServeTLS(":" + *wsport, *wscert, *wskey, nil)
} else {
err = http.ListenAndServe(":" + *wsport, nil)
}
if err != nil {
fmt.Println("ListenAndserve:", err)
return
}
}