mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
148 lines
3.8 KiB
Go
148 lines
3.8 KiB
Go
package espat
|
|
|
|
import (
|
|
"errors"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
TCPMuxSingle = 0
|
|
TCPMuxMultiple = 1
|
|
|
|
TCPTransferModeNormal = 0
|
|
TCPTransferModeUnvarnished = 1
|
|
)
|
|
|
|
// GetDNS returns the IP address for a domain name.
|
|
func (d *Device) GetDNS(domain string) (string, error) {
|
|
d.Set(TCPDNSLookup, "\""+domain+"\"")
|
|
resp, err := d.Response(1000)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if !strings.Contains(string(resp), ":") {
|
|
return "", errors.New("GetDNS error:" + string(resp))
|
|
}
|
|
r := strings.Split(string(resp), ":")
|
|
if len(r) != 2 {
|
|
return "", errors.New("Invalid domain lookup result")
|
|
}
|
|
res := strings.Split(r[1], "\r\n")
|
|
return strings.Trim(res[0], `"`), nil
|
|
}
|
|
|
|
// ConnectTCPSocket creates a new TCP socket connection for the ESP8266/ESP32.
|
|
// Currently only supports single connection mode.
|
|
func (d *Device) ConnectTCPSocket(addr, port string) error {
|
|
protocol := "TCP"
|
|
val := "\"" + protocol + "\",\"" + addr + "\"," + port + ",120"
|
|
err := d.Set(TCPConnect, val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, e := d.Response(3000)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ConnectUDPSocket creates a new UDP connection for the ESP8266/ESP32.
|
|
func (d *Device) ConnectUDPSocket(addr, sendport, listenport string) error {
|
|
protocol := "UDP"
|
|
val := "\"" + protocol + "\",\"" + addr + "\"," + sendport + "," + listenport + ",0"
|
|
err := d.Set(TCPConnect, val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, e := d.Response(3000)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ConnectSSLSocket creates a new SSL socket connection for the ESP8266/ESP32.
|
|
// Currently only supports single connection mode.
|
|
func (d *Device) ConnectSSLSocket(addr, port string) error {
|
|
protocol := "SSL"
|
|
val := "\"" + protocol + "\",\"" + addr + "\"," + port + ",120"
|
|
d.Set(TCPConnect, val)
|
|
// this operation takes longer, so wait up to 6 seconds to complete.
|
|
_, err := d.Response(6000)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DisconnectSocket disconnects the ESP8266/ESP32 from the current TCP/UDP connection.
|
|
func (d *Device) DisconnectSocket() error {
|
|
err := d.Execute(TCPClose)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, e := d.Response(pause)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetMux sets the ESP8266/ESP32 current client TCP/UDP configuration for concurrent connections
|
|
// either single TCPMuxSingle or multiple TCPMuxMultiple (up to 4).
|
|
func (d *Device) SetMux(mode int) error {
|
|
val := strconv.Itoa(mode)
|
|
d.Set(TCPMultiple, val)
|
|
_, err := d.Response(pause)
|
|
return err
|
|
}
|
|
|
|
// GetMux returns the ESP8266/ESP32 current client TCP/UDP configuration for concurrent connections.
|
|
func (d *Device) GetMux() ([]byte, error) {
|
|
d.Query(TCPMultiple)
|
|
return d.Response(pause)
|
|
}
|
|
|
|
// SetTCPTransferMode sets the ESP8266/ESP32 current client TCP/UDP transfer mode.
|
|
// Either TCPTransferModeNormal or TCPTransferModeUnvarnished.
|
|
func (d *Device) SetTCPTransferMode(mode int) error {
|
|
val := strconv.Itoa(mode)
|
|
d.Set(TransmissionMode, val)
|
|
_, err := d.Response(pause)
|
|
return err
|
|
}
|
|
|
|
// GetTCPTransferMode returns the ESP8266/ESP32 current client TCP/UDP transfer mode.
|
|
func (d *Device) GetTCPTransferMode() ([]byte, error) {
|
|
d.Query(TransmissionMode)
|
|
return d.Response(pause)
|
|
}
|
|
|
|
// StartSocketSend gets the ESP8266/ESP32 ready to receive TCP/UDP socket data.
|
|
func (d *Device) StartSocketSend(size int) error {
|
|
val := strconv.Itoa(size)
|
|
d.Set(TCPSend, val)
|
|
|
|
// when ">" is received, it indicates
|
|
// ready to receive data
|
|
r, err := d.Response(2000)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if strings.Contains(string(r), ">") {
|
|
return nil
|
|
}
|
|
return errors.New("StartSocketSend error:" + string(r))
|
|
}
|
|
|
|
// EndSocketSend tell the ESP8266/ESP32 the TCP/UDP socket data sending is complete,
|
|
// and to return to command mode. This is only used in "unvarnished" raw mode.
|
|
func (d *Device) EndSocketSend() error {
|
|
d.Write([]byte("+++"))
|
|
|
|
_, err := d.Response(pause)
|
|
return err
|
|
}
|