[beken-72xx] Fix WiFi station connection
This commit is contained in:
@@ -54,9 +54,9 @@ SoftwareSerial | ❌ | ❌
|
||||
SPI | ❌ | ❌
|
||||
Wire | ❗ | ❌
|
||||
**OTHER LIBRARIES** | |
|
||||
Wi-Fi STA/AP/Mixed | ✔️ | ❗/❌/❌
|
||||
Wi-Fi STA/AP/Mixed | ✔️ | ✔️/❌/❌
|
||||
Wi-Fi Events | ✔️ | ❌
|
||||
TCP Client (SSL) | ✔️ (✔️) | ❓
|
||||
TCP Client (SSL) | ✔️ (✔️) | ❗ (❓)
|
||||
TCP Server | ✔️ | ❓
|
||||
IPv6 | ❌ | ❌
|
||||
HTTP Client (SSL) | ✔️ (✔️) | ❓
|
||||
|
||||
@@ -58,9 +58,7 @@ WiFiMode WiFiClass::getMode() {
|
||||
}
|
||||
|
||||
WiFiStatus WiFiClass::status() {
|
||||
auto status = mhdr_get_station_status();
|
||||
LT_D_WG("mhdr_get_station_status()=%d", status);
|
||||
return eventTypeToStatus(status);
|
||||
return eventTypeToStatus(mhdr_get_station_status());
|
||||
}
|
||||
|
||||
IPAddress WiFiClass::hostByName(const char *hostname) {
|
||||
|
||||
@@ -93,7 +93,9 @@ bool WiFiClass::reconnect(const uint8_t *bssid) {
|
||||
}
|
||||
|
||||
LT_D_WG("Starting WiFi...");
|
||||
__wrap_bk_printf_disable();
|
||||
bk_wlan_start_sta(&config);
|
||||
__wrap_bk_printf_enable();
|
||||
LT_D_WG("bk_wlan_start() OK");
|
||||
return true;
|
||||
|
||||
@@ -172,9 +174,8 @@ bool WiFiClass::setMacAddress(const uint8_t *mac) {
|
||||
}
|
||||
|
||||
const String WiFiClass::SSID() {
|
||||
if (!isConnected() || !wpas_connect_ssid)
|
||||
return "";
|
||||
return (char *)wpas_connect_ssid->ssid;
|
||||
bk_wlan_get_link_status(LINK_STATUS);
|
||||
return (char *)LINK_STATUS->ssid;
|
||||
}
|
||||
|
||||
const String WiFiClass::psk() {
|
||||
@@ -187,8 +188,6 @@ const String WiFiClass::psk() {
|
||||
}
|
||||
|
||||
uint8_t *WiFiClass::BSSID() {
|
||||
if (!isConnected())
|
||||
return NULL;
|
||||
bk_wlan_get_link_status(LINK_STATUS);
|
||||
return LINK_STATUS->bssid;
|
||||
}
|
||||
|
||||
@@ -15,33 +15,25 @@ static void scanHandler(void *ctx, uint8_t param) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct sta_scan_res *result;
|
||||
uint8_t count = bk_wlan_get_scan_ap_result_numbers();
|
||||
if (count == 0) {
|
||||
LT_D_WG("No APs found");
|
||||
ScanResult_adv result;
|
||||
if (wlan_sta_scan_result(&result)) {
|
||||
LT_E("Failed to get scan result");
|
||||
goto end;
|
||||
}
|
||||
LT_D_WG("Found %d APs", count);
|
||||
LT_D_WG("Found %d APs", result.ApNum);
|
||||
|
||||
result = (struct sta_scan_res *)malloc(sizeof(struct sta_scan_res) * count);
|
||||
if (!result) {
|
||||
LT_W("sta_scan_res alloc failed");
|
||||
goto end;
|
||||
}
|
||||
bk_wlan_get_scan_ap_result(result, count);
|
||||
|
||||
cls->scanAlloc(count);
|
||||
cls->scanAlloc(result.ApNum);
|
||||
if (!scan->ap) {
|
||||
LT_W("scan->ap alloc failed");
|
||||
goto end;
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < count; i++) {
|
||||
scan->ap[i].ssid = strdup(result[i].ssid);
|
||||
scan->ap[i].auth = securityTypeToAuthMode(result[i].security);
|
||||
scan->ap[i].rssi = result[i].level;
|
||||
scan->ap[i].channel = result[i].channel;
|
||||
memcpy(scan->ap[i].bssid.addr, result[i].bssid, 6);
|
||||
for (uint8_t i = 0; i < result.ApNum; i++) {
|
||||
scan->ap[i].ssid = strdup(result.ApList[i].ssid);
|
||||
scan->ap[i].auth = securityTypeToAuthMode(result.ApList[i].security);
|
||||
scan->ap[i].rssi = result.ApList[i].ApPower;
|
||||
scan->ap[i].channel = result.ApList[i].channel;
|
||||
memcpy(scan->ap[i].bssid.addr, result.ApList[i].bssid, 6);
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
@@ -49,6 +49,11 @@
|
||||
#define LT_LOG_HEAP 0
|
||||
#endif
|
||||
|
||||
// Debug errno values using LT_ERRNO()
|
||||
#ifndef LT_LOG_ERRNO
|
||||
#define LT_LOG_ERRNO 0
|
||||
#endif
|
||||
|
||||
// Per-module debugging
|
||||
#ifndef LT_DEBUG_WIFI
|
||||
#define LT_DEBUG_WIFI 0
|
||||
|
||||
@@ -134,6 +134,16 @@ void lt_log(const uint8_t level, const char *format, ...);
|
||||
return ret; \
|
||||
}
|
||||
|
||||
#if LT_LOG_ERRNO
|
||||
#define LT_ERRNO() \
|
||||
if (errno) { \
|
||||
LT_E("errno=%d", errno); \
|
||||
errno = 0; \
|
||||
}
|
||||
#else
|
||||
#define LT_ERRNO()
|
||||
#endif
|
||||
|
||||
// WiFi.cpp
|
||||
#define LT_T_WG(...) LT_T_MOD(LT_DEBUG_WIFI, __VA_ARGS__)
|
||||
#define LT_V_WG(...) LT_T_MOD(LT_DEBUG_WIFI, __VA_ARGS__)
|
||||
|
||||
@@ -87,6 +87,7 @@ int LwIPClient::connect(const char *host, uint16_t port, int32_t timeout) {
|
||||
int LwIPClient::connect(IPAddress ip, uint16_t port, int32_t timeout) {
|
||||
int sock = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (sock < 0) {
|
||||
LT_D_WC("socket failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -95,6 +96,8 @@ int LwIPClient::connect(IPAddress ip, uint16_t port, int32_t timeout) {
|
||||
|
||||
lwip_fcntl(sock, F_SETFL, lwip_fcntl(sock, F_GETFL, 0) | O_NONBLOCK);
|
||||
|
||||
LT_ERRNO();
|
||||
|
||||
struct sockaddr_in addr;
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
@@ -142,8 +145,12 @@ int LwIPClient::connect(IPAddress ip, uint16_t port, int32_t timeout) {
|
||||
lwip_setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable));
|
||||
lwip_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable));
|
||||
|
||||
LT_ERRNO();
|
||||
|
||||
lwip_fcntl(sock, F_SETFL, lwip_fcntl(sock, F_GETFL, 0) & ~O_NONBLOCK);
|
||||
|
||||
LT_ERRNO();
|
||||
|
||||
_connected = true;
|
||||
_sock = std::make_shared<SocketHandle>(sock);
|
||||
_rxBuffer = std::make_shared<LwIPRxBuffer>(sock);
|
||||
@@ -214,6 +221,7 @@ size_t LwIPClient::write(const uint8_t *buf, size_t size) {
|
||||
}
|
||||
}
|
||||
}
|
||||
LT_D_WC("wrote %d bytes", written);
|
||||
return written;
|
||||
}
|
||||
|
||||
@@ -222,6 +230,7 @@ int LwIPClient::available() {
|
||||
return 0;
|
||||
int res = _rxBuffer->available();
|
||||
if (_rxBuffer->failed()) {
|
||||
LT_ERRNO();
|
||||
stop();
|
||||
}
|
||||
return res;
|
||||
|
||||
@@ -14,11 +14,13 @@ extern "C" {
|
||||
|
||||
size_t LwIPRxBuffer::r_available() {
|
||||
if (_sock < 0) {
|
||||
LT_D_WC("_sock < 0");
|
||||
return 0;
|
||||
}
|
||||
uint16_t count = 0;
|
||||
int res = lwip_ioctl(_sock, FIONREAD, &count);
|
||||
if (res < 0) {
|
||||
LT_D_WC("lwip_ioctl()=%d, errno=%d", res, errno);
|
||||
_failed = true;
|
||||
return 0;
|
||||
}
|
||||
@@ -29,7 +31,7 @@ size_t LwIPRxBuffer::fillBuffer() {
|
||||
if (!_buffer) {
|
||||
_buffer = (uint8_t *)malloc(_size);
|
||||
if (!_buffer) {
|
||||
printf("[e] Not enough memory to allocate buffer\r\n");
|
||||
LT_E("buffer alloc failed");
|
||||
_failed = true;
|
||||
return 0;
|
||||
}
|
||||
@@ -44,6 +46,7 @@ size_t LwIPRxBuffer::fillBuffer() {
|
||||
int res = lwip_recv(_sock, _buffer + _fill, _size - _fill, MSG_DONTWAIT);
|
||||
if (res < 0) {
|
||||
if (errno != EWOULDBLOCK) {
|
||||
LT_ERRNO();
|
||||
_failed = true;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -75,6 +75,8 @@ env.Append(
|
||||
("MBEDTLS_CONFIG_FILE", "<tls_config.h>"),
|
||||
("WIFI_BLE_COEXIST", "1"),
|
||||
("WOLFSSL_BEKEN", env.Cfg("CFG_WPA3")),
|
||||
# LwIP options
|
||||
("LWIP_SO_RCVBUF", "1"), # for ioctl(FIONREAD)
|
||||
],
|
||||
ASFLAGS=[
|
||||
"-mcpu=arm968e-s",
|
||||
|
||||
@@ -40,6 +40,7 @@ build_flags =
|
||||
- `LT_LOGGER_COLOR` - output ANSI terminal colors
|
||||
- `LT_PRINTF_BROKEN` - whether printf outputs "0." for floats with value 0
|
||||
- `LT_LOG_HEAP` - print free heap size using `LT_HEAP_I()`
|
||||
- `LT_LOG_ERRNO` - print and clear errno value (if set) using `LT_ERRNO()`
|
||||
|
||||
### Debug logging
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
#define CFG_WIFI_RAW_TX_CMD 0
|
||||
#define CFG_WIFI_SENSOR 0
|
||||
#define CFG_WLAN_FAST_CONNECT 0
|
||||
#define CFG_WPA_CTRL_IFACE 0
|
||||
#define CFG_WPA_CTRL_IFACE 1
|
||||
#define CFG_WPA3 0
|
||||
#define CFG_XTAL_FREQUENCE CFG_XTAL_FREQUENCE_26M
|
||||
#define CFG_XTAL_FREQUENCE_26M 26000000
|
||||
|
||||
@@ -16,3 +16,7 @@
|
||||
#include <sys/errno.h> // use system __errno() & error codes
|
||||
#undef errno // undefine __errno() macro
|
||||
extern int errno; // use a global errno variable
|
||||
#define errno errno // for #ifdef errno in lwIP
|
||||
|
||||
// make sure lwIP never defines its own error codes
|
||||
#undef LWIP_PROVIDE_ERRNO
|
||||
|
||||
Reference in New Issue
Block a user