diff --git a/dao/user.go b/dao/user.go index bce57da..5f171be 100644 --- a/dao/user.go +++ b/dao/user.go @@ -13,6 +13,7 @@ type User struct { Email string `gorm:"column:email"` Password string `gorm:"column:password"` Gender string `gorm:"column:gender"` + Role string `gorm:"column:role"` CreateTime string `gorm:"column:create_time"` UpdateTime string `gorm:"column:update_time"` } diff --git a/handler/device.go b/handler/device.go index ff84b36..bb66c47 100644 --- a/handler/device.go +++ b/handler/device.go @@ -1,11 +1,16 @@ package handler import ( + "encoding/json" "fmt" "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" "net/http" + "strconv" + "time" "videoplayer/proto" "videoplayer/service" + "videoplayer/worker" ) type DeviceAddReq struct { @@ -199,3 +204,64 @@ func Restart(ip string) bool { } return false } + +// 接收及发送消息 +func GetRealTimeImage(c *gin.Context) { + id, _ := c.Get("id") + id1 := int(id.(float64)) + device_id := c.Query("device_id") + //字符串转int + device_id_int, _ := strconv.Atoi(device_id) + device := service.GetDevice(device_id_int, id1) + if device.ID == 0 { + c.JSON(http.StatusOK, gin.H{"code": proto.DataNotFound, "message": "device not found"}) + return + } + //建立连接 + // 升级HTTP连接为WebSocket连接 + ws, err := upgrader.Upgrade(c.Writer, c.Request, nil) + clients[ws] = true + if err != nil { + // log.Println(err) + fmt.Println(err) + return + } + defer ws.Close() + worker.SetRedisWithExpire(strconv.Itoa(int(device.ID))+"_is_play", "1", time.Minute*5) //设置播放状态 + // 接收客户端消息并发送到指定用户 + + go func(ws *websocket.Conn, device_id int) { + + }(ws, device_id_int) + + for { + if v := clients[ws]; v == true { + res2 := worker.PopRedisListLeft(device_id + "_frames") + var res3 []byte + var msg proto.Message + if res2 != "" { + //若有消息则发送消息 + msg.Type = "img" + msg.Msg = res2 + msg.From_user_id = id1 + res3, _ = json.Marshal(msg) + } else { + //若无消息则发送心跳包 + msg.Type = "check" + msg.Msg = "check" + msg.From_user_id = -1 + res3, _ = json.Marshal(msg) + } + err2 := ws.WriteMessage(websocket.TextMessage, res3) + if err2 != nil { + clientsMux.Lock() + clients[ws] = false + clientsMux.Unlock() + //设置ws关闭状态信息 + worker.SetRedisWithExpire(strconv.Itoa(int(device.ID))+"_is_play", "0", time.Minute*5) //设置播放状态 + break + } + time.Sleep(time.Millisecond * 100) //设置延时100ms + } + } +}