Вывод IPAddress в HTML
- Войдите на сайт для отправки комментариев
Вс, 17/01/2016 - 11:55
Помогите, пожалуйста, разобраться:
Глобальной переменной IPAddress LOCAL_IP_ADR присваевается значение 192.168.1.79
При попытке вывести значение в HTML выводится 1325508800
При попытке поставить внутрь анкера (html-ссылки, a href=) - выводит наоборот - 79.1.168.192
#include <ESP8266WiFi.h> const char* ssid = "BormanSecret"; const char* password = "124borman"; WiFiServer server(80); int val = 0; int pinRelay1 = 14; IPAddress LOCAL_IP_ADR; // ТУТ ОБЪЯВЛЯЕМ ГЛОБАЛЬНУЮ ПЕРЕМЕННУЮ LOCAL_IP_ADR void setup() { Serial.begin(115200); delay(10); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address LOCAL_IP_ADR = WiFi.localIP(); // ПЕРЕДВЁМ В LOCAL_IP_ADR ЗНАЧЕНИЯ Serial.println(LOCAL_IP_ADR); // В МОНИТОРЕ ПОРТА ВЫВОДИТСЯ 192.168.1.79 } void loop() { // ПРОВЕРКА ПОДКЛЮЧЕНИЯ КЛИЕНТА WiFiClient client = server.available(); if (!client) { return; } // ЖДЁМ КЛИЕНТА Serial.println("new client"); while(!client.available()){ delay(1); } // ЧТЕНИЕ СТРОКИ ЗАПРОСА String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // ОБРАБОТКА СТРОКИ ЗАПРОСА if (req.indexOf("/status") != -1) int stat = 1; else { Serial.println("invalid request"); client.stop(); return; } client.flush(); // ПОДГОТОВКА HTML-страницы String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nRefresh: 5\r\n\r\n<!DOCTYPE HTML>\r\n<meta http-equiv='content-type' content='text/html; charset=UTF-8'>\r\n<title>Данные с датчиков</title>\r\n"; s += "<html>\r\nЛокальный IP устройства: "; s += LOCAL_IP_ADR; // ВЫВОДИТ 1325508800 s += "<br><a href=http://"; s += LOCAL_IP_ADR; // ВЫВОДИТ АДРЕС НАОБОРОТ: 79.1.168.192 s += "/gpio/0>включить</a>"; s += "</html>\n"; // ОТПРАВКА СТРАНИЦЫ КЛИЕНТУ client.print(s); delay(1000); Serial.println("Client disonnected"); }
Вобще запутался. Хочется добиться нормального вывода IPAddress внутри строки String при подготовке html-страницы.
Borman,
а с чего Вы взяли, что переменная типа IPAddress должна как-то осмысленно преобразовываться к String?
В сериал он печатается правильно потому, что он поддерживает интерфейс Printable.
Что же до преобразований, то в нём нет операторов преобразования типа. То что в двух местах по-разному - забавно, конечно, но объяснимо - компилятор находит первое подходящее преобразование.
Если Вам нужно осмысленное преобразование IPAddress к String, необходимо добавить его "ручками".
Преобразование IPAddress к String совсем не обязательно.
Нужно найти тип переменной для хранения данных типа "192.168.1.79" и вывода данных в String
Ничего не понимаю, так Вам не нужен IPAddress? А зачем использовали? Храните сразу в String, кто не даёт? А если нужен, так добавьте ему преобразование в String (лучше в char *) делов-то.
bite // WiFi.localIP(); пишет только первый байт айпишника "192"
char // пишет символ "A"
int // понятно, что не будет работать, выдаст те самые "1325508800"
При попытке объявить глобальную String LOCAL_IP_ADR;
компилятор выдаёт ошибку в строке LOCAL_IP_ADR = WiFi.localIP();
exit status 1
ambiguous overload for 'operator=' (operand types are 'String' and 'IPAddress')
String ip_addr = LOCAL_IP_ADR.ToString(); // НЕ РАБОТАЕТ!
ОШИБКА:
'class IPAddress' has no member named 'ToString'
Простите. Вы уж разберитесь. что Вам надо. Если Вам надо получать значения от WiFi.localIP, то Вам нужен типп IPAddress.
Ну, а если нужен и Вы при этом хотите, чтобы этот IPAddress преобразовывался к строке, Вам просто нужно добавить ему такое преобразование. Ну, нет у него готового.
Или чего Вам надо-то?
String ip_addr = LOCAL_IP_ADR.ToString(); // НЕ РАБОТАЕТ!
ОШИБКА:
'class IPAddress' has no member named 'ToString'
Блин, и не будет! Нет у него метода toString! Нет там преобразования - его добавить нужно, я Вам уж полдня про это талдычу.
НУЖНО:
в СТРОКЕ
выводить значения из
WiFi.localIP();
Ещё интересней: вывод WiFi.localIP(); выдаёт разные значения
Ну, а потом нужно преобразовывать IPAddress в строку, так?
Значит нужно добавить ему такое преобразование, т.к. родного у него просто нет.
Что значит "добавить преобразование"?
Что значит "родное преобразование"?
14-й час мучаю этот IPAddress...
У люого класса есть какие-то методы (например, преобразование к другим типам). У класса IPAddress есть методы преобразования к uint32_t и к указателю на uint8_t. А метода преобразования к char * у него нет.
Методы преобразования - обычные функции. Если какой-то нет, надо просто дописать.
Т.е. Вам нужно, определить новый класс, пронаследованный от IPAddress в котором будет определена функция - преобразование к String (или к char *) и использовать этот класс, а не оригинальный IPAddress.
Вот, собственно и всё.
14-й час мучаю этот IPAddress...
а чего его мучать? Вы не умеете переопределять классы? Так Вы себя мучаете, а не его. Сейчас. дайте мне 10 минут, я Вам пример сделаю ...
Можно сделать без добавления метода к классу (просто функция)
а можно с добавлением метода
Выбирайте, как Вам нравится.
Даже не смог найти документацию по методам IPAddress :(
Наверное, разумнее преобразовывать IPAddress в массив байт, однако конструкция
byte loc_ip[4] = WiFi.localIP()
выдаёт ошибку
exit status 1
array must be initialized with a brace-enclosed initializer
Даже не смог найти документацию по методам IPAddress :(
Наверное, разумнее преобразовывать IPAddress в массив байт, однако конструкция
byte loc_ip[4] = WiFi.localIP()
выдаёт ошибку
exit status 1
array must be initialized with a brace-enclosed initializer
Ну, я Вам уже написал преобразование к char *, Но если Вам хочется к массиву байтов, так у него есть для этого специальный метод - взятие индекса. Типа такого должно работать:
Всё, все четыре числа сидят в массиве.
А документация, так у Вас же его текст есть, чего ещё надо. текст (файлы IPAddress.h и IPAddress.cpp) находится в фолдере <где стоит IDE>\hardware\arduino\avr\cores\arduino Открываете файлы и смотрите - там всё написано.
Отлично!
Последний пример - то, что надо: коротко и понятно. С хранением IP в массиве байт разобрался.
Спасибо!
Осталось понять: как байт в unsigned int8 преобразовать в строку?
Выводит ffset: %04x
Нет ли готового метода преобразования?
Ну, блин, возьмите лучше первый пример из поста 15. Всё равно тоже самое делать. если массив преобразовывать.
Не совсем то же самое...
В массиве байт удобно хранить данные IPAddress, в том числе писать в ПЗУ.
Однако ещё стоит задача отдать эти данные удалённому пользователю ИЧМ в строке, по HTTP, $_GET и $_POST
а также принять эти данные от пользователя, то же по HTTP $_GET и $_POST.
К сожалению, тут без преобразования byte[] в String и обратно не обойтись...
К сожалению, тут без преобразования byte[] в String и обратно не обойтись...
Ну, не обойтись, так преобразовывайте, только Вы зачем-то их не в String, а в char преобразовываете. Зачем? Замените char на String и будет Вам счастье. Вот так, примерно:
А не пробовали ? String ip_addr = String(WiFi.localIP());
До места доберусь не скоро сам не могу попробовать :)
К сожалению, тут без преобразования byte[] в String и обратно не обойтись...
Ну, не обойтись, так преобразовывайте, только Вы зачем-то их не в String, а в char преобразовываете. Зачем? Замените char на String и будет Вам счастье. Вот так, примерно:
Спасибо!
Что-то сам не сообразил... Видать, усталось, надо делать перерывы...
А не пробовали ? String ip_addr = String(WiFi.localIP());
До места доберусь не скоро сам не могу попробовать :)
Не работает :(
По идее - 1325508800 это какая-то операция с 192.168.1.79, только вот понять - какая...
По идее - 1325508800 это какая-то операция с 192.168.1.79, только вот понять - какая...
Понятно какая - они рассматриваются как одно 32-разрядное число. Именно его Вы и видите.
Переведите 1325508800 в hex и все сразу встанет на свои места
32 битное делим на 4 части по 8 бит, получается для каждого знака IP выделен 1 байт
1325508800=4F01A8C0h
C0h=192
A8h=168
01h=1
4Fh=79
Извиняюсь, подправил корректное отображение точек
Borman,
а с чего Вы взяли, что переменная типа IPAddress должна как-то осмысленно преобразовываться к String?
Есть такая библиотека inet.h (у ESPшек точно есть).
В ней две функции inet_ntoa() и inet_aton().
ТС, почитайте про них в гугле.
А вот что автор искал: разложение IP адреса на байты. Ресурсоемко!
А вот что автор искал: разложение IP адреса на байты. Ресурсоемко!
а чем вам inet_aton то не угодил? разве это не короче?
"'inet_aton' was not declared in this scope"
не компилируется. В чем может быть проблема?
https://links2004.github.io/Arduino/d3/d7c/class_d_n_s_client.html#acb77...
Есть такая библиотека inet.h (у ESPшек точно есть).
IPAddress secondaryDNS(8, 8, 4, 4);
Serial.println(secondaryDNS.toString ());
если использовать SQL то проблем вообще нет )))
Данные по температуре и влажности за последние 240 минут!
если использовать SQL то
Я даже когда пишу программу (фигню) работы с файлами (по типу истории, или там данные нужно собирать с файлов) - всегда СУБД использую и ближе мне MySQL или mariadb - потом данные из СУБД проще обрабатывать. Отчеты строить или еще что (привычка с php наверное). И это я вообще не программист, так - для себя чисто.
Заметку сразу делаю На ESP32 ip char to int:
http://www.nongnu.org/lwip/2_0_x/ip4__addr_8h.html тут непонятное мне описание lwip/ip4_addr.h
блин, опять эта тупая тема...
Вы запоминаете IP как uint32_t. И печатаете как uint32_t...
вот и получается 1838657955 - что непонятно?
Да, так я делаю. uint_32t понятно. Именно такой результат и ожидаем.
Пример использования
А непонятно применение lwip/ip4addr.h и где об этом почитать. По ссылке из прежнего моего поста непонятно как функции работают к примеру
А если реверснуть биты в uint32_t, то браузер спокойно откроет ссылку с интом вида http://12321434344
negavoid2 теме 5 лет, браузеру уже не актуально, а варианты работы с IP накидать сюда можно думаю. Или лучше отдельную тему создать? Я просто как заметку оставил что такой вариант возможен char в uint32t превратить на ESP32
Ну и честно говоря немного заблудился с форумами, вроде и среда разработки Arduino, а вроде уже и функции из FreeRTOS начались и библиотеки встроенные в ядро ардуиноESP из GNU.
блин, опять эта тупая тема...
Вы запоминаете IP как uint32_t. И печатаете как uint32_t...
вот и получается 1838657955 - что непонятно?
Семьсот седьмой, ты так и не разъяснил где почитать о "lwip/ip4addr.h" а я так и не понял как IP адрес (printable) напечатать. Serial.print(IPAddress.toString ());
В Wiring экземпляр класса IPAddress вполне себе печатается безо всяких извращений.