spliter.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package seller
  2. import (
  3. "Wine-Server/utils"
  4. "Wine-Server/utils/tables"
  5. "database/sql"
  6. "github.com/gin-gonic/gin"
  7. "github.com/gorilla/websocket"
  8. )
  9. func sellerConnected(seq string, conn *websocket.Conn) *tables.DeviceTable {
  10. device := tables.DeviceTable{Id: seq}
  11. err := device.Get()
  12. if err == sql.ErrNoRows { // insert new device
  13. err = device.Insert()
  14. if err != nil {
  15. utils.Logger.Println("new device join failed:", err)
  16. _ = conn.WriteJSON(utils.WsError("New device join failed"))
  17. return nil
  18. }
  19. _ = device.Get()
  20. } else { // update last time
  21. device.Last = utils.TimeNow()
  22. err = device.Update(utils.JsonType{"last": device.Last})
  23. if err != nil {
  24. utils.Logger.Println("update last active time failed:", err)
  25. _ = conn.WriteJSON(utils.WsError("Update last active time failed"))
  26. return nil
  27. }
  28. }
  29. exist := false
  30. utils.SellerLock.Lock()
  31. if pointer, sin := utils.SellerDevices[seq]; sin {
  32. pointer.Online = true
  33. exist = true
  34. pointer.Conn = conn
  35. } else {
  36. utils.SellerDevices[seq] = &utils.SellerDevice{Online: true, Conn: conn}
  37. }
  38. utils.SellerLock.Unlock()
  39. if exist {
  40. for _, debugger := range utils.DebugWss {
  41. _ = debugger.WriteJSON(utils.WsEvent("deviceStatusChange", utils.JsonType{"seq": seq, "online": true}))
  42. }
  43. } else {
  44. for _, debugger := range utils.DebugWss {
  45. _ = debugger.WriteJSON(utils.WsEvent("newDevice", utils.JsonType{
  46. "seq": seq, "online": true, "location": device.Addr,
  47. "ppv1": device.Wines[0].Ppv, "ppv2": device.Wines[1].Ppv,
  48. "ppv3": device.Wines[2].Ppv, "ppv4": device.Wines[3].Ppv,
  49. }))
  50. }
  51. }
  52. utils.Logger.Printf("device[%s] connected\n", seq)
  53. return &device
  54. }
  55. func sellerDisconnect(seq string) {
  56. utils.SellerLock.Lock()
  57. utils.SellerDevices[seq].Online = false
  58. utils.SellerLock.Unlock()
  59. for _, debugger := range utils.DebugWss {
  60. _ = debugger.WriteJSON(utils.WsEvent("deviceStatusChange", utils.JsonType{"seq": seq, "online": false}))
  61. }
  62. utils.Logger.Printf("device[%s] disconnected\n", seq)
  63. }
  64. func SocketHandler(ctx *gin.Context) {
  65. conn, err := utils.UpgradeHttp2Ws.Upgrade(ctx.Writer, ctx.Request, nil)
  66. if err != nil {
  67. utils.Logger.Println("can't establish seller socket connect")
  68. ctx.JSON(utils.HttpError, utils.Fail("can't establish socket connect"))
  69. return
  70. }
  71. seq := ctx.Param("seq")
  72. if seq == "" {
  73. _ = conn.WriteJSON(utils.WsError("device seq is required"))
  74. return
  75. }
  76. device := sellerConnected(seq, conn)
  77. if device == nil {
  78. sellerDisconnect(seq)
  79. return
  80. }
  81. infoOfDevice(device, conn)
  82. for {
  83. var msg utils.WsMsg
  84. err = conn.ReadJSON(&msg)
  85. if err != nil {
  86. sellerDisconnect(seq)
  87. return
  88. }
  89. switch msg.Event {
  90. case "pin":
  91. keepAlive(conn, msg.Data)
  92. break
  93. case "getQrcode":
  94. getQrcode(device, conn, msg.Data)
  95. break
  96. case "checkAuthCode":
  97. checkAuthCode(device.Id, conn, msg.Data)
  98. break
  99. case "openResult":
  100. openResult(conn, msg.Data)
  101. break
  102. case "workFinished":
  103. workFinished(conn, msg.Data)
  104. break
  105. default:
  106. _ = conn.WriteJSON(utils.WsError("unrecognized event"))
  107. break
  108. }
  109. }
  110. }