From 139572f5221abd3f6ce1f0627982974ab3fa5531 Mon Sep 17 00:00:00 2001 From: xengineering Date: Sat, 21 Mar 2026 16:38:56 +0100 Subject: tools: websocket: Add connection set up / tear down This was validated by sniffing the communication with Wireshark. The following is executed: - TCP initial handshake - GET /rpc from tool - HTTP 101 Switching Protocols (to Websocket) from Shelly - ACK by tool - TCP connection close initiated by tool This shows that the tool is able to make Websocket connections. --- tools/websocket.go | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/tools/websocket.go b/tools/websocket.go index e429a6d..575bcd5 100644 --- a/tools/websocket.go +++ b/tools/websocket.go @@ -1,9 +1,47 @@ +// Websocket debug tool +// +// Usage: ./websocket-linux-amd64 ws:///rpc +// +// This tools is intended to support development of the Websocket-based +// application programming interface (API) of the Shelly Internet of Things +// (IoT) devices. + package main import ( - "fmt" + "log" + "net/url" + "os" + "os/signal" + + "github.com/gorilla/websocket" ) func main() { - fmt.Println("Websockets are cool.") + log.SetFlags(0) + + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + var u url.URL = getURL() + log.Printf("connecting to %s", u.String()) + + c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + if (err != nil) { + log.Fatal(err) + } + defer c.Close() +} + +func getURL() url.URL { + if (len(os.Args) != 2) { + log.Fatalf("Exactly one argument expected but got %d.", len(os.Args) - 1) + } + + maybeURL, err := url.Parse(os.Args[1]) + if (err != nil) { + log.Fatalf("Cannot parse given URL: %s", os.Args[1]) + } + + return *maybeURL } -- cgit v1.3