tcp_reader.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package uhf
  2. import (
  3. "errors"
  4. "net"
  5. "time"
  6. )
  7. type TCPReader struct {
  8. IP string
  9. Port int
  10. conn net.Conn
  11. isConnected bool
  12. readBufSize int // 读取缓冲区大小
  13. }
  14. // 初始化时设置默认缓冲区
  15. func NewTCPReader(ip string, port int) *TCPReader {
  16. return &TCPReader{
  17. IP: ip,
  18. Port: port,
  19. readBufSize: 1024, // 默认1K缓冲区
  20. }
  21. }
  22. // Connect 建立TCP连接(原有逻辑不变)
  23. func (t *TCPReader) Connect() error {
  24. addr := net.JoinHostPort(t.IP, string(rune(t.Port)))
  25. conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
  26. if err != nil {
  27. t.isConnected = false
  28. return err
  29. }
  30. t.conn = conn
  31. t.isConnected = true
  32. return nil
  33. }
  34. // Disconnect 断开连接(原有逻辑不变)
  35. func (t *TCPReader) Disconnect() error {
  36. if t.conn != nil {
  37. err := t.conn.Close()
  38. t.isConnected = false
  39. return err
  40. }
  41. return nil
  42. }
  43. // IsConnected 检查状态(原有逻辑不变)
  44. func (t *TCPReader) IsConnected() bool {
  45. return t.isConnected
  46. }
  47. // SendData 仅发送数据(多设备批量发送用)
  48. func (t *TCPReader) SendData(data []byte) error {
  49. if !t.isConnected {
  50. return errors.New("TCP连接未建立")
  51. }
  52. _, err := t.conn.Write(data)
  53. return err
  54. }
  55. // ReadData 阻塞读取TCP数据(多设备监听用)
  56. func (t *TCPReader) ReadData() ([]byte, error) {
  57. if !t.isConnected {
  58. return nil, errors.New("TCP连接未建立")
  59. }
  60. buf := make([]byte, t.readBufSize)
  61. n, err := t.conn.Read(buf)
  62. if err != nil {
  63. t.isConnected = false // 读失败标记为断开
  64. return nil, err
  65. }
  66. return buf[:n], nil
  67. }
  68. // SendAndRecv 发送并等待响应(一问一答,多设备指令交互用)
  69. func (t *TCPReader) SendAndRecv(data []byte) ([]byte, error) {
  70. if err := t.SendData(data); err != nil {
  71. return nil, err
  72. }
  73. // 设置读超时,避免永久阻塞
  74. t.conn.SetReadDeadline(time.Now().Add(3 * time.Second))
  75. defer t.conn.SetReadDeadline(time.Time{}) // 恢复默认
  76. return t.ReadData()
  77. }