From d8c813d51550f1eaa3bf49c2f346dd0811fb1a5c Mon Sep 17 00:00:00 2001 From: deadprogram Date: Wed, 12 Jan 2022 20:42:41 +0100 Subject: [PATCH] wifi/espat, rtl8720dn, wifinina: move towards standard common interface for wifi adaptors Signed-off-by: deadprogram --- espat/wifidriver.go | 19 ++++++++++++++ examples/espat/espconsole/main.go | 4 ++- examples/espat/esphub/main.go | 4 ++- examples/espat/espstation/main.go | 4 ++- examples/espat/mqttclient/main.go | 4 ++- examples/espat/mqttsub/main.go | 4 ++- examples/espat/tcpclient/main.go | 4 ++- examples/rtl8720dn/mqttclient/main.go | 2 +- examples/rtl8720dn/mqttsub/main.go | 2 +- examples/rtl8720dn/ntpclient/main.go | 2 +- examples/rtl8720dn/tcpclient/main.go | 2 +- examples/rtl8720dn/tlsclient/main.go | 2 +- examples/rtl8720dn/udpstation/main.go | 2 +- examples/rtl8720dn/webclient-tinyterm/main.go | 2 +- examples/rtl8720dn/webclient/main.go | 2 +- examples/rtl8720dn/webserver/main.go | 2 +- examples/wifinina/connect/main.go | 18 +++++-------- examples/wifinina/http-get/main.go | 22 +++++++--------- examples/wifinina/mqttclient/main.go | 14 +++++----- examples/wifinina/mqttsub/main.go | 13 ++++++---- examples/wifinina/ntpclient/main.go | 21 +++++++-------- examples/wifinina/tcpclient/main.go | 17 +++++++----- examples/wifinina/tlsclient/main.go | 21 +++++++-------- examples/wifinina/udpstation/main.go | 18 +++++++------ examples/wifinina/webclient/main.go | 22 +++++++--------- rtl8720dn/wifidriver.go | 20 ++++++++++++++ wifi.go | 16 ++++++++++++ wifinina/wifidriver.go | 26 +++++++++++++++++++ 28 files changed, 187 insertions(+), 102 deletions(-) create mode 100644 espat/wifidriver.go create mode 100644 rtl8720dn/wifidriver.go create mode 100644 wifi.go create mode 100644 wifinina/wifidriver.go diff --git a/espat/wifidriver.go b/espat/wifidriver.go new file mode 100644 index 0000000..ee485fe --- /dev/null +++ b/espat/wifidriver.go @@ -0,0 +1,19 @@ +package espat + +import ( + "time" + + "tinygo.org/x/drivers" +) + +func (d *Device) ConnectToAccessPoint(ssid, pass string, timeout time.Duration) error { + if len(ssid) == 0 { + return drivers.ErrWiFiMissingSSID + } + + return d.ConnectToAP(ssid, pass, 10) +} + +func (d *Device) Disconnect() error { + return d.DisconnectFromAP() +} diff --git a/examples/espat/espconsole/main.go b/examples/espat/espconsole/main.go index 106a2f3..dc554d4 100644 --- a/examples/espat/espconsole/main.go +++ b/examples/espat/espconsole/main.go @@ -114,7 +114,9 @@ func connectToAP() { println("Connecting to wifi network '" + ssid + "'") adaptor.SetWifiMode(espat.WifiModeClient) - adaptor.ConnectToAP(ssid, pass, 10) + if err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second); err != nil { + failMessage(err.Error()) + } println("Connected.") ip, err := adaptor.GetClientIP() diff --git a/examples/espat/esphub/main.go b/examples/espat/esphub/main.go index fdc3301..6f9015d 100644 --- a/examples/espat/esphub/main.go +++ b/examples/espat/esphub/main.go @@ -100,7 +100,9 @@ func connectToAP() { println("Connecting to wifi network '" + ssid + "'") adaptor.SetWifiMode(espat.WifiModeClient) - adaptor.ConnectToAP(ssid, pass, 10) + if err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second); err != nil { + failMessage(err.Error()) + } println("Connected.") ip, err := adaptor.GetClientIP() diff --git a/examples/espat/espstation/main.go b/examples/espat/espstation/main.go index f6b7dc8..3a9b7ba 100644 --- a/examples/espat/espstation/main.go +++ b/examples/espat/espstation/main.go @@ -89,7 +89,9 @@ func connectToAP() { println("Connecting to wifi network '" + ssid + "'") adaptor.SetWifiMode(espat.WifiModeClient) - adaptor.ConnectToAP(ssid, pass, 10) + if err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second); err != nil { + failMessage(err.Error()) + } println("Connected.") ip, err := adaptor.GetClientIP() diff --git a/examples/espat/mqttclient/main.go b/examples/espat/mqttclient/main.go index 1fb4910..701c91c 100644 --- a/examples/espat/mqttclient/main.go +++ b/examples/espat/mqttclient/main.go @@ -109,7 +109,9 @@ func connectToAP() { println("Connecting to wifi network '" + ssid + "'") adaptor.SetWifiMode(espat.WifiModeClient) - adaptor.ConnectToAP(ssid, pass, 10) + if err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second); err != nil { + failMessage(err.Error()) + } println("Connected.") ip, err := adaptor.GetClientIP() diff --git a/examples/espat/mqttsub/main.go b/examples/espat/mqttsub/main.go index 4720f04..450703e 100644 --- a/examples/espat/mqttsub/main.go +++ b/examples/espat/mqttsub/main.go @@ -130,7 +130,9 @@ func connectToAP() { println("Connecting to wifi network '" + ssid + "'") adaptor.SetWifiMode(espat.WifiModeClient) - adaptor.ConnectToAP(ssid, pass, 10) + if err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second); err != nil { + failMessage(err.Error()) + } println("Connected.") ip, err := adaptor.GetClientIP() diff --git a/examples/espat/tcpclient/main.go b/examples/espat/tcpclient/main.go index a52ca44..51d3d11 100644 --- a/examples/espat/tcpclient/main.go +++ b/examples/espat/tcpclient/main.go @@ -92,7 +92,9 @@ func connectToAP() { println("Connecting to wifi network '" + ssid + "'") adaptor.SetWifiMode(espat.WifiModeClient) - adaptor.ConnectToAP(ssid, pass, 10) + if err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second); err != nil { + failMessage(err.Error()) + } println("Connected.") ip, err := adaptor.GetClientIP() diff --git a/examples/rtl8720dn/mqttclient/main.go b/examples/rtl8720dn/mqttclient/main.go index 4cb0be8..c9d8d7f 100644 --- a/examples/rtl8720dn/mqttclient/main.go +++ b/examples/rtl8720dn/mqttclient/main.go @@ -65,7 +65,7 @@ func run() error { } net.UseDriver(rtl) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/mqttsub/main.go b/examples/rtl8720dn/mqttsub/main.go index 63887de..bff8040 100644 --- a/examples/rtl8720dn/mqttsub/main.go +++ b/examples/rtl8720dn/mqttsub/main.go @@ -74,7 +74,7 @@ func run() error { } net.UseDriver(rtl) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/ntpclient/main.go b/examples/rtl8720dn/ntpclient/main.go index 8bdb6b4..37f62a6 100644 --- a/examples/rtl8720dn/ntpclient/main.go +++ b/examples/rtl8720dn/ntpclient/main.go @@ -47,7 +47,7 @@ func run() error { } net.UseDriver(rtl) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/tcpclient/main.go b/examples/rtl8720dn/tcpclient/main.go index 194ca33..2a65f6c 100644 --- a/examples/rtl8720dn/tcpclient/main.go +++ b/examples/rtl8720dn/tcpclient/main.go @@ -47,7 +47,7 @@ func run() error { } net.UseDriver(rtl) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/tlsclient/main.go b/examples/rtl8720dn/tlsclient/main.go index f0c83d9..7d83310 100644 --- a/examples/rtl8720dn/tlsclient/main.go +++ b/examples/rtl8720dn/tlsclient/main.go @@ -76,7 +76,7 @@ func run() error { net.UseDriver(rtl) http.SetBuf(buf[:]) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/udpstation/main.go b/examples/rtl8720dn/udpstation/main.go index 3c63d4e..02f243d 100644 --- a/examples/rtl8720dn/udpstation/main.go +++ b/examples/rtl8720dn/udpstation/main.go @@ -43,7 +43,7 @@ func run() error { net.UseDriver(rtl) http.SetBuf(buf[:]) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/webclient-tinyterm/main.go b/examples/rtl8720dn/webclient-tinyterm/main.go index ff8a1f1..446e40c 100644 --- a/examples/rtl8720dn/webclient-tinyterm/main.go +++ b/examples/rtl8720dn/webclient-tinyterm/main.go @@ -74,7 +74,7 @@ func run() error { http.SetBuf(buf[:]) fmt.Fprintf(terminal, "ConnectToAP()\r\n") - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/webclient/main.go b/examples/rtl8720dn/webclient/main.go index 160ddeb..565481e 100644 --- a/examples/rtl8720dn/webclient/main.go +++ b/examples/rtl8720dn/webclient/main.go @@ -43,7 +43,7 @@ func run() error { net.UseDriver(rtl) http.SetBuf(buf[:]) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/rtl8720dn/webserver/main.go b/examples/rtl8720dn/webserver/main.go index 639c052..98807da 100644 --- a/examples/rtl8720dn/webserver/main.go +++ b/examples/rtl8720dn/webserver/main.go @@ -43,7 +43,7 @@ func run() error { } http.UseDriver(rtl) - err = rtl.ConnectToAP(ssid, password) + err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) if err != nil { return err } diff --git a/examples/wifinina/connect/main.go b/examples/wifinina/connect/main.go index 087eff0..4a82e02 100644 --- a/examples/wifinina/connect/main.go +++ b/examples/wifinina/connect/main.go @@ -128,19 +128,15 @@ func waitSerial() { // connect to access point func connectToAP() { - if len(ssid) == 0 || len(pass) == 0 { - for { - println("Connection failed: Either ssid or password not set") - time.Sleep(10 * time.Second) - } - } time.Sleep(2 * time.Second) println("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - println("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP + for { + println(err) + time.Sleep(1 * time.Second) + } } + println("Connected.") } diff --git a/examples/wifinina/http-get/main.go b/examples/wifinina/http-get/main.go index ba2e56d..3ae8d1b 100644 --- a/examples/wifinina/http-get/main.go +++ b/examples/wifinina/http-get/main.go @@ -132,22 +132,18 @@ func waitSerial() { // connect to access point func connectToAP() { - if len(ssid) == 0 || len(pass) == 0 { + time.Sleep(2 * time.Second) + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP for { - println("Connection failed: Either ssid or password not set") - time.Sleep(10 * time.Second) + println(err) + time.Sleep(1 * time.Second) } } - time.Sleep(2 * time.Second) - message("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - message("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() - } - message("Connected.") - time.Sleep(2 * time.Second) + + println("Connected.") + ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { message(err.Error()) diff --git a/examples/wifinina/mqttclient/main.go b/examples/wifinina/mqttclient/main.go index 3418911..314c996 100644 --- a/examples/wifinina/mqttclient/main.go +++ b/examples/wifinina/mqttclient/main.go @@ -104,14 +104,16 @@ func main() { func connectToAP() { time.Sleep(2 * time.Second) println("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - println("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP + for { + println(err) + time.Sleep(1 * time.Second) + } } + println("Connected.") - time.Sleep(2 * time.Second) + ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { println(err.Error()) diff --git a/examples/wifinina/mqttsub/main.go b/examples/wifinina/mqttsub/main.go index 4dcb23d..389c9f6 100644 --- a/examples/wifinina/mqttsub/main.go +++ b/examples/wifinina/mqttsub/main.go @@ -116,13 +116,16 @@ func publishing() { func connectToAP() { time.Sleep(2 * time.Second) println("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - println("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP + for { + println(err) + time.Sleep(1 * time.Second) + } } + println("Connected.") + time.Sleep(2 * time.Second) ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { diff --git a/examples/wifinina/ntpclient/main.go b/examples/wifinina/ntpclient/main.go index cf7ed10..b215d77 100644 --- a/examples/wifinina/ntpclient/main.go +++ b/examples/wifinina/ntpclient/main.go @@ -151,21 +151,18 @@ func clearBuffer() { // connect to access point func connectToAP() { - if len(ssid) == 0 || len(pass) == 0 { + time.Sleep(2 * time.Second) + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP for { - println("Connection failed: Either ssid or password not set") - time.Sleep(10 * time.Second) + println(err) + time.Sleep(1 * time.Second) } } - time.Sleep(2 * time.Second) - message("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - message("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() - } - message("Connected.") + + println("Connected.") + time.Sleep(2 * time.Second) ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { diff --git a/examples/wifinina/tcpclient/main.go b/examples/wifinina/tcpclient/main.go index 7d2d580..3b6276d 100644 --- a/examples/wifinina/tcpclient/main.go +++ b/examples/wifinina/tcpclient/main.go @@ -113,14 +113,17 @@ func sendBatch() { // connect to access point func connectToAP() { time.Sleep(2 * time.Second) - message("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - message("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP + for { + println(err) + time.Sleep(1 * time.Second) + } } - message("Connected.") + + println("Connected.") + time.Sleep(2 * time.Second) ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { diff --git a/examples/wifinina/tlsclient/main.go b/examples/wifinina/tlsclient/main.go index 5f391da..167ef9b 100644 --- a/examples/wifinina/tlsclient/main.go +++ b/examples/wifinina/tlsclient/main.go @@ -122,21 +122,18 @@ func makeHTTPSRequest() { // connect to access point func connectToAP() { - if len(ssid) == 0 || len(pass) == 0 { + time.Sleep(2 * time.Second) + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP for { - println("Connection failed: Either ssid or password not set") - time.Sleep(10 * time.Second) + println(err) + time.Sleep(1 * time.Second) } } - time.Sleep(2 * time.Second) - message("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - message("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() - } - message("Connected.") + + println("Connected.") + time.Sleep(2 * time.Second) ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { diff --git a/examples/wifinina/udpstation/main.go b/examples/wifinina/udpstation/main.go index ed415cf..6ba1d28 100644 --- a/examples/wifinina/udpstation/main.go +++ b/examples/wifinina/udpstation/main.go @@ -76,15 +76,17 @@ func main() { // connect to access point func connectToAP() { time.Sleep(2 * time.Second) - message("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - message("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP + for { + println(err) + time.Sleep(1 * time.Second) + } } - message("Connected.") - time.Sleep(2 * time.Second) + + println("Connected.") + ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { message(err.Error()) diff --git a/examples/wifinina/webclient/main.go b/examples/wifinina/webclient/main.go index c3e3b45..a38e293 100644 --- a/examples/wifinina/webclient/main.go +++ b/examples/wifinina/webclient/main.go @@ -124,22 +124,18 @@ func makeHTTPRequest() { // connect to access point func connectToAP() { - if len(ssid) == 0 || len(pass) == 0 { + time.Sleep(2 * time.Second) + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP for { - println("Connection failed: Either ssid or password not set") - time.Sleep(10 * time.Second) + println(err) + time.Sleep(1 * time.Second) } } - time.Sleep(2 * time.Second) - message("Connecting to " + ssid) - adaptor.SetPassphrase(ssid, pass) - for st, _ := adaptor.GetConnectionStatus(); st != wifinina.StatusConnected; { - message("Connection status: " + st.String()) - time.Sleep(1 * time.Second) - st, _ = adaptor.GetConnectionStatus() - } - message("Connected.") - time.Sleep(2 * time.Second) + + println("Connected.") + ip, _, _, err := adaptor.GetIP() for ; err != nil; ip, _, _, err = adaptor.GetIP() { message(err.Error()) diff --git a/rtl8720dn/wifidriver.go b/rtl8720dn/wifidriver.go new file mode 100644 index 0000000..24de7e0 --- /dev/null +++ b/rtl8720dn/wifidriver.go @@ -0,0 +1,20 @@ +package rtl8720dn + +import ( + "time" + + "tinygo.org/x/drivers" +) + +func (r *RTL8720DN) ConnectToAccessPoint(ssid, pass string, timeout time.Duration) error { + if len(ssid) == 0 { + return drivers.ErrWiFiMissingSSID + } + + return r.ConnectToAP(ssid, pass) +} + +func (r *RTL8720DN) Disconnect() error { + _, err := r.Rpc_wifi_disconnect() + return err +} diff --git a/wifi.go b/wifi.go new file mode 100644 index 0000000..2e4df71 --- /dev/null +++ b/wifi.go @@ -0,0 +1,16 @@ +package drivers + +import ( + "errors" + "time" +) + +var ( + ErrWiFiMissingSSID = errors.New("missing SSID") + ErrWiFiConnectTimeout = errors.New("WiFi connect timeout") +) + +type WiFiDriver interface { + ConnectToAccessPoint(ssid, pass string, timeout time.Duration) error + Disconnect() error +} diff --git a/wifinina/wifidriver.go b/wifinina/wifidriver.go new file mode 100644 index 0000000..7898fd4 --- /dev/null +++ b/wifinina/wifidriver.go @@ -0,0 +1,26 @@ +package wifinina + +import ( + "time" + + "tinygo.org/x/drivers" +) + +func (d *Device) ConnectToAccessPoint(ssid, pass string, timeout time.Duration) error { + if len(ssid) == 0 { + return drivers.ErrWiFiMissingSSID + } + + start := time.Now() + d.SetPassphrase(ssid, pass) + + for time.Since(start) < timeout { + st, _ := d.GetConnectionStatus() + if st == StatusConnected { + return nil + } + time.Sleep(100 * time.Millisecond) + } + + return drivers.ErrWiFiConnectTimeout +}