mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-25 00:48:59 +00:00
Decoupled net package from espat
This commit is contained in:
@@ -24,6 +24,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Device wraps UART connection to the ESP8266/ESP32.
|
// Device wraps UART connection to the ESP8266/ESP32.
|
||||||
@@ -48,6 +50,7 @@ func New(b machine.UART) *Device {
|
|||||||
// Configure sets up the device for communication.
|
// Configure sets up the device for communication.
|
||||||
func (d Device) Configure() {
|
func (d Device) Configure() {
|
||||||
ActiveDevice = &d
|
ActiveDevice = &d
|
||||||
|
net.ActiveDevice = ActiveDevice
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connected checks if there is communication with the ESP8266/ESP32.
|
// Connected checks if there is communication with the ESP8266/ESP32.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/espat"
|
||||||
"tinygo.org/x/drivers/espat/net"
|
"tinygo.org/x/drivers/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// change actAsAP to true to act as an access point instead of connecting to one.
|
// change actAsAP to true to act as an access point instead of connecting to one.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/espat"
|
||||||
"tinygo.org/x/drivers/espat/net"
|
"tinygo.org/x/drivers/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// access point info
|
// access point info
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/espat"
|
||||||
"tinygo.org/x/drivers/espat/mqtt"
|
"tinygo.org/x/drivers/net/mqtt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// access point info
|
// access point info
|
||||||
@@ -64,7 +64,7 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := mqtt.NewClientOptions(adaptor)
|
opts := mqtt.NewClientOptions()
|
||||||
opts.AddBroker(server).SetClientID("tinygo-client-" + randomString(10))
|
opts.AddBroker(server).SetClientID("tinygo-client-" + randomString(10))
|
||||||
|
|
||||||
println("Connecting to MQTT broker at", server)
|
println("Connecting to MQTT broker at", server)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/espat"
|
||||||
"tinygo.org/x/drivers/espat/mqtt"
|
"tinygo.org/x/drivers/net/mqtt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// access point info
|
// access point info
|
||||||
@@ -72,7 +72,7 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := mqtt.NewClientOptions(adaptor)
|
opts := mqtt.NewClientOptions()
|
||||||
opts.AddBroker(server).SetClientID("tinygo-client-" + randomString(10))
|
opts.AddBroker(server).SetClientID("tinygo-client-" + randomString(10))
|
||||||
|
|
||||||
println("Connecting to MQTT broker at", server)
|
println("Connecting to MQTT broker at", server)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/espat"
|
||||||
"tinygo.org/x/drivers/espat/net"
|
"tinygo.org/x/drivers/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// access point info
|
// access point info
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package net
|
||||||
|
|
||||||
|
type DeviceDriver interface {
|
||||||
|
GetDNS(domain string) (string, error)
|
||||||
|
ConnectTCPSocket(addr, port string) error
|
||||||
|
ConnectSSLSocket(addr, port string) error
|
||||||
|
ConnectUDPSocket(addr, sendport, listenport string) error
|
||||||
|
DisconnectSocket() error
|
||||||
|
StartSocketSend(size int) error
|
||||||
|
Write(b []byte) (n int, err error)
|
||||||
|
ReadSocket(b []byte) (n int, err error)
|
||||||
|
IsSocketDataAvailable() bool
|
||||||
|
|
||||||
|
// FIXME: this is really specific to espat, and maybe shouldn't be part
|
||||||
|
// of the driver interface
|
||||||
|
Response(timeout int) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
var ActiveDevice DeviceDriver
|
||||||
|
|
||||||
|
func UseDriver(driver DeviceDriver) {
|
||||||
|
// TODO: rethink and refactor this
|
||||||
|
if ActiveDevice != nil {
|
||||||
|
panic("net.ActiveDevice is already set")
|
||||||
|
}
|
||||||
|
ActiveDevice = driver
|
||||||
|
}
|
||||||
@@ -8,9 +8,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/eclipse/paho.mqtt.golang/packets"
|
"github.com/eclipse/paho.mqtt.golang/packets"
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/net"
|
||||||
"tinygo.org/x/drivers/espat/net"
|
"tinygo.org/x/drivers/net/tls"
|
||||||
"tinygo.org/x/drivers/espat/tls"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewClient will create an MQTT v3.1.1 client with all of the options specified
|
// NewClient will create an MQTT v3.1.1 client with all of the options specified
|
||||||
@@ -24,7 +23,7 @@ func NewClient(o *ClientOptions) Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type mqttclient struct {
|
type mqttclient struct {
|
||||||
adaptor *espat.Device
|
adaptor net.DeviceDriver
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
connected bool
|
connected bool
|
||||||
opts *ClientOptions
|
opts *ClientOptions
|
||||||
@@ -297,7 +296,7 @@ func (c *mqttclient) ackFunc(packet *packets.PublishPacket) func() {
|
|||||||
// If there is no data yet but also is no error, it returns nil for both values.
|
// If there is no data yet but also is no error, it returns nil for both values.
|
||||||
func (c *mqttclient) ReadPacket() (packets.ControlPacket, error) {
|
func (c *mqttclient) ReadPacket() (packets.ControlPacket, error) {
|
||||||
// check for data first...
|
// check for data first...
|
||||||
if espat.ActiveDevice.IsSocketDataAvailable() {
|
if net.ActiveDevice.IsSocketDataAvailable() {
|
||||||
return packets.ReadPacket(c.conn)
|
return packets.ReadPacket(c.conn)
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@@ -25,7 +25,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/eclipse/paho.mqtt.golang/packets"
|
"github.com/eclipse/paho.mqtt.golang/packets"
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -175,7 +175,7 @@ type ClientOptionsReader struct {
|
|||||||
|
|
||||||
// ClientOptions contains configurable options for an MQTT Client.
|
// ClientOptions contains configurable options for an MQTT Client.
|
||||||
type ClientOptions struct {
|
type ClientOptions struct {
|
||||||
Adaptor *espat.Device
|
Adaptor net.DeviceDriver
|
||||||
|
|
||||||
//Servers []*url.URL
|
//Servers []*url.URL
|
||||||
Servers string
|
Servers string
|
||||||
@@ -209,8 +209,8 @@ type ClientOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewClientOptions returns a new ClientOptions struct.
|
// NewClientOptions returns a new ClientOptions struct.
|
||||||
func NewClientOptions(adaptor *espat.Device) *ClientOptions {
|
func NewClientOptions() *ClientOptions {
|
||||||
return &ClientOptions{Adaptor: adaptor, ProtocolVersion: 4}
|
return &ClientOptions{Adaptor: net.ActiveDevice, ProtocolVersion: 4}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddBroker adds a broker URI to the list of brokers to be used. The format should be
|
// AddBroker adds a broker URI to the list of brokers to be used. The format should be
|
||||||
@@ -256,3 +256,25 @@ func (o *ClientOptions) SetPassword(p string) *ClientOptions {
|
|||||||
o.Password = p
|
o.Password = p
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetWill accepts a string will message to be set. When the client connects,
|
||||||
|
// it will give this will message to the broker, which will then publish the
|
||||||
|
// provided payload (the will) to any clients that are subscribed to the provided
|
||||||
|
// topic.
|
||||||
|
func (o *ClientOptions) SetWill(topic string, payload string, qos byte, retained bool) *ClientOptions {
|
||||||
|
o.SetBinaryWill(topic, []byte(payload), qos, retained)
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetBinaryWill accepts a []byte will message to be set. When the client connects,
|
||||||
|
// it will give this will message to the broker, which will then publish the
|
||||||
|
// provided payload (the will) to any clients that are subscribed to the provided
|
||||||
|
// topic.
|
||||||
|
func (o *ClientOptions) SetBinaryWill(topic string, payload []byte, qos byte, retained bool) *ClientOptions {
|
||||||
|
o.WillEnabled = true
|
||||||
|
o.WillTopic = topic
|
||||||
|
o.WillPayload = payload
|
||||||
|
o.WillQos = qos
|
||||||
|
o.WillRetained = retained
|
||||||
|
return o
|
||||||
|
}
|
||||||
@@ -7,8 +7,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// DialUDP makes a UDP network connection. raadr is the port that the messages will
|
// DialUDP makes a UDP network connection. raadr is the port that the messages will
|
||||||
@@ -20,15 +18,15 @@ func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPSerialConn, error) {
|
|||||||
listenport := strconv.Itoa(laddr.Port)
|
listenport := strconv.Itoa(laddr.Port)
|
||||||
|
|
||||||
// disconnect any old socket
|
// disconnect any old socket
|
||||||
espat.ActiveDevice.DisconnectSocket()
|
ActiveDevice.DisconnectSocket()
|
||||||
|
|
||||||
// connect new socket
|
// connect new socket
|
||||||
err := espat.ActiveDevice.ConnectUDPSocket(addr, sendport, listenport)
|
err := ActiveDevice.ConnectUDPSocket(addr, sendport, listenport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &UDPSerialConn{SerialConn: SerialConn{Adaptor: espat.ActiveDevice}, laddr: laddr, raddr: raddr}, nil
|
return &UDPSerialConn{SerialConn: SerialConn{Adaptor: ActiveDevice}, laddr: laddr, raddr: raddr}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenUDP listens for UDP connections on the port listed in laddr.
|
// ListenUDP listens for UDP connections on the port listed in laddr.
|
||||||
@@ -38,15 +36,15 @@ func ListenUDP(network string, laddr *UDPAddr) (*UDPSerialConn, error) {
|
|||||||
listenport := strconv.Itoa(laddr.Port)
|
listenport := strconv.Itoa(laddr.Port)
|
||||||
|
|
||||||
// disconnect any old socket
|
// disconnect any old socket
|
||||||
espat.ActiveDevice.DisconnectSocket()
|
ActiveDevice.DisconnectSocket()
|
||||||
|
|
||||||
// connect new socket
|
// connect new socket
|
||||||
err := espat.ActiveDevice.ConnectUDPSocket(addr, sendport, listenport)
|
err := ActiveDevice.ConnectUDPSocket(addr, sendport, listenport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &UDPSerialConn{SerialConn: SerialConn{Adaptor: espat.ActiveDevice}, laddr: laddr}, nil
|
return &UDPSerialConn{SerialConn: SerialConn{Adaptor: ActiveDevice}, laddr: laddr}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialTCP makes a TCP network connection. raadr is the port that the messages will
|
// DialTCP makes a TCP network connection. raadr is the port that the messages will
|
||||||
@@ -57,15 +55,15 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPSerialConn, error) {
|
|||||||
sendport := strconv.Itoa(raddr.Port)
|
sendport := strconv.Itoa(raddr.Port)
|
||||||
|
|
||||||
// disconnect any old socket?
|
// disconnect any old socket?
|
||||||
//espat.ActiveDevice.DisconnectSocket()
|
//ActiveDevice.DisconnectSocket()
|
||||||
|
|
||||||
// connect new socket
|
// connect new socket
|
||||||
err := espat.ActiveDevice.ConnectTCPSocket(addr, sendport)
|
err := ActiveDevice.ConnectTCPSocket(addr, sendport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &TCPSerialConn{SerialConn: SerialConn{Adaptor: espat.ActiveDevice}, laddr: laddr, raddr: raddr}, nil
|
return &TCPSerialConn{SerialConn: SerialConn{Adaptor: ActiveDevice}, laddr: laddr, raddr: raddr}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial connects to the address on the named network.
|
// Dial connects to the address on the named network.
|
||||||
@@ -96,7 +94,7 @@ func Dial(network, address string) (Conn, error) {
|
|||||||
|
|
||||||
// SerialConn is a loosely net.Conn compatible implementation
|
// SerialConn is a loosely net.Conn compatible implementation
|
||||||
type SerialConn struct {
|
type SerialConn struct {
|
||||||
Adaptor *espat.Device
|
Adaptor DeviceDriver
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDPSerialConn is a loosely net.Conn compatible intended to support
|
// UDPSerialConn is a loosely net.Conn compatible intended to support
|
||||||
@@ -149,6 +147,7 @@ func (c *SerialConn) Write(b []byte) (n int, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
/* TODO(bcg): this is kind of specific to espat, should maybe refactor */
|
||||||
_, err = c.Adaptor.Response(1000)
|
_, err = c.Adaptor.Response(1000)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return n, err
|
return n, err
|
||||||
@@ -240,7 +239,7 @@ func ResolveTCPAddr(network, address string) (*TCPAddr, error) {
|
|||||||
// TODO: make sure network is 'tcp'
|
// TODO: make sure network is 'tcp'
|
||||||
// separate domain from port, if any
|
// separate domain from port, if any
|
||||||
r := strings.Split(address, ":")
|
r := strings.Split(address, ":")
|
||||||
addr, err := espat.ActiveDevice.GetDNS(r[0])
|
addr, err := ActiveDevice.GetDNS(r[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -263,7 +262,7 @@ func ResolveUDPAddr(network, address string) (*UDPAddr, error) {
|
|||||||
// TODO: make sure network is 'udp'
|
// TODO: make sure network is 'udp'
|
||||||
// separate domain from port, if any
|
// separate domain from port, if any
|
||||||
r := strings.Split(address, ":")
|
r := strings.Split(address, ":")
|
||||||
addr, err := espat.ActiveDevice.GetDNS(r[0])
|
addr, err := ActiveDevice.GetDNS(r[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -5,8 +5,7 @@ package tls
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"tinygo.org/x/drivers/espat"
|
"tinygo.org/x/drivers/net"
|
||||||
"tinygo.org/x/drivers/espat/net"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Dial makes a TLS network connection. It tries to provide a mostly compatible interface
|
// Dial makes a TLS network connection. It tries to provide a mostly compatible interface
|
||||||
@@ -22,15 +21,15 @@ func Dial(network, address string, config *Config) (*net.TCPSerialConn, error) {
|
|||||||
sendport := strconv.Itoa(raddr.Port)
|
sendport := strconv.Itoa(raddr.Port)
|
||||||
|
|
||||||
// disconnect any old socket
|
// disconnect any old socket
|
||||||
espat.ActiveDevice.DisconnectSocket()
|
net.ActiveDevice.DisconnectSocket()
|
||||||
|
|
||||||
// connect new socket
|
// connect new socket
|
||||||
err = espat.ActiveDevice.ConnectSSLSocket(addr, sendport)
|
err = net.ActiveDevice.ConnectSSLSocket(addr, sendport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return net.NewTCPSerialConn(net.SerialConn{Adaptor: espat.ActiveDevice}, nil, raddr), nil
|
return net.NewTCPSerialConn(net.SerialConn{Adaptor: net.ActiveDevice}, nil, raddr), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config is a placeholder for future compatibility with
|
// Config is a placeholder for future compatibility with
|
||||||
Reference in New Issue
Block a user