conn_manager.go 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package uhf
  2. import (
  3. "sync"
  4. "wails-app/internal/global"
  5. "go.uber.org/zap"
  6. )
  7. // ConnManager 全局多设备连接管理器(单例)
  8. var ConnManager = &connManager{
  9. connMap: make(map[string]UHFReaderConn), // key: DeviceCode
  10. }
  11. type connManager struct {
  12. mu sync.RWMutex // 读写锁,保证多协程安全
  13. connMap map[string]UHFReaderConn
  14. // 消息回调:设备收到数据后触发的处理函数(可自定义)
  15. recvCallback func(deviceCode string, data []byte)
  16. }
  17. // SetRecvCallback 设置全局消息接收回调
  18. func (m *connManager) SetRecvCallback(callback func(deviceCode string, data []byte)) {
  19. m.recvCallback = callback
  20. }
  21. // AddConn 添加设备连接(多设备核心:按DeviceCode存储)
  22. func (m *connManager) AddConn(deviceCode string, conn UHFReaderConn) {
  23. m.mu.Lock()
  24. defer m.mu.Unlock()
  25. m.connMap[deviceCode] = conn
  26. // 启动消息监听协程(异步接收设备数据)
  27. go m.listenDeviceData(deviceCode, conn)
  28. global.GVA_LOG.Info("UHF 设备已加入连接池", zap.String("device_code", deviceCode))
  29. }
  30. // GetConn 获取指定设备连接(多设备核心:按DeviceCode检索)
  31. func (m *connManager) GetConn(deviceCode string) (UHFReaderConn, bool) {
  32. m.mu.RLock()
  33. defer m.mu.RUnlock()
  34. conn, ok := m.connMap[deviceCode]
  35. return conn, ok
  36. }
  37. // GetAllConns 获取所有设备连接(批量操作)
  38. func (m *connManager) GetAllConns() map[string]UHFReaderConn {
  39. m.mu.RLock()
  40. defer m.mu.RUnlock()
  41. // 返回副本,避免外部修改原map
  42. copyMap := make(map[string]UHFReaderConn)
  43. for k, v := range m.connMap {
  44. copyMap[k] = v
  45. }
  46. return copyMap
  47. }
  48. // RemoveConn 移除设备连接
  49. func (m *connManager) RemoveConn(deviceCode string) {
  50. m.mu.Lock()
  51. defer m.mu.Unlock()
  52. delete(m.connMap, deviceCode)
  53. global.GVA_LOG.Info("UHF 设备已移出连接池", zap.String("device_code", deviceCode))
  54. }
  55. // listenDeviceData 异步监听设备数据(多设备消息接收核心)
  56. func (m *connManager) listenDeviceData(deviceCode string, conn UHFReaderConn) {
  57. for {
  58. // 检查连接是否有效
  59. if !conn.IsConnected() {
  60. global.GVA_LOG.Warn("UHF 设备连接已断开,停止监听", zap.String("device_code", deviceCode))
  61. // 更新数据库状态
  62. //var device dao.UHFReader
  63. global.GVA_DB.Where("device_code = ?", deviceCode).Update("status", "offline")
  64. return
  65. }
  66. // 阻塞读取设备数据(TCP/串口统一通过ReadData读取)
  67. data, err := conn.ReadData() // 新增ReadData接口方法
  68. if err != nil {
  69. global.GVA_LOG.Warn("UHF 设备读取数据失败", zap.String("device_code", deviceCode), zap.Error(err))
  70. continue
  71. }
  72. // 空数据跳过
  73. if len(data) == 0 {
  74. continue
  75. }
  76. global.GVA_LOG.Debug("UHF 设备收到数据帧", zap.String("device_code", deviceCode), zap.Int("bytes", len(data)), zap.ByteString("payload", data))
  77. // 触发回调处理数据(业务层自定义逻辑)
  78. if m.recvCallback != nil {
  79. m.recvCallback(deviceCode, data)
  80. }
  81. }
  82. }