videoplayer/handler/device.go

268 lines
7.3 KiB
Go
Raw Normal View History

package handler
import (
2024-07-12 11:34:24 +08:00
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
2024-07-12 11:34:24 +08:00
"github.com/gorilla/websocket"
"net/http"
2024-07-12 11:34:24 +08:00
"strconv"
"time"
"videoplayer/proto"
"videoplayer/service"
2024-07-12 11:34:24 +08:00
"videoplayer/worker"
)
2024-05-20 11:16:53 +08:00
type DeviceAddReq struct {
2024-07-02 15:18:23 +08:00
DeviceName string `json:"device_name" form:"device_name"`
DeviceIP string `json:"device_ip" form:"device_ip"`
DeviceStatus string `json:"device_status" form:"device_status"`
AuthID int `json:"auth_id" form:"auth_id"`
DeviceInfo string `json:"device_info" form:"device_info"`
DeviceType string `json:"device_type" form:"device_type"`
DeviceLocation string `json:"device_location" form:"device_location"`
2024-05-20 11:16:53 +08:00
}
type DeviceUpdateReq struct {
ID int `json:"id" form:"id"`
2024-07-02 15:18:23 +08:00
DeviceName string `json:"device_name" form:"device_name" `
DeviceIP string `json:"device_ip" form:"device_ip" `
DeviceStatus string `json:"device_status" form:"device_status" `
AuthID int `json:"auth_id" form:"auth_id" `
DeviceInfo string `json:"device_info" form:"device_info" `
DeviceType string `json:"device_type" form:"device_type" `
DeviceLocation string `json:"device_location" form:"device_location" `
}
2024-05-20 11:16:53 +08:00
type DeviceStatus struct {
2024-07-02 15:18:23 +08:00
IP string `json:"ip" form:"ip" `
Status string `json:"status" form:"status" `
ID int `json:"id" form:"id" `
2024-05-20 11:16:53 +08:00
}
type DeviceDelReq struct {
2024-07-02 15:18:23 +08:00
ID int `json:"id" form:"id" `
}
type DeviceRestartReq struct {
2024-07-02 15:18:23 +08:00
ID int `json:"id" form:"id" `
Option string `json:"option" form:"option" `
}
func SetUpDeviceGroup(router *gin.Engine) {
2024-05-20 11:16:53 +08:00
deviceGroup := router.Group("/device")
deviceGroup.POST("/get_device_list", GetDeviceList)
deviceGroup.POST("/restart", RestartDevice)
deviceGroup.POST("/add_device", AddDevice)
deviceGroup.POST("/set_device_status", SetDeviceStatus)
deviceGroup.POST("/update_device", UpdateDevice)
deviceGroup.POST("/delete_device", DeleteDevice)
2024-05-20 11:16:53 +08:00
}
func DeleteDevice(c *gin.Context) {
id, _ := c.Get("id")
//获取post参数
var req DeviceDelReq
2024-07-02 15:18:23 +08:00
if err := c.ShouldBind(&req); err == nil {
if service.DeleteDevice(req.ID, int(id.(float64))) {
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success"})
} else {
c.JSON(200, gin.H{"code": proto.OperationFailed, "message": "failed"})
}
} else {
c.JSON(200, gin.H{"code": proto.ParameterError, "message": "failed"})
}
}
func UpdateDevice(c *gin.Context) {
var req DeviceUpdateReq
user_id, _ := c.Get("id")
2024-07-02 15:18:23 +08:00
if err := c.ShouldBind(&req); err == nil {
res := service.UpdateDevice(req.DeviceName, req.DeviceIP, req.DeviceStatus, req.DeviceInfo, req.DeviceType, req.DeviceLocation, req.ID, int(user_id.(float64)))
if res {
c.JSON(200, gin.H{
"code": 0,
"message": "success",
})
} else {
c.JSON(200, gin.H{
"code": proto.DeviceUpdateFailed,
"message": "failed",
})
}
} else {
c.JSON(200, gin.H{
"code": proto.ParameterError,
"message": "failed",
})
}
}
2024-05-20 11:16:53 +08:00
func SetDeviceStatus(c *gin.Context) {
var req DeviceStatus
id, _ := c.Get("id")
2024-07-02 15:18:23 +08:00
if err := c.ShouldBind(&req); err == nil {
2024-05-20 11:16:53 +08:00
if req.IP != "" {
if service.SetDeviceStatus(req.Status, req.ID, int(id.(float64))) {
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success"})
2024-05-20 11:16:53 +08:00
} else {
c.JSON(200, gin.H{"code": 1, "message": "failed"})
2024-05-20 11:16:53 +08:00
}
}
} else {
c.JSON(200, gin.H{"code": proto.ParameterError, "message": "failed", "data": err.Error()})
2024-05-20 11:16:53 +08:00
}
}
func AddDevice(c *gin.Context) {
var req DeviceAddReq
id, _ := c.Get("id")
2024-07-02 15:18:23 +08:00
if err := c.ShouldBind(&req); err == nil {
user_id := int(id.(float64))
fmt.Println(req)
2024-05-20 11:16:53 +08:00
device_id := service.AddDevice(req.DeviceName, req.DeviceIP, req.DeviceStatus, req.DeviceInfo, req.DeviceType, req.DeviceLocation, user_id)
if device_id != 0 {
c.JSON(200, gin.H{
"code": proto.SuccessCode,
"message": "success",
"data": device_id,
2024-05-20 11:16:53 +08:00
})
} else {
c.JSON(200, gin.H{
"code": proto.DeviceAddFailed,
2024-05-20 11:16:53 +08:00
"message": "failed",
"data": "device add failed",
2024-05-20 11:16:53 +08:00
})
}
} else {
c.JSON(200, gin.H{
"code": proto.ParameterError,
2024-05-20 11:16:53 +08:00
"message": "failed",
"data": err.Error(),
2024-05-20 11:16:53 +08:00
})
}
}
func GetDeviceList(c *gin.Context) {
id, _ := c.Get("id")
devices := service.GetDeviceList(int(id.(float64)))
c.JSON(200, gin.H{
"code": proto.SuccessCode,
"message": "success",
2024-06-11 15:27:33 +08:00
"data": devices,
})
}
func RestartDevice(c *gin.Context) {
user_id, _ := c.Get("id")
var req DeviceRestartReq
2024-06-11 15:27:33 +08:00
if err := c.ShouldBind(&req); err != nil {
c.JSON(200, gin.H{"code": proto.ParameterError, "message": "failed", "data": err.Error()})
2024-06-11 15:27:33 +08:00
return
}
device_id := req.ID
if req.Option == "one" {
device := service.GetDevice(device_id, int(user_id.(float64)))
if device.ID != 0 {
if device.DeviceIP != "" {
if Restart(device.DeviceIP) {
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success"})
} else {
c.JSON(200, gin.H{"code": proto.DeviceRestartFailed, "message": "failed"})
}
}
} else {
c.JSON(200, gin.H{"code": proto.DataNotFound, "message": "failed", "data": string(device_id) + ": device not found"})
}
} else if req.Option == "all" {
devices := service.GetDeviceList(int(user_id.(float64)))
if len(devices) > 0 {
for _, device := range devices {
if device.DeviceIP != "" {
if !Restart(device.DeviceIP) {
c.JSON(200, gin.H{"code": proto.DeviceRestartFailed, "message": "failed"})
return
}
}
}
} else {
c.JSON(200, gin.H{"code": proto.DataNotFound, "message": "failed", "data": "device not found"})
}
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success"})
}
}
func Restart(ip string) bool {
url := "http://" + ip + "/restart"
resp, err := http.Get(url)
if err != nil {
return false
}
defer resp.Body.Close()
if resp.StatusCode == 200 {
return true
}
return false
}
2024-07-12 11:34:24 +08:00
// 接收及发送消息
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
}
}
}