deviceMgr.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package tcp
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "net"
  6. "server/dao"
  7. "time"
  8. )
  9. var (
  10. Devices = make(map[string]*Device) // 存储连接的全局 map
  11. )
  12. type Device struct {
  13. Info dao.Screens
  14. Conn net.Conn
  15. LastTime time.Time
  16. }
  17. // 实例所有设备
  18. //func InitDevices() {
  19. // // 将数据库中的设备全部离线
  20. // devs, _ := deviceDao.QueryAllScreens()
  21. // for _, screen := range devs {
  22. // if screen.Status != 0 {
  23. // screen.Status = 0
  24. // now := time.Now()
  25. // screen.LastOfflineTime = &now
  26. // }
  27. // Devices[screen.Sn] = &Device{Info: screen}
  28. // }
  29. //}
  30. func (s *Device) Start(conn net.Conn) {
  31. s.Conn = conn
  32. go s.Process()
  33. }
  34. func (s *Device) Process() {
  35. // 函数执行完之后关闭连接
  36. defer s.Conn.Close()
  37. for {
  38. buf := make([]byte, 256)
  39. // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目
  40. n, err := s.Conn.Read(buf)
  41. if err != nil {
  42. // 从客户端读取数据的过程中发生错误 这里如果没读到可以视为设备离线了
  43. //logger.Error.Errorf("read from client failed [离线了], err:%v", err)
  44. break
  45. }
  46. data := hex.EncodeToString(buf[:n])
  47. fmt.Println("读取:", data)
  48. //if !strings.Contains(strings.ToLower(data), "fe5c4b89") {
  49. // continue
  50. //}
  51. //switch data[16:18] {
  52. //case "61":
  53. // // fe5c4b89 2a000000 62 00000000 17000000 31 23 32303233(年) 3035(月) 3135(日) 3031(星期) 3038(时) 3334(分) 3135(秒) 23 303630(心跳包时间) 23 ffff
  54. // //目前登录只做查找设备的操作 (假登录)
  55. // buffer := protocol.AuthDataPack{}.AuthLogin()
  56. // // 通过sn 查设备是否存在 不存在return 存在就保存con 和 info
  57. // _, err := deviceDao.QueryScreenBySn(data[34:50])
  58. // if errors.Is(err, gorm.ErrRecordNotFound) {
  59. // logger.Logger.Errorf("Process[case '61'] SN not found \n")
  60. // break
  61. // }
  62. // s.Conn.Write(buffer.Bytes())
  63. //case "91":
  64. // dev := Devices[data[34:50]]
  65. // if dev.Info.Status == 0 {
  66. // state := 1
  67. // //上线 则修改数据库上线时间
  68. // err := Dev.UpdateScreensStatusAndOnline(dev.Info.Sn, state)
  69. // if err != nil {
  70. // logger.Logger.Error("Process[case '91'] UpdateScreensStatusAndOnline err", zap.Error(err))
  71. // continue
  72. // }
  73. // dev.Info.Status = 1
  74. // now := time.Now()
  75. // dev.Info.LastOnlineTime = &now
  76. // logger.Logger.Debugf("设备 [%v] 上线", dev.Info.ScreensName) // 登录
  77. // }
  78. // dev.Conn = s.Conn
  79. // dev.LastTime = time.Now()
  80. // logger.Logger.Debugf("设备 [%v] 心跳", dev.Info.ScreensName)
  81. //default:
  82. // fmt.Println("读取:", data)
  83. //}
  84. }
  85. }
  86. //func IsOnline() {
  87. // t := time.NewTicker(1 * time.Minute) //每分钟
  88. // for {
  89. // select {
  90. // case <-t.C:
  91. // for _, device := range Devices {
  92. // //符合条件
  93. // if (time.Now().Add(-5*time.Minute).After(device.LastTime) || device.LastTime.IsZero()) && device.Info.Status != 0 {
  94. // //修改数据库和内存
  95. // //离线
  96. // state := 0
  97. // err := Dev.UpdateScreensStatusAndOffline(device.Info.Sn, state)
  98. // if err != nil {
  99. // logger.Logger.Error("[Handle] UpdateScreensStatus err", zap.Error(err))
  100. // continue
  101. // }
  102. // device.Info.Status = 0
  103. // now := time.Now()
  104. // device.Info.LastOfflineTime = &now
  105. // logger.Logger.Debugf("设备 [%v] 离线了...", device.Info.ScreensName)
  106. // }
  107. // }
  108. // }
  109. // }
  110. //}
  111. //func (s *Device) SwitchScreen(onOff int) error {
  112. // if s.Conn == nil {
  113. // return errors.New("connection is nil")
  114. // }
  115. // pack := protocol.SwitchDataPack{Type: 0x52} //熄屏
  116. // if onOff == 1 {
  117. // pack = protocol.SwitchDataPack{Type: 0x51} //亮屏
  118. // }
  119. // buf := pack.SwitchScreens() //获取开关屏指令
  120. // _, err := s.Conn.Write(buf.Bytes())
  121. // if err != nil {
  122. // logger.Logger.Errorf("SwitchScreen write failed, err:%v", err)
  123. // return err
  124. // }
  125. // return nil
  126. //}
  127. //
  128. //func (s *Device) SendInternalCode(content []promodel.InternalCodeContent) error {
  129. // if s.Conn == nil {
  130. // return errors.New("connection is nil")
  131. // }
  132. // pack := protocol.InternalCodeDataPack{}
  133. // //获取要写入连接的字节数组
  134. // buf := pack.SendInternalCode(content)
  135. // _, err := s.Conn.Write(buf.Bytes())
  136. // if err != nil {
  137. // logger.Logger.Errorf("SendInternalCode write failed, err:%v", err)
  138. // return err
  139. // }
  140. //
  141. // return nil
  142. //}
  143. //
  144. //func (s *Device) VoiceBroad(broad string) error {
  145. // if s.Conn == nil {
  146. // return errors.New("connection is nil")
  147. // }
  148. // pack := protocol.VoiceBroadDataPack{}
  149. // buf := pack.VoiceBroad(broad)
  150. // _, err := s.Conn.Write(buf.Bytes())
  151. // if err != nil {
  152. // logger.Logger.Errorf("VoiceBroad write failed, err:%v", err)
  153. // return err
  154. // }
  155. // return nil
  156. //}
  157. //
  158. //func (s *Device) SetBrightness(bright byte) error {
  159. // if s.Conn == nil {
  160. // return errors.New("connection is nil")
  161. // }
  162. // pack := protocol.SetBrightnessDataPack{}
  163. // buf := pack.SetBrightness(bright)
  164. // _, err := s.Conn.Write(buf.Bytes())
  165. // if err != nil {
  166. // logger.Logger.Errorf("SetBrightness write failed, err:%v", err)
  167. // return err
  168. // }
  169. // return nil
  170. //}
  171. //
  172. //func SwitchScreen(sn string, onOff int) error {
  173. // device := Devices[sn]
  174. // err := device.SwitchScreen(onOff)
  175. // if err != nil {
  176. // return err
  177. // }
  178. // return nil
  179. //}
  180. //
  181. //func SendInternalCode(sn string, content []promodel.InternalCodeContent) error {
  182. // device := Devices[sn]
  183. // err := device.SendInternalCode(content)
  184. // if err != nil {
  185. // return err
  186. // }
  187. // return nil
  188. //}
  189. //
  190. //func VoiceBroad(sn string, broad string) error {
  191. // device := Devices[sn]
  192. // err := device.VoiceBroad(broad)
  193. // if err != nil {
  194. // return err
  195. // }
  196. // return nil
  197. //}
  198. //
  199. //func SetBrightness(sn string, bright int) error {
  200. // device := Devices[sn]
  201. // err := device.SetBrightness(brightnessMap[bright])
  202. // if err != nil {
  203. // return err
  204. // }
  205. // return nil
  206. //}
  207. var brightnessMap = map[int]byte{
  208. 0: 0x19,
  209. 10: 0x18,
  210. 20: 0x16,
  211. 30: 0x14,
  212. 40: 0x12,
  213. 50: 0x10,
  214. 60: 0x08,
  215. 70: 0x06,
  216. 80: 0x04,
  217. 90: 0x02,
  218. 100: 0x00,
  219. }