conn_manager.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package parking
  2. import (
  3. "log"
  4. "wails-app/internal/global"
  5. "sync"
  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. log.Printf("设备[%s]已加入连接池", 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. log.Printf("设备[%s]已移出连接池", deviceCode)
  54. }
  55. // listenDeviceData 异步监听设备数据(多设备消息接收核心)
  56. func (m *connManager) listenDeviceData(deviceCode string, conn UHFReaderConn) {
  57. for {
  58. // 检查连接是否有效
  59. if !conn.IsConnected() {
  60. log.Printf("设备[%s]连接已断开,停止监听", 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. log.Printf("设备[%s]读取数据失败:%v", deviceCode, err)
  70. continue
  71. }
  72. // 空数据跳过
  73. if len(data) == 0 {
  74. continue
  75. }
  76. log.Printf("设备[%s]收到数据:%x", deviceCode, data)
  77. // 触发回调处理数据(业务层自定义逻辑)
  78. if m.recvCallback != nil {
  79. m.recvCallback(deviceCode, data)
  80. }
  81. }
  82. }