| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | package networkimport (	"fmt"	"net")// Body 通过 defaultPool 分配 byte 数组func Body() (p []byte) {	p = defaultPool.Get().([]byte)	defaultPool.Put(p)	return}// Dial 拨号. network 可选 NetTCP 或 NetUDP 表示使用 TCP 或 UDP 协议, address 为服务器地址func Dial(network, address string) (Client, error) {	conn, err := net.DialTimeout(network, address, DefaultDialTimout)	if err != nil {		return nil, err	}	switch network {	case NetTCP:		tc := new(TCPClient)		tc.connected = true		tc.conn = conn		go tc.reconnecting()		return tc, nil	case NetUDP:		panic("not implemented")	default:		panic(fmt.Sprintf("unsupported protocol: %s", network))	}}// DialModbus 用于与 Modbus 服务器交互时使用. 需要重连功能时请使用 Dial 创建连接并使用 NewModbus 包装func DialModbus(address string) (Modbus, error) {	conn, err := Dial(NetTCP, address)	if err != nil {		return nil, err	}	return NewModbus(conn), nil}// NewModbus 将 conn 包装为 Modbus 接口func NewModbus(conn Client) Modbus {	return &ModbusClient{conn: conn}}// DialModbusStatus 连接 address 并调用 msw 向连接发送数据. 需要重连功能时请使用 Dial 创建连接并使用 NewModbusStatus 包装func DialModbusStatus(address string, msw ModbusStatusWriter) (ModbusStatus, error) {	conn, err := Dial(NetTCP, address)	if err != nil {		return nil, err	}	return NewModbusStatus(conn, msw), nil}// NewModbusStatus 每秒使用 msw 创建数据并发送至 clientfunc NewModbusStatus(conn Client, msw ModbusStatusWriter) ModbusStatus {	ms := new(modbusStatus)	ms.connected = true	ms.b = make([]byte, 0)	ms.msw = msw	ms.conn = conn	go ms.getStatus()	return ms}// WriteModbus 向 address 建立连接后写入 p 并读取返回数据, 然后关闭连接func WriteModbus(address string, p []byte) ([]byte, error) {	conn, err := DialModbus(address)	if err != nil {		return nil, err	}	defer func() {		_ = conn.Close()	}()	return conn.WriteRead(p)}
 |