espat: add ResolveUDPAddr and ResolveTCPAddr implementations using AT command for DNS lookup

Signed-off-by: Ron Evans <ron@hybridgroup.com>
This commit is contained in:
Ron Evans
2019-06-21 10:24:50 +02:00
parent a267fdb8ce
commit 9c88d1fab4
3 changed files with 62 additions and 1 deletions
+3
View File
@@ -85,6 +85,9 @@ const (
// Establish TCP connection or register UDP port // Establish TCP connection or register UDP port
TCPConnect = "+CIPSTART" TCPConnect = "+CIPSTART"
// DNS Lookup
TCPDNSLookup = "+CIPDOMAIN"
// Send Data // Send Data
TCPSend = "+CIPSEND" TCPSend = "+CIPSEND"
+46
View File
@@ -2,6 +2,7 @@ package espat
import ( import (
"strconv" "strconv"
"strings"
"time" "time"
) )
@@ -156,6 +157,51 @@ func (c *SerialConn) SetWriteDeadline(t time.Time) error {
return nil return nil
} }
// ResolveTCPAddr returns an address of TCP end point.
//
// The network must be a TCP network name.
//
func (d *Device) ResolveTCPAddr(network, address string) (*TCPAddr, error) {
// TODO: make sure network is 'tcp'
// separate domain from port, if any
r := strings.Split(address, ":")
ip, err := d.GetDNS(r[0])
if err != nil {
return nil, err
}
if len(r) > 1 {
port, e := strconv.Atoi(r[1])
if e != nil {
return nil, e
}
return &TCPAddr{IP: ip, Port: port}, nil
}
return &TCPAddr{IP: ip}, nil
}
// ResolveUDPAddr returns an address of UDP end point.
//
// The network must be a UDP network name.
//
func (d *Device) ResolveUDPAddr(network, address string) (*UDPAddr, error) {
// TODO: make sure network is 'udp'
// separate domain from port, if any
r := strings.Split(address, ":")
ip, err := d.GetDNS(r[0])
if err != nil {
return nil, err
}
if len(r) > 1 {
port, e := strconv.Atoi(r[1])
if e != nil {
return nil, e
}
return &UDPAddr{IP: ip, Port: port}, nil
}
return &UDPAddr{IP: ip}, nil
}
// The following definitions are here to support a Golang standard package // The following definitions are here to support a Golang standard package
// net-compatible interface for IP until TinyGo can compile the net package. // net-compatible interface for IP until TinyGo can compile the net package.
+13 -1
View File
@@ -15,11 +15,23 @@ const (
TCPTransferModeUnvarnished = 1 TCPTransferModeUnvarnished = 1
) )
// GetDNS returns the IP address for a domain name.
func (d *Device) GetDNS(domain string) (IP, error) {
d.Set(TCPDNSLookup, "\""+domain+"\"")
time.Sleep(1000 * time.Millisecond)
r := strings.Split(string(d.Response()), ":")
if len(r) != 2 {
return nil, errors.New("Invalid domain lookup result")
}
res := strings.Split(r[1], "\r\n")
return IP(res[0]), nil
}
// ConnectTCPSocket creates a new TCP socket connection for the ESP8266/ESP32. // ConnectTCPSocket creates a new TCP socket connection for the ESP8266/ESP32.
// Currently only supports single connection mode. // Currently only supports single connection mode.
func (d *Device) ConnectTCPSocket(addr, port string) error { func (d *Device) ConnectTCPSocket(addr, port string) error {
protocol := "TCP" protocol := "TCP"
val := "\"" + protocol + "\",\"" + addr + "\"," + port val := "\"" + protocol + "\",\"" + addr + "\"," + port + ",120"
d.Set(TCPConnect, val) d.Set(TCPConnect, val)
time.Sleep(1000 * time.Millisecond) time.Sleep(1000 * time.Millisecond)
r := d.Response() r := d.Response()