websocket-client

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/url"
    "sync"
    "time"

    "github.com/gorilla/websocket"
)

var mutex sync.Mutex

func main() {
    // u := url.URL{Scheme: "ws", Host: "8.136.204.163:8000"}
    u := url.URL{Scheme: "ws", Host: "localhost:8001"}
    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatalf("%+v", err)
    }
    defer c.Close()
    // c.SetCloseHandler(func(code int, text string) error {
    //     fmt.Printf("SetCloseHandler %d:%s", code, text)
    //     // message := websocket.FormatCloseMessage(code, "")
    //     // c.WriteControl(CloseMessage, message, time.Now().Add(writeWait))
    //     return nil
    // })
    // c.SetPingHandler(func(appData string) error {
    //     fmt.Printf("SetPingHandler %s", appData)
    //     return nil
    // })
    // c.SetPongHandler(func(appData string) error {
    //     fmt.Printf("SetPingHandler %s", appData)
    //     return nil
    // })

    pingParam := make(map[string]interface{})
    pingParam["msgId"] = 3
    pingParam["action"] = "Heartbeat"
    pingData := make(map[string]interface{})
    pingData["echo"] = "ping"
    pingParam["data"] = pingData

    param := make(map[string]interface{})
    param["msgId"] = 2
    param["action"] = "Login"
    data := make(map[string]interface{})
    data["authName"] = "taian"
    data["authToken"] = "7ee193f504125d7d9e715e0252648856"
    data["clientName"] = "taian123"
    param["data"] = data
    mutex.Lock()
    c.WriteJSON(param)
    mutex.Unlock()

    // res := make(map[string]interface{})
    // err1 := c.ReadJSON(&res)
    // if err1 != nil {
    //     fmt.Printf("%+v\n", err1)
    //     log.Fatalln(err1)
    // }
    // bs, _ := json.Marshal(res)
    // log.Printf("%s\n", string(bs))

    // mutex.Lock()
    // err0 := c.WriteJSON(pingParam)
    // mutex.Unlock()
    // if err0 != nil {
    //     log.Fatalf("写ping命令ERR:%+v\n", err1)
    // }

    // res = make(map[string]interface{})
    // err1 = c.ReadJSON(&res)
    // if err1 != nil {
    //     log.Fatalf("读ping命令ERR: %+v\n", err1)
    // }
    // bs, _ = json.Marshal(res)
    // log.Printf("%s\n", string(bs))

    go func() {
        t := time.NewTicker(time.Second * 4)
        defer t.Stop()
        for {
            <-t.C
            mutex.Lock()
            c.WriteJSON(pingParam)
            mutex.Unlock()
        }
    }()

    go func() {
        for {
            res := make(map[string]interface{})
            err1 := c.ReadJSON(&res)
            if err1 != nil {
                fmt.Printf("%+v\n", err1)
                continue
            }
            bs, _ := json.Marshal(res)
            log.Printf("%s\n", string(bs))
        }

    }()

    // param["action"] = "GetDevice"
    // data = make(map[string]interface{})
    // data["index"] = 1
    // data["count"] = -1

    param0 := make(map[string]interface{})
    param0["msgId"] = 4
    param0["action"] = "RegDeviceData"
    data0 := make(map[string]interface{})
    data0["names"] = []string{"S01"}
    data0["count"] = 1
    param0["data"] = data0

    mutex.Lock()
    err0 := c.WriteJSON(param0)
    mutex.Unlock()
    if err0 != nil {
        log.Fatalf("%+v", err0)
    }

    param1 := make(map[string]interface{})
    param1["msgId"] = 4
    param1["action"] = "GetRealDeviceData"
    data1 := make(map[string][]string)
    data1["names"] = []string{"S01"}
    param1["data"] = data1

    mutex.Lock()
    err1 := c.WriteJSON(param1)
    mutex.Unlock()
    if err1 != nil {
        log.Fatalf("%+v", err1)
    }
    select {}
}