@gidiara666, портал работает поверх SDK микропроцессора (RTOS или callback) и я упоминал, что переключение сетевого соединения - не его задача, хотя для Wi-Fi предусмотрено переключение между AP и router.
MDNS.notifyAPChange();
MDNS.update();
portal.stop();
portal.start("name");
MDNS.begin("name", WiFi.localIP(), 10)
ESP32 | W5500 |
---|---|
GPIO18 | SCK |
GPIO19 | MISO |
GPIO23 | MOSI |
GPIO5 | CS |
ENABLE | RST |
5V | 5V |
GND | GND |
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <NTPClient.h>
#define ETHERNET_CS_PIN 5
uint8_t mac_ethernet[6] = {'\0'};
const long utcOffsetInSeconds = 7200 + 3600; // UTC +2 літній час +1
EthernetUDP ethClient;
NTPClient timeClient(ethClient, "pool.ntp.org", utcOffsetInSeconds);
void ethernet_mac(uint8_t *_mac)
{
uint8_t mac_this[6];
if (esp_base_mac_addr_get(mac_this) != ESP_OK)
{
esp_efuse_mac_get_default(mac_this);
for (int i = 0; i < 6; i++)
{
_mac[i] = mac_this[i];
if (i == 5)
{
_mac[i] = mac_this[i] + 1;
}
}
}
}
void setup()
{
Serial.begin(115200);
ethernet_mac(mac_ethernet);
Ethernet.init(ETHERNET_CS_PIN);
Ethernet.begin(mac_ethernet, 1000, 1000);
Serial.println(Ethernet.localIP());
timeClient.begin();
}
void print_time()
{
if (!timeClient.update())
{
Serial.println("Error get time !");
return;
}
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
}
void loop()
{
static unsigned int timer = 0;
if ((millis() - timer) > 1000)
{
timer = millis();
print_time();
}
Ethernet.maintain();
}
//////////// wifi
void wifi_connected() {
WiFi.mode(WIFI_STA);
// WiFi.mode(WIFI_MODE_APSTA); //Поддерживается только прекрасным ESP32!!!
byte tries = 60; //60 сек ожидаем подключения к wifi, пытаясь к нему...
WiFi.begin(wifi-ssid, wifi-pass);
while (--tries && WiFi.status() != WL_CONNECTED) {
Serial.print (".");
delay(1000);
//____________
if(WiFi.status() == WL_CONNECTED) //If WiFi connected to hot spot then start DNSServer
{
Serial.println (WiFi.localIP());
//+++++++++++++++++++++
const char *server_name = "www.myesp32.com";
DNSServer dnsServer;
IPAddress apIP(192, 168, 88, 100); // ; прибит железным гвоздём адрес из pool mikrotik
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
const byte DNS_PORT = 53;
Serial.println ("ESP_WIFI_PORTAL, IP : ");
Serial.println (apIP);
dnsServer.start(DNS_PORT, server_name, apIP);
Serial.println ("DNS name: www.myesp32.com.local");
}
}
if (WiFi.status() != WL_CONNECTED) {
// Если не удалось подключиться запускаем в режиме AP
IPAddress apIP(10, 10, 10, 1); //обозначил постоянный адрес AP
IPAddress subnet(255, 255, 255, 0);
Serial.println ("WiFi up ACCESS POINT: ");
Serial.println (ssidAP);
Serial.println ("Start Settings IP: ");
Serial.println (apIP);
// Отключаем WIFI
WiFi.disconnect();
// Меняем режим на режим точки доступа
WiFi.mode(WIFI_AP);
// Задаем настройки сети
WiFi.softAPConfig(apIP, apIP, subnet);
// Включаем WIFI в режиме точки доступа с именем и паролем
// хранящихся в переменных _ssidAP _passwordAP
WiFi.softAP(ssidAP, passAP);
//_______________
DNSServer dnsServer;
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
const byte DNS_PORT = 53;
const char [I]server_name = "www.myesp32.com"; // Can be "[/I]" to all DNS requests
dnsServer.start(DNS_PORT, server_name, apIP);
Serial.println ("DNS name: www.myesp32.com.local");
//_______________
ui.attachBuild(build);
ui.attach(action);
ui.start();
ui.enableOTA(ota_name, ota_pass);
ui.start(web_start);
// включить авторизацию
ui.enableAuth("admin", "admin");
} else {
Serial.println ("");
Serial.println ("WiFi запущен");
Serial.println (WiFi.SSID());
Serial.print ("IP адрес: ");
Serial.println (WiFi.localIP());
ui.attachBuild(build);
ui.attach(action);
ui.start(web_start);
// включить авторизацию, она в GP конченая и работает не на пункт меню, а на всё...
ui.enableAuth("admin", "admin");
ui.enableOTA(ota_name, ota_pass);
}
}
Да mDNS-то работает отлично, только после первого запуска раз и навсегда) Пока решил эту проблему программной перезагрузкой. Некрасиво, зато работает. А то юзеру никак не объяснишь, что после перенастройки wifi и до перезапуска девайс будет доступен только по IP, который вдобавок непонятно где искать.Всё в GP хорошо, кроме mDNS и отсутствия кнопки, изменяющей цвет и состояние по нажатию .
А с GP оно точно нормально уживается?Рекомендую использовать #include <DNSServer.h>
tempData = doc["devices"][0]["sensors"][3]["value"];
doc["devices"][var1]["sensors"][var2]["value"]
переход с GP на GH у меня прошел легко)Я с GP кое как разобрался
мне это не понять)Структура предвидится жёсткой
client.connect("narodmon.ru", 8283);
client.print(buf);
{
"devices": [
{
"mac": "*********",
"name": "*********",
"owner": "*******",
"lat": "**********",
"lon": "*********",
"alt": "25",
"sensors": [
{
"id": "**********",
"name": "*********",
"value": 0,
"unit": "******" ,
"time": 1693292854
},
{
"id": "********,
"name": "********",
"value": 0.00,
"unit": "*******" ,
"time": 1693292854
},
{
"id": "heap",
"name": "Память",
"value": 36184,
"unit": "byte" ,
"time": 1693292854
},
{
"id": "volts",
"name": "Напряжение питания",
"value": 0.02,
"unit": "V" ,
"time": 1693292854
},
{
"id": "volume",
"name": "Показания водосчётчика",
"value": 35.86,
"unit": "m3" ,
"time": 1693292854
}
]
}
]
}
float volts = doc["devices"][0]["sensors"][3]["value"]
int heap = doc["devices"][0]["sensors"][2]["value"]
GyverPortal это библиотека для Arduino IDE. Не совсем понятно что вы хотите в итоге получить на айфоне?Скажите пожалуйста как установить Gyver Portal V3 на IOS