mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-18 13:43:58 +00:00
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:
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user