Skip to content

Commit

Permalink
espat: add ResolveUDPAddr and ResolveTCPAddr implementations using AT…
Browse files Browse the repository at this point in the history
… command for DNS lookup

Signed-off-by: Ron Evans <[email protected]>
  • Loading branch information
deadprogram committed Jul 15, 2019
1 parent a267fdb commit 9c88d1f
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
3 changes: 3 additions & 0 deletions espat/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ const (
// Establish TCP connection or register UDP port
TCPConnect = "+CIPSTART"

// DNS Lookup
TCPDNSLookup = "+CIPDOMAIN"

// Send Data
TCPSend = "+CIPSEND"

Expand Down
46 changes: 46 additions & 0 deletions espat/net.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package espat

import (
"strconv"
"strings"
"time"
)

Expand Down Expand Up @@ -156,6 +157,51 @@ func (c *SerialConn) SetWriteDeadline(t time.Time) error {
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
// net-compatible interface for IP until TinyGo can compile the net package.

Expand Down
14 changes: 13 additions & 1 deletion espat/tcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,23 @@ const (
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.
// Currently only supports single connection mode.
func (d *Device) ConnectTCPSocket(addr, port string) error {
protocol := "TCP"
val := "\"" + protocol + "\",\"" + addr + "\"," + port
val := "\"" + protocol + "\",\"" + addr + "\"," + port + ",120"
d.Set(TCPConnect, val)
time.Sleep(1000 * time.Millisecond)
r := d.Response()
Expand Down

0 comments on commit 9c88d1f

Please sign in to comment.