// 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 ( "log" "net/url" "os" "os/signal" "syscall" "github.com/gorilla/websocket" ) func main() { 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() go func() { for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() getConfig(c) Await(syscall.SIGTERM, syscall.SIGINT) } 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 } func Await(signals ...os.Signal) { listener := make(chan os.Signal, 1) signal.Notify(listener, signals...) defer signal.Stop(listener) sig := <-listener log.Printf("Received OS signal '%v'\n", sig) } func getConfig(c *websocket.Conn) { request := ` { "jsonrpc":"2.0", "id": 1, "src":"user_1", "method":"Sys.GetConfig", "params": { "id":2 } } ` err := c.WriteMessage(websocket.TextMessage, []byte(request)) if err != nil { log.Fatal(err) } }