package WebSocketPanel import ( "Cold_Api/controllers/lib" "Cold_Api/logs" "Cold_Api/models/System" "container/list" "encoding/json" "fmt" beego "github.com/beego/beego/v2/server/web" "github.com/gorilla/websocket" "net/http" "sync" "time" ) // WebSocketController handles WebSocket requests. type WebSocketPanelController struct { beego.Controller } // 网关 -》服务端 json 通用模板 type Event_w struct { Type int // JOIN, LEAVE, MESSAGE Timestamp int // Unix timestamp (secs) Content interface{} } type Ms_Project struct { Cmd string `json:"Cmd"` Sn string `json:"Sn"` } // Event archives. var archive = list.New() type WsConn struct { Conn *websocket.Conn Mux sync.RWMutex } var ( countryCapitalMap map[string]WsConn /*创建集合 */ ) func Join_wc(user string, ws *websocket.Conn) bool { // 有先加入 给全部人发消息 _, ok := countryCapitalMap[user] /*如果确定是真实的,则存在,否则不存在 */ if ok { fmt.Println(user + " 重复") countryCapitalMap[user] = WsConn{Conn: ws} return true } else { fmt.Println(user + " 注册成功") countryCapitalMap[user] = WsConn{Conn: ws} return false } } func Leave(user string) { fmt.Println("注销:" + user) for k, _ := range lib.CountrySnMap_Panel { _, ok := lib.CountrySnMap_Panel[k].Uuid_list[user] if ok { fmt.Println("清楚成功 用户! KEY:",k," Uuid:",lib.CountrySnMap_Panel[k].Uuid_list[user]) delete(lib.CountrySnMap_Panel[k].Uuid_list, user) if(len(lib.CountrySnMap_Panel[k].Uuid_list) == 0){ fmt.Println("清楚成功 SN! KEY:",k) delete(lib.CountrySnMap_Panel, k) } } } delete(countryCapitalMap, user) } // This function handles all incoming chan messages. func chatroom() { countryCapitalMap = make(map[string]WsConn) } func init() { go chatroom() } // 连接 注册 Join method handles WebSocket requests for WebSocketController. func (this *WebSocketPanelController) Join() { // 验证登录 b_,admin_r := lib.Verification(this.Ctx.GetCookie("User_tokey"),this.GetString("User_tokey")) if(!b_){ this.Redirect("/", 302) return } // Upgrade from http request to WebSocket. ws, err := websocket.Upgrade(this.Ctx.ResponseWriter, this.Ctx.Request, nil, 1024, 1024) if _, ok := err.(websocket.HandshakeError); ok { http.Error(this.Ctx.ResponseWriter, "Not a WebSocketPanel handshake", 400) return } else if err != nil { fmt.Println("无法设置WebSocketPanel连接:", err) return } // Join chat room. is := Join_wc(admin_r.Admin_uuid, ws) if !is { defer Leave(admin_r.Admin_uuid) // 退后 会自动执行 time.Sleep(3 * time.Second) for { _, p, err := ws.ReadMessage() if err != nil { return } fmt.Println("============= WebSocketPanel JSON =============") fmt.Println(admin_r.Admin_uuid,"收到信息:",string(p)) var Ms_project Ms_Project err = json.Unmarshal(p, &Ms_project) if err != nil { System.Add_Logs("WebSocketPanel","JSON反序列化失败[Ms_Project]",string(p)) fmt.Println("JSON反序列化失败[Ms_Project],err=",err) return } //fmt.Println("Cmd:", Ms_project.Cmd) fmt.Println("Sn:", Ms_project.Sn) //Parameter.Read_DeviceParameter(admin_r.Admin_uuid,Ms_project.Sn) _, ok := lib.CountrySnMap_Panel[Ms_project.Sn] /*如果确定是真实的,则存在,否则不存在 */ if ok { }else { fmt.Println("CountrySnMap_Panel 没有,新建",Ms_project.Sn) lib.CountrySnMap_Panel[Ms_project.Sn] = lib.Cl_{ Uuid_list: make(map[string]string) , } } // 是否 有相同 用户 _, ok = lib.CountrySnMap_Panel[Ms_project.Sn].Uuid_list[admin_r.Admin_uuid] if ok { fmt.Println("用户重复 ",admin_r.Admin_uuid) data, _ := json.Marshal(lib.JSONS{Code: 201, Msg: "用户重复!",Data: admin_r.Admin_uuid}) Send_WebSocket(admin_r.Admin_uuid,string(data)) }else { fmt.Println("用户新建 ",admin_r.Admin_uuid) lib.CountrySnMap_Panel[Ms_project.Sn].Uuid_list[admin_r.Admin_uuid] = admin_r.Admin_uuid data, _ := json.Marshal(lib.JSONS{Code: 200, Msg: "ok!",Data: admin_r.Admin_uuid}) Send_WebSocket(admin_r.Admin_uuid,string(data)) } } }else { this.Redirect("/", 302) return } } /// ------------- --------------------------------------------- func Send_WebSocket(Admin_uuid string,T_json string) { defer func() { if err := recover(); err != nil { fmt.Println(err) logs.Println("Send_WebSocket ok err:!",err) System.Add_Logs("WebSocket", "Send_WebSocket Err", Admin_uuid+T_json) } }() ws, ok := countryCapitalMap[Admin_uuid] /*如果确定是真实的,则存在,否则不存在 */ if ok && ws.Conn != nil { ws.Mux.Lock() if ws.Conn.WriteMessage(websocket.TextMessage, []byte(T_json)) != nil { println("ok!") } ws.Mux.Unlock() } }