websocket.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package controllers
  2. import (
  3. "Tech/common"
  4. "Tech/models"
  5. "fmt"
  6. "sync/atomic"
  7. "github.com/beego/beego/v2/client/orm"
  8. beego "github.com/beego/beego/v2/server/web"
  9. "github.com/gorilla/websocket"
  10. )
  11. // WebSocketController WebSocket处理器
  12. type WebSocketController struct {
  13. beego.Controller
  14. }
  15. var wsClientCounter int64
  16. // WebSocket处理连接
  17. func (c *WebSocketController) Handle() {
  18. // 升级HTTP连接到WebSocket
  19. conn, err := websocket.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil, 1024, 1024)
  20. if err != nil {
  21. c.Data["json"] = map[string]interface{}{
  22. "code": 500,
  23. "msg": "WebSocket连接升级失败: " + err.Error(),
  24. }
  25. c.ServeJSON()
  26. return
  27. }
  28. // 生成唯一的客户端ID
  29. clientID := fmt.Sprintf("ws_client_%d", atomic.AddInt64(&wsClientCounter, 1))
  30. // 注册WebSocket连接
  31. wsConn := common.GlobalWSManager.Register(clientID, conn)
  32. defer func() {
  33. common.GlobalWSManager.Unregister(clientID)
  34. }()
  35. // 获取最新的课程运行记录以获取线路号
  36. o := orm.NewOrm()
  37. var latestCourse models.CourseRunLog
  38. err = o.QueryTable(new(models.CourseRunLog)).
  39. OrderBy("-RunLogID").
  40. One(&latestCourse)
  41. lineID := 0
  42. if err == nil && err != orm.ErrNoRows {
  43. // 根据运行课程ID查询课程信息以获取线路号
  44. var courseInfo models.CourseInfo
  45. err = o.QueryTable(new(models.CourseInfo)).
  46. Filter("CourseID", latestCourse.RunCourseID).
  47. One(&courseInfo)
  48. if err == nil {
  49. lineID = courseInfo.LineNo
  50. }
  51. }
  52. // 发送连接成功消息
  53. wsConn.SendChan <- []byte(fmt.Sprintf(`{"event":"connected","data":{"clientID":"%s","message":"WebSocket连接已建立","lineID":%d}}`, clientID, lineID))
  54. // 立即发送所有缓存的设备数据(首次连接推送全量数据)
  55. common.SendCurrentDataToClient(clientID)
  56. // 读取客户端消息
  57. for {
  58. _, _, err := conn.ReadMessage()
  59. if err != nil {
  60. break
  61. }
  62. }
  63. }