mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-19 19:42:32 +00:00
commit
d588dde007
@ -3,7 +3,7 @@
|
|||||||
extends = arduino_base
|
extends = arduino_base
|
||||||
platform = platformio/espressif32@^5.2.0
|
platform = platformio/espressif32@^5.2.0
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
${arduino_base.build_src_filter} -<platform/nrf52/> -<platform/stm32wl> -<platform/rp2040>
|
${arduino_base.build_src_filter} -<platform/nrf52/> -<platform/stm32wl> -<platform/rp2040> -<mesh/eth/>
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
debug_init_break = tbreak setup
|
debug_init_break = tbreak setup
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
@ -33,7 +33,6 @@ lib_deps =
|
|||||||
${environmental_base.lib_deps}
|
${environmental_base.lib_deps}
|
||||||
https://github.com/meshtastic/esp32_https_server.git#657509856ce97e9dddeffb89a559f544faefd5cd
|
https://github.com/meshtastic/esp32_https_server.git#657509856ce97e9dddeffb89a559f544faefd5cd
|
||||||
h2zero/NimBLE-Arduino@^1.4.0
|
h2zero/NimBLE-Arduino@^1.4.0
|
||||||
arduino-libraries/NTPClient@^3.1.0
|
|
||||||
https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6
|
https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6
|
||||||
|
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
extends = arduino_base
|
extends = arduino_base
|
||||||
platform = platformio/espressif32@^5.2.0
|
platform = platformio/espressif32@^5.2.0
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
${arduino_base.build_src_filter} -<platform/nrf52/> -<platform/stm32wl> -<platform/rp2040>
|
${arduino_base.build_src_filter} -<platform/nrf52/> -<platform/stm32wl> -<platform/rp2040> -<mesh/eth/>
|
||||||
upload_speed = 961200
|
upload_speed = 961200
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
debug_init_break = tbreak setup
|
debug_init_break = tbreak setup
|
||||||
@ -33,7 +33,6 @@ lib_deps =
|
|||||||
${environmental_base.lib_deps}
|
${environmental_base.lib_deps}
|
||||||
https://github.com/meshtastic/esp32_https_server.git#657509856ce97e9dddeffb89a559f544faefd5cd
|
https://github.com/meshtastic/esp32_https_server.git#657509856ce97e9dddeffb89a559f544faefd5cd
|
||||||
h2zero/NimBLE-Arduino@^1.4.0
|
h2zero/NimBLE-Arduino@^1.4.0
|
||||||
arduino-libraries/NTPClient@^3.1.0
|
|
||||||
https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6
|
https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6
|
||||||
|
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
|
@ -8,7 +8,7 @@ build_flags =
|
|||||||
${arduino_base.build_flags} -Wno-unused-variable
|
${arduino_base.build_flags} -Wno-unused-variable
|
||||||
-Isrc/platform/nrf52
|
-Isrc/platform/nrf52
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
${arduino_base.build_src_filter} -<platform/esp32/> -<platform/stm32wl> -<nimble/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mqtt/> -<platform/rp2040>
|
${arduino_base.build_src_filter} -<platform/esp32/> -<platform/stm32wl> -<nimble/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mqtt/> -<platform/rp2040> -<mesh/eth/>
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
BluetoothOTA
|
BluetoothOTA
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ build_src_filter =
|
|||||||
-<platform/stm32wl/>
|
-<platform/stm32wl/>
|
||||||
-<platform/rp2040>
|
-<platform/rp2040>
|
||||||
-<mesh/http/>
|
-<mesh/http/>
|
||||||
|
-<mesh/eth/>
|
||||||
-<modules/esp32>
|
-<modules/esp32>
|
||||||
-<modules/Telemetry>
|
-<modules/Telemetry>
|
||||||
+<../variants/portduino>
|
+<../variants/portduino>
|
||||||
|
@ -10,7 +10,7 @@ build_flags =
|
|||||||
-D__PLAT_RP2040__
|
-D__PLAT_RP2040__
|
||||||
# -D _POSIX_THREADS
|
# -D _POSIX_THREADS
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
${arduino_base.build_src_filter} -<platform/esp32/> -<nimble/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mqtt/> -<platform/nrf52/> -<platform/stm32wl>
|
${arduino_base.build_src_filter} -<platform/esp32/> -<nimble/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mqtt/> -<platform/nrf52/> -<platform/stm32wl> -<mesh/eth/>
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
BluetoothOTA
|
BluetoothOTA
|
||||||
lib_deps =
|
lib_deps =
|
||||||
|
@ -10,7 +10,7 @@ build_flags =
|
|||||||
# Arduino/PlatformIO framework-arduinoststm32 package does not presently have SUBGHZSPI support
|
# Arduino/PlatformIO framework-arduinoststm32 package does not presently have SUBGHZSPI support
|
||||||
# -DPIN_SPI_MOSI=PINSUBGHZSPIMOSI -DPIN_SPI_MISO=PINSUBGHZSPIMISO -DPIN_SPI_SCK=PINSUBGHZSPISCK
|
# -DPIN_SPI_MOSI=PINSUBGHZSPIMOSI -DPIN_SPI_MISO=PINSUBGHZSPIMISO -DPIN_SPI_SCK=PINSUBGHZSPISCK
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
${arduino_base.build_src_filter} -<platform/esp32/> -<nimble/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mqtt/> -<graphics> -<input> -<buzz> -<modules/Telemetry> -<platform/nrf52> -<platform/portduino> -<platform/rp2040>
|
${arduino_base.build_src_filter} -<platform/esp32/> -<nimble/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mesh/eth/> -<mqtt/> -<graphics> -<input> -<buzz> -<modules/Telemetry> -<platform/nrf52> -<platform/portduino> -<platform/rp2040>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${env.lib_deps}
|
${env.lib_deps}
|
||||||
https://github.com/kokke/tiny-AES-c.git#f06ac37fc31dfdaca2e0d9bec83f90d5663c319b
|
https://github.com/kokke/tiny-AES-c.git#f06ac37fc31dfdaca2e0d9bec83f90d5663c319b
|
||||||
|
@ -79,6 +79,7 @@ build_src_filter = ${env.build_src_filter} -<platform/portduino/>
|
|||||||
[networking_base]
|
[networking_base]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
knolleary/PubSubClient@^2.8
|
knolleary/PubSubClient@^2.8
|
||||||
|
arduino-libraries/NTPClient@^3.1.0
|
||||||
meshtastic/json11@^1.0.2
|
meshtastic/json11@^1.0.2
|
||||||
|
|
||||||
; Common libs for environmental measurements in telemetry module
|
; Common libs for environmental measurements in telemetry module
|
||||||
|
@ -44,11 +44,9 @@ size_t RedirectablePrint::vprintf(const char *format, va_list arg)
|
|||||||
static char printBuf[160];
|
static char printBuf[160];
|
||||||
|
|
||||||
va_copy(copy, arg);
|
va_copy(copy, arg);
|
||||||
int len = vsnprintf(printBuf, sizeof(printBuf), format, copy);
|
size_t len = vsnprintf(printBuf, sizeof(printBuf), format, copy);
|
||||||
va_end(copy);
|
va_end(copy);
|
||||||
|
|
||||||
if (len < 0) return 0;
|
|
||||||
|
|
||||||
// If the resulting string is longer than sizeof(printBuf)-1 characters, the remaining characters are still counted for the return value
|
// If the resulting string is longer than sizeof(printBuf)-1 characters, the remaining characters are still counted for the return value
|
||||||
|
|
||||||
if (len > sizeof(printBuf) - 1) {
|
if (len > sizeof(printBuf) - 1) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "buzz.h"
|
#include "buzz.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
#include "NodeDB.h"
|
||||||
|
|
||||||
#ifndef PIN_BUZZER
|
#ifndef PIN_BUZZER
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ const int DURATION_1_8 = 125; // 1/8 note
|
|||||||
const int DURATION_1_4 = 250; // 1/4 note
|
const int DURATION_1_4 = 250; // 1/4 note
|
||||||
|
|
||||||
void playTones(const ToneDuration *tone_durations, int size) {
|
void playTones(const ToneDuration *tone_durations, int size) {
|
||||||
|
if (config.network.eth_enabled != true) {
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
const auto &tone_duration = tone_durations[i];
|
const auto &tone_duration = tone_durations[i];
|
||||||
#ifdef M5STACK
|
#ifdef M5STACK
|
||||||
@ -55,6 +57,7 @@ void playTones(const ToneDuration *tone_durations, int size) {
|
|||||||
delay(1.3 * tone_duration.duration_ms);
|
delay(1.3 * tone_duration.duration_ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef M5STACK
|
#ifdef M5STACK
|
||||||
void playBeep() {
|
void playBeep() {
|
||||||
|
@ -142,6 +142,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#ifndef HAS_WIFI
|
#ifndef HAS_WIFI
|
||||||
#define HAS_WIFI 0
|
#define HAS_WIFI 0
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef HAS_ETHERNET
|
||||||
|
#define ETHERNET 0
|
||||||
|
#endif
|
||||||
#ifndef HAS_SCREEN
|
#ifndef HAS_SCREEN
|
||||||
#define HAS_SCREEN 0
|
#define HAS_SCREEN 0
|
||||||
#endif
|
#endif
|
||||||
|
16
src/main.cpp
16
src/main.cpp
@ -30,6 +30,7 @@
|
|||||||
// #include <driver/rtc_io.h>
|
// #include <driver/rtc_io.h>
|
||||||
|
|
||||||
#include "mesh/http/WiFiAPClient.h"
|
#include "mesh/http/WiFiAPClient.h"
|
||||||
|
#include "mesh/eth/ethClient.h"
|
||||||
|
|
||||||
#ifdef ARCH_ESP32
|
#ifdef ARCH_ESP32
|
||||||
#include "mesh/http/WebServer.h"
|
#include "mesh/http/WebServer.h"
|
||||||
@ -41,6 +42,11 @@
|
|||||||
#include "mqtt/MQTT.h"
|
#include "mqtt/MQTT.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_ETHERNET
|
||||||
|
#include "mesh/eth/ethServerAPI.h"
|
||||||
|
#include "mqtt/MQTT.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "LLCC68Interface.h"
|
#include "LLCC68Interface.h"
|
||||||
#include "RF95Interface.h"
|
#include "RF95Interface.h"
|
||||||
#include "SX1262Interface.h"
|
#include "SX1262Interface.h"
|
||||||
@ -278,11 +284,12 @@ void setup()
|
|||||||
#ifdef ARCH_NRF52
|
#ifdef ARCH_NRF52
|
||||||
nrf52Setup();
|
nrf52Setup();
|
||||||
#endif
|
#endif
|
||||||
playStartMelody();
|
|
||||||
// We do this as early as possible because this loads preferences from flash
|
// We do this as early as possible because this loads preferences from flash
|
||||||
// but we need to do this after main cpu iniot (esp32setup), because we need the random seed set
|
// but we need to do this after main cpu iniot (esp32setup), because we need the random seed set
|
||||||
nodeDB.init();
|
nodeDB.init();
|
||||||
|
|
||||||
|
playStartMelody();
|
||||||
|
|
||||||
// Currently only the tbeam has a PMU
|
// Currently only the tbeam has a PMU
|
||||||
power = new Power();
|
power = new Power();
|
||||||
power->setStatusHandler(powerStatus);
|
power->setStatusHandler(powerStatus);
|
||||||
@ -439,13 +446,18 @@ void setup()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_WIFI
|
#if HAS_WIFI || HAS_ETHERNET
|
||||||
mqttInit();
|
mqttInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARCH_PORTDUINO
|
||||||
// Initialize Wifi
|
// Initialize Wifi
|
||||||
initWifi(forceSoftAP);
|
initWifi(forceSoftAP);
|
||||||
|
|
||||||
|
// Initialize Ethernet
|
||||||
|
initEthernet();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ARCH_ESP32
|
#ifdef ARCH_ESP32
|
||||||
// Start web server thread.
|
// Start web server thread.
|
||||||
webServerThread = new WebServerThread();
|
webServerThread = new WebServerThread();
|
||||||
|
166
src/mesh/eth/ethClient.cpp
Normal file
166
src/mesh/eth/ethClient.cpp
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
#include "mesh/eth/ethClient.h"
|
||||||
|
#include "NodeDB.h"
|
||||||
|
#include "RTC.h"
|
||||||
|
#include "concurrency/Periodic.h"
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <RAK13800_W5100S.h>
|
||||||
|
#include "target_specific.h"
|
||||||
|
#include "mesh/eth/ethServerAPI.h"
|
||||||
|
#include "mqtt/MQTT.h"
|
||||||
|
|
||||||
|
#ifndef DISABLE_NTP
|
||||||
|
#include <NTPClient.h>
|
||||||
|
|
||||||
|
// NTP
|
||||||
|
EthernetUDP ntpUDP;
|
||||||
|
|
||||||
|
NTPClient timeClient(ntpUDP, config.network.ntp_server);
|
||||||
|
|
||||||
|
uint32_t ntp_renew = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Stores our hostname
|
||||||
|
char ourHost[16];
|
||||||
|
|
||||||
|
bool ethStartupComplete = 0;
|
||||||
|
|
||||||
|
using namespace concurrency;
|
||||||
|
|
||||||
|
static Periodic *ethEvent;
|
||||||
|
|
||||||
|
static int32_t reconnectETH()
|
||||||
|
{
|
||||||
|
if (config.network.eth_enabled) {
|
||||||
|
Ethernet.maintain();
|
||||||
|
if (!ethStartupComplete) {
|
||||||
|
// Start web server
|
||||||
|
DEBUG_MSG("... Starting network services\n");
|
||||||
|
|
||||||
|
// // start mdns
|
||||||
|
// if (!MDNS.begin("Meshtastic")) {
|
||||||
|
// DEBUG_MSG("Error setting up MDNS responder!\n");
|
||||||
|
// } else {
|
||||||
|
// DEBUG_MSG("mDNS responder started\n");
|
||||||
|
// DEBUG_MSG("mDNS Host: Meshtastic.local\n");
|
||||||
|
// MDNS.addService("http", "tcp", 80);
|
||||||
|
// MDNS.addService("https", "tcp", 443);
|
||||||
|
// }
|
||||||
|
|
||||||
|
#ifndef DISABLE_NTP
|
||||||
|
DEBUG_MSG("Starting NTP time client\n");
|
||||||
|
timeClient.begin();
|
||||||
|
timeClient.setUpdateInterval(60 * 60); // Update once an hour
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initWebServer();
|
||||||
|
initApiServer();
|
||||||
|
|
||||||
|
ethStartupComplete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME this is kinda yucky, instead we should just have an observable for 'wifireconnected'
|
||||||
|
if (mqtt && !mqtt->connected()) {
|
||||||
|
mqtt->reconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_NTP
|
||||||
|
if (isEthernetAvailable() && (ntp_renew < millis())) {
|
||||||
|
DEBUG_MSG("Updating NTP time\n");
|
||||||
|
if (timeClient.update()) {
|
||||||
|
DEBUG_MSG("NTP Request Success - Setting RTCQualityNTP if needed\n");
|
||||||
|
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_sec = timeClient.getEpochTime();
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
perhapsSetRTC(RTCQualityNTP, &tv);
|
||||||
|
|
||||||
|
ntp_renew = millis() + 43200 * 1000; // every 12 hours
|
||||||
|
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG("NTP Update failed\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 5000; // every 5 seconds
|
||||||
|
}
|
||||||
|
|
||||||
|
// Startup Ethernet
|
||||||
|
bool initEthernet()
|
||||||
|
{
|
||||||
|
|
||||||
|
// config.network.eth_enabled = true;
|
||||||
|
// config.network.eth_mode = Config_NetworkConfig_EthMode_DHCP;
|
||||||
|
|
||||||
|
if (config.network.eth_enabled) {
|
||||||
|
|
||||||
|
#ifdef PIN_ETHERNET_RESET
|
||||||
|
pinMode(PIN_ETHERNET_RESET, OUTPUT);
|
||||||
|
digitalWrite(PIN_ETHERNET_RESET, LOW); // Reset Time.
|
||||||
|
delay(100);
|
||||||
|
digitalWrite(PIN_ETHERNET_RESET, HIGH); // Reset Time.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Ethernet.init( ETH_SPI_PORT, PIN_ETHERNET_SS );
|
||||||
|
|
||||||
|
uint8_t mac[6];
|
||||||
|
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
// createSSLCert();
|
||||||
|
|
||||||
|
getMacAddr(mac); // FIXME use the BLE MAC for now...
|
||||||
|
|
||||||
|
if (config.network.eth_mode == Config_NetworkConfig_EthMode_DHCP) {
|
||||||
|
DEBUG_MSG("starting Ethernet DHCP\n");
|
||||||
|
status = Ethernet.begin(mac);
|
||||||
|
} else if (config.network.eth_mode == Config_NetworkConfig_EthMode_STATIC) {
|
||||||
|
DEBUG_MSG("starting Ethernet Static\n");
|
||||||
|
Ethernet.begin(mac, config.network.eth_config.ip, config.network.eth_config.dns, config.network.eth_config.subnet);
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG("Ethernet Disabled\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == 0) {
|
||||||
|
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
|
||||||
|
DEBUG_MSG("Ethernet shield was not found.\n");
|
||||||
|
return false;
|
||||||
|
} else if (Ethernet.linkStatus() == LinkOFF) {
|
||||||
|
DEBUG_MSG("Ethernet cable is not connected.\n");
|
||||||
|
return false;
|
||||||
|
} else{
|
||||||
|
DEBUG_MSG("Unknown Ethernet error.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG("Local IP %u.%u.%u.%u\n",Ethernet.localIP()[0], Ethernet.localIP()[1], Ethernet.localIP()[2], Ethernet.localIP()[3]);
|
||||||
|
DEBUG_MSG("Subnet Mask %u.%u.%u.%u\n",Ethernet.subnetMask()[0], Ethernet.subnetMask()[1], Ethernet.subnetMask()[2], Ethernet.subnetMask()[3]);
|
||||||
|
DEBUG_MSG("Gateway IP %u.%u.%u.%u\n",Ethernet.gatewayIP()[0], Ethernet.gatewayIP()[1], Ethernet.gatewayIP()[2], Ethernet.gatewayIP()[3]);
|
||||||
|
DEBUG_MSG("DNS Server IP %u.%u.%u.%u\n",Ethernet.dnsServerIP()[0], Ethernet.dnsServerIP()[1], Ethernet.dnsServerIP()[2], Ethernet.dnsServerIP()[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ethEvent = new Periodic("ethConnect", reconnectETH);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG("Not using Ethernet\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isEthernetAvailable() {
|
||||||
|
|
||||||
|
if (!config.network.eth_enabled) {
|
||||||
|
return false;
|
||||||
|
} else if (Ethernet.hardwareStatus() == EthernetNoHardware) {
|
||||||
|
return false;
|
||||||
|
} else if (Ethernet.linkStatus() == LinkOFF) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
8
src/mesh/eth/ethClient.h
Normal file
8
src/mesh/eth/ethClient.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "configuration.h"
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
bool initEthernet();
|
||||||
|
bool isEthernetAvailable();
|
82
src/mesh/eth/ethServerAPI.cpp
Normal file
82
src/mesh/eth/ethServerAPI.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#include "ethServerAPI.h"
|
||||||
|
#include "configuration.h"
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
static ethServerPort *apiPort;
|
||||||
|
|
||||||
|
void initApiServer(int port)
|
||||||
|
{
|
||||||
|
// Start API server on port 4403
|
||||||
|
if (!apiPort) {
|
||||||
|
apiPort = new ethServerPort(port);
|
||||||
|
DEBUG_MSG("API server listening on TCP port %d\n", port);
|
||||||
|
apiPort->init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ethServerAPI::ethServerAPI(EthernetClient &_client) : StreamAPI(&client), client(_client)
|
||||||
|
{
|
||||||
|
DEBUG_MSG("Incoming ethernet connection\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
ethServerAPI::~ethServerAPI()
|
||||||
|
{
|
||||||
|
client.stop();
|
||||||
|
|
||||||
|
// FIXME - delete this if the client dropps the connection!
|
||||||
|
}
|
||||||
|
|
||||||
|
/// override close to also shutdown the TCP link
|
||||||
|
void ethServerAPI::close()
|
||||||
|
{
|
||||||
|
client.stop(); // drop tcp connection
|
||||||
|
StreamAPI::close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check the current underlying physical link to see if the client is currently connected
|
||||||
|
bool ethServerAPI::checkIsConnected()
|
||||||
|
{
|
||||||
|
return client.connected();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ethServerAPI::runOnce()
|
||||||
|
{
|
||||||
|
if (client.connected()) {
|
||||||
|
return StreamAPI::runOnce();
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG("Client dropped connection, suspending API service\n");
|
||||||
|
enabled = false; // we no longer need to run
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If an api server is running, we try to spit out debug 'serial' characters there
|
||||||
|
void ethServerPort::debugOut(char c)
|
||||||
|
{
|
||||||
|
if (apiPort && apiPort->openAPI)
|
||||||
|
apiPort->openAPI->debugOut(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ethServerPort::ethServerPort(int port) : EthernetServer(port), concurrency::OSThread("ApiServer") {}
|
||||||
|
|
||||||
|
void ethServerPort::init()
|
||||||
|
{
|
||||||
|
begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ethServerPort::runOnce()
|
||||||
|
{
|
||||||
|
auto client = available();
|
||||||
|
if (client) {
|
||||||
|
// Close any previous connection (see FIXME in header file)
|
||||||
|
if (openAPI) {
|
||||||
|
DEBUG_MSG("Force closing previous TCP connection\n");
|
||||||
|
delete openAPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
openAPI = new ethServerAPI(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 100; // only check occasionally for incoming connections
|
||||||
|
}
|
58
src/mesh/eth/ethServerAPI.h
Normal file
58
src/mesh/eth/ethServerAPI.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "StreamAPI.h"
|
||||||
|
#include <RAK13800_W5100S.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides both debug printing and, if the client starts sending protobufs to us, switches to send/receive protobufs
|
||||||
|
* (and starts dropping debug printing - FIXME, eventually those prints should be encapsulated in protobufs).
|
||||||
|
*/
|
||||||
|
class ethServerAPI : public StreamAPI
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
EthernetClient client;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ethServerAPI(EthernetClient &_client);
|
||||||
|
|
||||||
|
virtual ~ethServerAPI();
|
||||||
|
|
||||||
|
/// override close to also shutdown the TCP link
|
||||||
|
virtual void close();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// We override this method to prevent publishing EVENT_SERIAL_CONNECTED/DISCONNECTED for wifi links (we want the board to
|
||||||
|
/// stay in the POWERED state to prevent disabling wifi)
|
||||||
|
virtual void onConnectionChanged(bool connected) override {}
|
||||||
|
|
||||||
|
virtual int32_t runOnce() override; // Check for dropped client connections
|
||||||
|
|
||||||
|
/// Check the current underlying physical link to see if the client is currently connected
|
||||||
|
virtual bool checkIsConnected() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listens for incoming connections and does accepts and creates instances of WiFiServerAPI as needed
|
||||||
|
*/
|
||||||
|
class ethServerPort : public EthernetServer, private concurrency::OSThread
|
||||||
|
{
|
||||||
|
/** The currently open port
|
||||||
|
*
|
||||||
|
* FIXME: We currently only allow one open TCP connection at a time, because we depend on the loop() call in this class to
|
||||||
|
* delegate to the worker. Once coroutines are implemented we can relax this restriction.
|
||||||
|
*/
|
||||||
|
ethServerAPI *openAPI = NULL;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ethServerPort(int port);
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
/// If an api server is running, we try to spit out debug 'serial' characters there
|
||||||
|
static void debugOut(char c);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int32_t runOnce() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
void initApiServer(int port=4403);
|
@ -8,7 +8,9 @@
|
|||||||
#include "mesh/generated/mqtt.pb.h"
|
#include "mesh/generated/mqtt.pb.h"
|
||||||
#include "mesh/generated/telemetry.pb.h"
|
#include "mesh/generated/telemetry.pb.h"
|
||||||
#include "sleep.h"
|
#include "sleep.h"
|
||||||
|
#if HAS_WIFI
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
|
#endif
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <json11.hpp>
|
#include <json11.hpp>
|
||||||
|
|
||||||
@ -105,6 +107,11 @@ MQTT::MQTT() : concurrency::OSThread("mqtt"), pubSub(mqttClient)
|
|||||||
// preflightSleepObserver.observe(&preflightSleep);
|
// preflightSleepObserver.observe(&preflightSleep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MQTT::connected()
|
||||||
|
{
|
||||||
|
return pubSub.connected();
|
||||||
|
}
|
||||||
|
|
||||||
void MQTT::reconnect()
|
void MQTT::reconnect()
|
||||||
{
|
{
|
||||||
if (wantsLink()) {
|
if (wantsLink()) {
|
||||||
@ -189,7 +196,13 @@ bool MQTT::wantsLink() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HAS_WIFI
|
||||||
return hasChannel && WiFi.isConnected();
|
return hasChannel && WiFi.isConnected();
|
||||||
|
#endif
|
||||||
|
#if HAS_ETHERNET
|
||||||
|
return hasChannel && (Ethernet.linkStatus() == LinkON);
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t MQTT::runOnce()
|
int32_t MQTT::runOnce()
|
||||||
@ -346,9 +359,9 @@ std::string MQTT::downstreamPacketToJson(MeshPacket *mp)
|
|||||||
msgPayload = Json::object{
|
msgPayload = Json::object{
|
||||||
{"time", (int)decoded->time},
|
{"time", (int)decoded->time},
|
||||||
{"pos_timestamp", (int)decoded->timestamp},
|
{"pos_timestamp", (int)decoded->timestamp},
|
||||||
{"latitude_i", decoded->latitude_i},
|
{"latitude_i", (int)decoded->latitude_i},
|
||||||
{"longitude_i", decoded->longitude_i},
|
{"longitude_i", (int)decoded->longitude_i},
|
||||||
{"altitude", decoded->altitude}
|
{"altitude", (int)decoded->altitude}
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
DEBUG_MSG("Error decoding protobuf for position message!\n");
|
DEBUG_MSG("Error decoding protobuf for position message!\n");
|
||||||
@ -371,8 +384,8 @@ std::string MQTT::downstreamPacketToJson(MeshPacket *mp)
|
|||||||
{"description", decoded->description},
|
{"description", decoded->description},
|
||||||
{"expire", (int)decoded->expire},
|
{"expire", (int)decoded->expire},
|
||||||
{"locked", decoded->locked},
|
{"locked", decoded->locked},
|
||||||
{"latitude_i", decoded->latitude_i},
|
{"latitude_i", (int)decoded->latitude_i},
|
||||||
{"longitude_i", decoded->longitude_i},
|
{"longitude_i", (int)decoded->longitude_i},
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
DEBUG_MSG("Error decoding protobuf for position message!\n");
|
DEBUG_MSG("Error decoding protobuf for position message!\n");
|
||||||
|
@ -5,7 +5,12 @@
|
|||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
#include "mesh/Channels.h"
|
#include "mesh/Channels.h"
|
||||||
#include <PubSubClient.h>
|
#include <PubSubClient.h>
|
||||||
|
#if HAS_WIFI
|
||||||
#include <WiFiClient.h>
|
#include <WiFiClient.h>
|
||||||
|
#endif
|
||||||
|
#if HAS_ETHERNET
|
||||||
|
#include <EthernetClient.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Our wrapper/singleton for sending/receiving MQTT "udp" packets. This object isolates the MQTT protocol implementation from
|
* Our wrapper/singleton for sending/receiving MQTT "udp" packets. This object isolates the MQTT protocol implementation from
|
||||||
@ -16,7 +21,12 @@ class MQTT : private concurrency::OSThread
|
|||||||
// supposedly the current version is busted:
|
// supposedly the current version is busted:
|
||||||
// http://www.iotsharing.com/2017/08/how-to-use-esp32-mqtts-with-mqtts-mosquitto-broker-tls-ssl.html
|
// http://www.iotsharing.com/2017/08/how-to-use-esp32-mqtts-with-mqtts-mosquitto-broker-tls-ssl.html
|
||||||
// WiFiClientSecure wifiClient;
|
// WiFiClientSecure wifiClient;
|
||||||
|
#if HAS_WIFI
|
||||||
WiFiClient mqttClient;
|
WiFiClient mqttClient;
|
||||||
|
#endif
|
||||||
|
#if HAS_ETHERNET
|
||||||
|
EthernetClient mqttClient;
|
||||||
|
#endif
|
||||||
PubSubClient pubSub;
|
PubSubClient pubSub;
|
||||||
|
|
||||||
// instead we supress sleep from our runOnce() callback
|
// instead we supress sleep from our runOnce() callback
|
||||||
@ -39,6 +49,8 @@ class MQTT : private concurrency::OSThread
|
|||||||
*/
|
*/
|
||||||
void reconnect();
|
void reconnect();
|
||||||
|
|
||||||
|
bool connected();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int32_t runOnce() override;
|
virtual int32_t runOnce() override;
|
||||||
|
|
||||||
|
27
src/network-stubs.cpp
Normal file
27
src/network-stubs.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include "configuration.h"
|
||||||
|
|
||||||
|
#if (HAS_WIFI == 0)
|
||||||
|
|
||||||
|
bool initWifi(bool forceSoftAP) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deinitWifi() {}
|
||||||
|
|
||||||
|
bool isWifiAvailable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (HAS_ETHERNET == 0)
|
||||||
|
|
||||||
|
bool initEthernet() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isEthernetAvailable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,19 +0,0 @@
|
|||||||
//#include "mesh/wifi/WebServer.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
|
|
||||||
#ifndef ARCH_ESP32
|
|
||||||
|
|
||||||
//#include "mesh/wifi/WiFiAPClient.h"
|
|
||||||
|
|
||||||
bool initWifi(bool forceSoftAP) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void deinitWifi() {}
|
|
||||||
|
|
||||||
bool isWifiAvailable()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -3,10 +3,12 @@
|
|||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = wiscore_rak4631
|
board = wiscore_rak4631
|
||||||
build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631 -D RAK_4631
|
build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631 -D RAK_4631
|
||||||
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631>
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631> +<mesh/eth/> +<mqtt/>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${nrf52840_base.lib_deps}
|
${nrf52840_base.lib_deps}
|
||||||
|
${networking_base.lib_deps}
|
||||||
melopero/Melopero RV3028@^1.1.0
|
melopero/Melopero RV3028@^1.1.0
|
||||||
|
https://github.com/caveman99/RAK13800-W5100S.git#main
|
||||||
debug_tool = jlink
|
debug_tool = jlink
|
||||||
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
;upload_protocol = jlink
|
;upload_protocol = jlink
|
@ -229,6 +229,12 @@ static const uint8_t SCK = PIN_SPI_SCK;
|
|||||||
|
|
||||||
#define HAS_RTC 1
|
#define HAS_RTC 1
|
||||||
|
|
||||||
|
#define HAS_ETHERNET 1
|
||||||
|
|
||||||
|
#define PIN_ETHERNET_RESET 21
|
||||||
|
#define PIN_ETHERNET_SS PIN_EINK_CS
|
||||||
|
#define ETH_SPI_PORT SPI1
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user