|
@@ -50,6 +50,7 @@ static void sntp_sync_cb(struct timeval *tv)
|
|
|
sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED); // Until first sync
|
|
|
if (prev_sync_status != sync_status) {
|
|
|
printf("[SNTP] time synchronization lost\n");
|
|
|
+ setenv_bool("status.net.sntp.sync", false);
|
|
|
}
|
|
|
break;
|
|
|
case SNTP_SYNC_STATUS_COMPLETED:
|
|
@@ -59,6 +60,7 @@ static void sntp_sync_cb(struct timeval *tv)
|
|
|
const struct tm *tm = localtime(&tv->tv_sec);
|
|
|
strftime(timebuf, sizeof timebuf, "%a %Y-%m-%d %H:%M:%S %z", tm);
|
|
|
printf("[SNTP] Time synchronized: %s\n", timebuf);
|
|
|
+ setenv_bool("status.net.sntp.sync", true);
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
@@ -70,6 +72,8 @@ static void sntp_sync_cb(struct timeval *tv)
|
|
|
|
|
|
static void my_sntp_start()
|
|
|
{
|
|
|
+ setenv_bool("status.net.sntp.sync", false);
|
|
|
+
|
|
|
if (getenv_bool("sntp.enabled")) {
|
|
|
sntp_set_time_sync_notification_cb(sntp_sync_cb);
|
|
|
sntp_setoperatingmode(SNTP_OPMODE_POLL);
|
|
@@ -112,6 +116,7 @@ static void start_services(void)
|
|
|
|
|
|
dns_ip = dns_getserver(0);
|
|
|
printf("[DNS] DNS server: %s\n", inet_ntoa(*dns_ip));
|
|
|
+ setenv("status.net.dns.server", inet_ntoa(*dns_ip), 1);
|
|
|
|
|
|
// If Arduino supported both of these at the same that would be
|
|
|
// awesome, but it requires ESP-IDF reconfiguration...
|
|
@@ -125,8 +130,13 @@ static void start_services(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!invalid_ip(sntp_ip))
|
|
|
- printf("[SNTP] Time server: %s\n", inet_ntoa(*sntp_ip));
|
|
|
+ if (!invalid_ip(sntp_ip)) {
|
|
|
+ const char *sntp_server = inet_ntoa(*sntp_ip);
|
|
|
+ printf("[SNTP] Time server: %s\n", sntp_server);
|
|
|
+ setenv("status.net.sntp.server", sntp_server, 1);
|
|
|
+ } else {
|
|
|
+ unsetenv("status.net.sntp.server");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Only run on first start */
|
|
@@ -137,11 +147,20 @@ static void start_services(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static String wifi_local_ip(void)
|
|
|
+static const char *ip_str(const IPAddress &ip)
|
|
|
+{
|
|
|
+ static char ip_buf[4*4];
|
|
|
+ const IPAddress ip_none(0,0,0,0);
|
|
|
+ return strcpy(ip_buf, ip == ip_none ? "" : ip.toString().c_str());
|
|
|
+}
|
|
|
+
|
|
|
+static void setenv_ip(const char *var, const IPAddress &ip)
|
|
|
{
|
|
|
- return WiFi.localIP().toString();
|
|
|
+ setenv_config(var, ip_str(ip));
|
|
|
}
|
|
|
|
|
|
+static bool force_conn_update;
|
|
|
+
|
|
|
static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
{
|
|
|
bool retry_sta = false;
|
|
@@ -151,9 +170,13 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
CON_ETH = 2,
|
|
|
CON_AP = 4
|
|
|
};
|
|
|
- static int connected;
|
|
|
+ static unsigned int connected;
|
|
|
+ unsigned int prev_connected = connected;
|
|
|
static int ap_clients = 0;
|
|
|
-
|
|
|
+ int prev_ap_clients = ap_clients;
|
|
|
+ IPAddress wifi_local_ip = WiFi.localIP();
|
|
|
+ const char *local_ip = ip_str(wifi_local_ip);
|
|
|
+
|
|
|
switch (event) {
|
|
|
case ARDUINO_EVENT_WIFI_READY:
|
|
|
printf("[WIFI] Interface ready\n");
|
|
@@ -180,15 +203,19 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
printf("[WIFI] Authentication mode of access point has changed\n");
|
|
|
break;
|
|
|
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
|
|
|
- printf("[WIFI] Obtained IP address: %s\n", wifi_local_ip().c_str());
|
|
|
+ {
|
|
|
+ printf("[WIFI] Obtained IP address: %s\n", local_ip);
|
|
|
connected |= CON_STA;
|
|
|
is_connect = true;
|
|
|
break;
|
|
|
+ }
|
|
|
case ARDUINO_EVENT_WIFI_STA_LOST_IP:
|
|
|
- printf("[WIFI] Lost IP address and IP address is reset to 0\n");
|
|
|
+ {
|
|
|
+ printf("[WIFI] Lost IP address\n");
|
|
|
connected &= ~CON_STA;
|
|
|
retry_sta = true;
|
|
|
break;
|
|
|
+ }
|
|
|
case ARDUINO_EVENT_WPS_ER_SUCCESS:
|
|
|
printf("[WIFI] WiFi Protected Setup (WPS): succeeded in enrollee mode\n");
|
|
|
break;
|
|
@@ -254,9 +281,10 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
retry_sta = true;
|
|
|
break;
|
|
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
|
|
- printf("[ETH] Obtained IP address: %s\n", wifi_local_ip().c_str());
|
|
|
+ printf("[ETH] Obtained IP address: %s\n", local_ip);
|
|
|
connected |= CON_ETH;
|
|
|
is_connect = true;
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -269,23 +297,59 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
sta_timeout_enable();
|
|
|
}
|
|
|
|
|
|
- if (ssid == "") {
|
|
|
- // No network configured
|
|
|
- led_set(LED_GREEN, connected & CON_AP ? LED_FLASH_SLOW : LED_OFF);
|
|
|
- } else {
|
|
|
- led_set(LED_GREEN, connected & CON_AP ? LED_FLASH_FAST : LED_ON);
|
|
|
+ unsigned int conn_change = force_conn_update ?
|
|
|
+ -1U : (connected ^ prev_connected);
|
|
|
+
|
|
|
+ if (conn_change) {
|
|
|
+ force_conn_update = false;
|
|
|
+
|
|
|
+ if (conn_change & CON_STA) {
|
|
|
+ setenv_bool("status.net.sta.conn", connected & CON_STA);
|
|
|
+ setenv_config("status.net.sta.ip4",
|
|
|
+ connected & CON_STA ? local_ip : "");
|
|
|
+ setenv_ip("status.net.sta.ip4.mask", WiFi.subnetMask());
|
|
|
+ setenv_ip("status.net.sta.ip4.gw", WiFi.gatewayIP());
|
|
|
+ }
|
|
|
+ if (conn_change & CON_AP)
|
|
|
+ setenv_bool("status.net.ap.conn", connected & CON_AP);
|
|
|
+ if (conn_change & CON_ETH) {
|
|
|
+ setenv_bool("status.net.eth.conn", connected & CON_ETH);
|
|
|
+ setenv_config("status.net.eth.ip4",
|
|
|
+ connected & CON_ETH ? local_ip : "");
|
|
|
+ setenv_ip("status.net.eth.ip4.mask", WiFi.subnetMask());
|
|
|
+ setenv_ip("status.net.eth.ip4.gw", WiFi.gatewayIP());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ssid == "") {
|
|
|
+ // No network configured
|
|
|
+ led_set(LED_GREEN, connected & CON_AP ? LED_FLASH_SLOW : LED_OFF);
|
|
|
+ } else {
|
|
|
+ led_set(LED_GREEN, connected & CON_AP ? LED_FLASH_FAST : LED_ON);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- /* Maybe need to do these in a different thread? */
|
|
|
if (is_connect) {
|
|
|
start_services();
|
|
|
}
|
|
|
+
|
|
|
+ if (ap_clients != prev_ap_clients)
|
|
|
+ setenv_ul("status.net.ap.clients", ap_clients);
|
|
|
+
|
|
|
if (retry_sta) {
|
|
|
WiFi.disconnect();
|
|
|
WiFi.begin();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void setenv_mac(const char *var, const uint8_t mac[6])
|
|
|
+{
|
|
|
+ char mac_str[3*6];
|
|
|
+
|
|
|
+ snprintf(mac_str, sizeof mac_str, "%02x:%02x:%02x:%02x:%02x:%02x",
|
|
|
+ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
|
|
+ setenv(var, mac_str, 1);
|
|
|
+}
|
|
|
+
|
|
|
static void wifi_config_ap(void)
|
|
|
{
|
|
|
/* No network configuration set */
|
|
@@ -294,38 +358,40 @@ static void wifi_config_ap(void)
|
|
|
IPAddress AP_Gateway = IPAddress(0,0,0,0); // No gateway
|
|
|
unsigned int channel = time(NULL) % 11; // Pseudo-random
|
|
|
uint8_t mac[6];
|
|
|
+ char mac_str[6*3];
|
|
|
char ap_ssid[64];
|
|
|
|
|
|
- WiFi.macAddress(mac);
|
|
|
+ WiFi.softAPmacAddress(mac);
|
|
|
+ setenv_mac("status.net.ap.mac", mac);
|
|
|
/* The last two bytes of the MAC */
|
|
|
snprintf(ap_ssid, sizeof ap_ssid, "MAX80_%02X%02X", mac[4], mac[5]);
|
|
|
-
|
|
|
+
|
|
|
printf("[WIFI] AP SSID %s IP %s netmask %s channel %u\n",
|
|
|
ap_ssid, AP_IP.toString(), AP_Netmask.toString(), channel+1);
|
|
|
+ setenv("status.net.ap.ssid", ap_ssid, 1);
|
|
|
+ setenv_ip("status.net.ap.ip4", AP_IP);
|
|
|
+ setenv_ip("status.net.ap.ip4.mask", AP_Netmask);
|
|
|
+ setenv_ul("status.net.ap.clients", 0);
|
|
|
|
|
|
- printf("WiFi.softAP\n");
|
|
|
-
|
|
|
WiFi.softAP(ap_ssid, NULL, channel+1, 0, 4, true);
|
|
|
-
|
|
|
- printf("WiFi.softAPConfig\n");
|
|
|
WiFi.softAPConfig(AP_IP, AP_Gateway, AP_Netmask);
|
|
|
-
|
|
|
- printf("WiFi.softAPsetHostname\n");
|
|
|
WiFi.softAPsetHostname(ap_ssid);
|
|
|
|
|
|
// Conservative setting: 20 MHz (single channel) only; this is for
|
|
|
// reliability, not performance.
|
|
|
- printf("esp_wifi_set_bandwidth\n");
|
|
|
esp_wifi_set_bandwidth((wifi_interface_t)ESP_IF_WIFI_AP, WIFI_BW_HT20);
|
|
|
|
|
|
- printf("WiFi.enableAP\n");
|
|
|
+ // Enable unconditionally if no SSID
|
|
|
WiFi.enableAP(ssid == "");
|
|
|
-
|
|
|
- printf("wifi_config_ap done\n");
|
|
|
}
|
|
|
|
|
|
static void wifi_config_sta(void)
|
|
|
{
|
|
|
+ uint8_t mac[6];
|
|
|
+ WiFi.macAddress(mac);
|
|
|
+ setenv_mac("status.net.sta.mac", mac);
|
|
|
+
|
|
|
+ setenv("status.net.sta.ssid", ssid.c_str(), 1);
|
|
|
if (ssid == "") {
|
|
|
WiFi.enableSTA(false);
|
|
|
return;
|
|
@@ -349,6 +415,8 @@ static void wifi_config(void)
|
|
|
hostname = getenv("hostname");
|
|
|
dnsserver = getenv("ip4.dns");
|
|
|
|
|
|
+ force_conn_update = true;
|
|
|
+
|
|
|
WiFi.persistent(false);
|
|
|
WiFi.setSleep(false);
|
|
|
|