common.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package network
  2. import (
  3. "fmt"
  4. "net"
  5. "time"
  6. )
  7. // Body 通过 defaultPool 分配 byte 数组
  8. func Body() (p []byte) {
  9. p = defaultPool.Get().([]byte)
  10. defaultPool.Put(p)
  11. return
  12. }
  13. // Dial 拨号. network 可选 NetTCP 或 NetUDP 表示使用 TCP 或 UDP 协议, address 为服务器地址
  14. func Dial(network, address string) (Client, error) {
  15. return DialTimout(network, address, DefaultDialTimout)
  16. }
  17. // DialTimout 拨号并指定超时时间
  18. func DialTimout(network, address string, timout time.Duration) (Client, error) {
  19. conn, err := net.DialTimeout(network, address, timout)
  20. if err != nil {
  21. return nil, err
  22. }
  23. switch network {
  24. case NetTCP:
  25. tc := new(TCPClient)
  26. tc.connected = true
  27. tc.conn = conn
  28. go tc.reconnecting()
  29. return tc, nil
  30. case NetUDP:
  31. panic("not implemented")
  32. default:
  33. panic(fmt.Sprintf("unsupported protocol: %s", network))
  34. }
  35. }
  36. // DialModbus 用于与 Modbus 服务器交互时使用. 需要重连功能时请使用 Dial 创建连接并使用 NewModbus 包装
  37. func DialModbus(address string) (Modbus, error) {
  38. conn, err := Dial(NetTCP, address)
  39. if err != nil {
  40. return nil, err
  41. }
  42. return NewModbus(conn), nil
  43. }
  44. // NewModbus 将 conn 包装为 Modbus 接口
  45. func NewModbus(conn Client) Modbus {
  46. return &modbusClient{conn: conn}
  47. }
  48. // DialModbusStatus 连接 address 并调用 msw 向连接发送数据. 需要重连功能时请使用 Dial 创建连接并使用 NewModbusStatus 包装
  49. func DialModbusStatus(address string, msw ModbusStatusWriter) (ModbusStatus, error) {
  50. conn, err := Dial(NetTCP, address)
  51. if err != nil {
  52. return nil, err
  53. }
  54. return NewModbusStatus(conn, msw), nil
  55. }
  56. // NewModbusStatus 每秒使用 msw 创建数据并发送至 client
  57. func NewModbusStatus(conn Client, msw ModbusStatusWriter) ModbusStatus {
  58. ms := new(modbusStatus)
  59. ms.connected = true
  60. ms.b = make([]byte, 0)
  61. ms.msw = msw
  62. ms.conn = conn
  63. go ms.getStatus()
  64. return ms
  65. }
  66. // WriteModbus 向 address 建立连接后写入 p 并读取返回数据, 然后关闭连接
  67. func WriteModbus(address string, p []byte) ([]byte, error) {
  68. conn, err := DialModbus(address)
  69. if err != nil {
  70. return nil, err
  71. }
  72. defer func() {
  73. _ = conn.Close()
  74. }()
  75. return conn.WriteRead(p)
  76. }