HTTP/1.1 200 OK
Date: Thu, 03 May 2018 11:47:58 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 1
Connection: close
Content-Type: text/html; charset=UTF-8
7
ну я ж говорил, что ваш код работает "случайно". Чуть что измени в сервере - и все развалится. Вы совершенно не контролируете, какую именно цифру вы вытащили из ответа. Вы даже не контролируете, а есть ли ответ вообще.
а какими командами мы можем задать просмотр точной позиции ?
Я уже написал - проверяйте не по одному символу, а сначала собирайте их в строчки. Анализируйте ответ, пока не найдете пустую строку. Длина заголовка может быть разной, поэтому надо искать именно пустую строчку, а не зацикливаться на числе символов или строк.
После этого в третьей строке будет ваш символ, который ноль или один.
HTTP/1.1 200 OK
Date: Thu, 03 May 2018 11:47:58 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 1
Connection: close
Content-Type: text/html; charset=UTF-8
7
ну я ж говорил, что ваш код работает "случайно". Чуть что измени в сервере - и все развалится. Вы совершенно не контролируете, какую именно цифру вы вытащили из ответа. Вы даже не контролируете, а есть ли ответ вообще.
и как мой код работает случайно, что под этим понимать? что должно измениться чтоб все пошло не по плану. если можно пример?
С чего бы это? Посмотрите внимательно свой код. Он реагирует на любйю цифру в ответе из диапазона 0-7. При этом срабатывает последняя цифра. В том ответе, что я вам привел, это будет "0" из строки "Content-Length: 0"
у меня сервер работает уже пол года по данному примеру, и проблем не было.
да что тут спорить? Ваши аргументы примерно звучат как "я всегда монтирую проводку, не отключая рубильник - и проблем не было " :)
Этот код будет работать, ТОЛЬКО если нужный символ ВСЕГДА самый последний цифровой символ ответа сервера. А чуть что не так - и результат непредсказуем.
Правильный анализ ответа без труда ищется в инете. Причем необязательно это ответ HTPP сервера - ответы GSM-модемов/ GPS-приемников и тд - обрабатываются так же. Сначала принимаемые символы собираются в строки, а потом строки анализируются.
Кстати. для упрощения обработки лучше кодировать состояние реле не одним символом, а уникальной строкой, например "RELAY_44=ON". Такие строки искать в ответе легче, так как они не встречаются в служебных данных. Кроме того, при таком кодировании в одном ответе сервера можно передавать состояние нескольких параметров, чего ваш код не поддерживает в принципе.
у меня сервер работает уже пол года по данному примеру, и проблем не было.
да что тут спорить? Ваши аргументы примерно звучат как "я всегда монтирую проводку, не отключая рубильник - и проблем не было " :)
Этот код будет работать, ТОЛЬКО если нужный символ ВСЕГДА самый последний цифровой символ ответа сервера. А чуть что не так - и результат непредсказуем.
Правильный анализ ответа без труда ищется в инете. Причем необязательно это ответ HTPP сервера - ответы GSM-модемов/ GPS-приемников и тд - обрабатываются так же. Сначала принимаемые символы собираются в строки, а потом строки анализируются.
Кстати. для упрощения обработки лучше кодировать состояние реле не одним символом, а уникальной строкой, например "RELAY_44=ON". Такие строки искать в ответе легче, так как они не встречаются в служебных данных. Кроме того, при таком кодировании в одном ответе сервера можно передавать состояние нескольких параметров, чего ваш код не поддерживает в принципе.
прошу помочь по моему вопросу, что мне править и как задать просмотр указаного параметра
накидал для примера код, который пропускает весь заголовок и извлекает 1 символ из третьей строки блока данных. Номер строчки, откуда читается параметр, задается переменной data_string_num Строки считаются только начиная с пустой строки в конце заголовка, пустая строка имеет номер 0.
byte i, startRead, buff ;
byte data_string_num =3; // номер строки данных, откуда извлекается ответ сервера
while (client.available()) {
c = client.read();
if (c == '\r') continue;
if (c == '\n') { // найден конец строки
if ((startRead == 0) && (i == 0)) // если строка пустая - служебный заголовок закончился
{startRead = 1; continue;} // начинаем отсчитывать строки данных
if (startRead > 0) // очередная строка данных
(startRead++; continue;}
i=0; continue;
}
i++;
if (startRead == data_string_num) { // если номер строки данных равен заданному
if ( c=='1') buff=1; // извлекаем параметр из первого символа строки
if ( c=='0') buff=0;
startRead++;
}
}
прошу помочь по моему вопросу, что мне править и как задать просмотр указаного параметра
накидал для примера код, который пропускает весь заголовок и извлекает 1 символ из третьей строки блока данных. Номер строчки, откуда читается параметр, задается переменной data_string_num Строки считаются только начиная с пустой строки в конце заголовка, пустая строка имеет номер 0.
byte i, startRead, buff ;
byte data_string_num =3; // номер строки данных, откуда извлекается ответ сервера
while (client.available()) {
c = client.read();
if (c == '\r') continue;
if (c == '\n') { // найден конец строки
if ((startRead == 0) && (i == 0)) // если строка пустая - служебный заголовок закончился
{startRead = 1; continue;} // начинаем отсчитывать строки данных
if (startRead > 0) // очередная строка данных
(startRead++; continue;}
i=0; continue;
}
i++;
if (startRead == data_string_num) { // если номер строки данных равен заданному
if ( c=='1') buff=1; // извлекаем параметр из первого символа строки
if ( c=='0') buff=0;
startRead++;
}
}
тут еще в 13 строке вместо ( { поставь и запиши стоочку так char c = client.read();
у меня с такой записью не заработало( ищу где накосячил
#include <ESP8266WiFi.h>
const char* ssid = "******";
const char* password = "your-password";
WiFiClient client;
char server[] = "192.168.1.35"; // имя вашего сервера www.arduino.ru
//int buff=0;
const int led=5;
byte i, startRead, buff ;
byte data_string_num =3; // номер строки данных, откуда извлекается ответ сервера
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a 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");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
pinMode( led, OUTPUT);
digitalWrite(led, LOW);
}
void loop()
{
WiFiClient client;
if (client.connect(server, 80))
{
client.print( "GET /rele.php?");
client.println( " HTTP/1.1");
client.print( "Host: " );
client.println(server);
client.println( "Connection: close" );
client.println();
client.println();
while (client.available())
{
char c = client.read();
Serial.print(c);
if (c == '\r') continue;
if (c == '\n') { // найден конец строки
if ((startRead == 0) && (i == 0)) // если строка пустая - служебный заголовок закончился
{startRead = 1; continue;} // начинаем отсчитывать строки данных
if (startRead > 0) // очередная строка данных
{startRead++; continue;}
i=0; continue;
}
i++;
if (startRead == data_string_num) { // если номер строки данных равен заданному
if ( c=='1') buff=1; // извлекаем параметр из первого символа строки
if ( c=='0') buff=0;
startRead++;
// if ( c=='1')
// {
// buff=1;
// }
// if ( c=='0')
// {
// buff=0;
// }
}
Serial.println(buff);
client.stop();
client.flush();
delay(1000);
}
}
}
сериал выдает
WiFi connected
IP address:
192.168.1.43
H0
H0
косяк в вашей редакции моего кода. Нафига вы оператор client.stop() вставил в цикл приема сообщения? Вы же крашите канал после приема первого же символа - "H" из заголовка "HTTP..."
Все операторы строк 86-89 вынесите наружу цикла while. Или, что тоже самое - переставьте скобку со строки 90 в строку 85
косяк в вашей редакции моего кода. Нафига вы оператор client.stop() вставил в цикл приема сообщения? Вы же крашите канал после приема первого же символа - "H" из заголовка "HTTP..."
Все операторы строк 86-89 вынесите наружу цикла while. Или, что тоже самое - переставьте скобку со строки 90 в строку 85
Опять даете яблоко беззубым... Они ж его не разжуют.
пробуйте код из сообщения №74 , только строчки с 86 по 89 выкиньте совсем, а после скобки в строке 90 добавьте вывод значения buff в Serial (желательно с какой-нить строкой, типа "buff=" чтоб не спутать с другими нулями и единицами)
А что ему еще делать, если вы его заставляете печатать всё, что в буфере клиента имеется? Если этого не нужно, просто выпрыгивайте из while() и после стопа сетевого клиента чистите буфер. Кстати, flush делает немного не то, что вы ожидаете.
попробуй bytedata_string_num =2; так..... у тебя 2е значение меняется после 1й пустой строки и задержку на конце поставь 100. но тормазит порядком все равно отклик
попробуй так
твойсервер/add_data.php?temperature=1&temperature1=1
или
твойсервер/add_data.php?temperature=1&&temperature1=1
выводит 0
а если кнопку понажимать, по идее должно 0 или 1, если так то надо искать откуда беруться 3 и 0 в сериале
вот что мне выдает сервер
ну я ж говорил, что ваш код работает "случайно". Чуть что измени в сервере - и все развалится. Вы совершенно не контролируете, какую именно цифру вы вытащили из ответа. Вы даже не контролируете, а есть ли ответ вообще.
а какими командами мы можем задать просмотр точной позиции ?
а какими командами мы можем задать просмотр точной позиции ?
Я уже написал - проверяйте не по одному символу, а сначала собирайте их в строчки. Анализируйте ответ, пока не найдете пустую строку. Длина заголовка может быть разной, поэтому надо искать именно пустую строчку, а не зацикливаться на числе символов или строк.
После этого в третьей строке будет ваш символ, который ноль или один.
ок, а есть пример как это сделать?
вот что мне выдает сервер
ну я ж говорил, что ваш код работает "случайно". Чуть что измени в сервере - и все развалится. Вы совершенно не контролируете, какую именно цифру вы вытащили из ответа. Вы даже не контролируете, а есть ли ответ вообще.
и как мой код работает случайно, что под этим понимать? что должно измениться чтоб все пошло не по плану. если можно пример?
и как мой код работает случайно, что под этим понимать? что должно измениться чтоб все пошло не по плану. если можно пример?
как вы думаете, какой контакт включит ваша ЕСП например при таком (весьма вероятном ) ответе сервера?
и как мой код работает случайно, что под этим понимать? что должно измениться чтоб все пошло не по плану. если можно пример?
как вы думаете, какой контакт включит ваша ЕСП например при таком (весьма вероятном ) ответе сервера?
никакой
никакой
С чего бы это? Посмотрите внимательно свой код. Он реагирует на любйю цифру в ответе из диапазона 0-7. При этом срабатывает последняя цифра. В том ответе, что я вам привел, это будет "0" из строки "Content-Length: 0"
можно спорить, можно не спорить, Вы можете выложить как считаете правильно обрабатывать ответ от сервера?
пока что я не видел на этом форуме такого...
у меня сервер работает уже пол года по данному примеру, и проблем не было.
Правильно, так и есть но какими строками задаеться параметр в какую строку смотреть ? По возможности прошу подсказать
можно спорить, можно не спорить,
у меня сервер работает уже пол года по данному примеру, и проблем не было.
да что тут спорить? Ваши аргументы примерно звучат как "я всегда монтирую проводку, не отключая рубильник - и проблем не было " :)
Этот код будет работать, ТОЛЬКО если нужный символ ВСЕГДА самый последний цифровой символ ответа сервера. А чуть что не так - и результат непредсказуем.
Правильный анализ ответа без труда ищется в инете. Причем необязательно это ответ HTPP сервера - ответы GSM-модемов/ GPS-приемников и тд - обрабатываются так же. Сначала принимаемые символы собираются в строки, а потом строки анализируются.
Кстати. для упрощения обработки лучше кодировать состояние реле не одним символом, а уникальной строкой, например "RELAY_44=ON". Такие строки искать в ответе легче, так как они не встречаются в служебных данных. Кроме того, при таком кодировании в одном ответе сервера можно передавать состояние нескольких параметров, чего ваш код не поддерживает в принципе.
можно спорить, можно не спорить,
у меня сервер работает уже пол года по данному примеру, и проблем не было.
да что тут спорить? Ваши аргументы примерно звучат как "я всегда монтирую проводку, не отключая рубильник - и проблем не было " :)
Этот код будет работать, ТОЛЬКО если нужный символ ВСЕГДА самый последний цифровой символ ответа сервера. А чуть что не так - и результат непредсказуем.
Правильный анализ ответа без труда ищется в инете. Причем необязательно это ответ HTPP сервера - ответы GSM-модемов/ GPS-приемников и тд - обрабатываются так же. Сначала принимаемые символы собираются в строки, а потом строки анализируются.
Кстати. для упрощения обработки лучше кодировать состояние реле не одним символом, а уникальной строкой, например "RELAY_44=ON". Такие строки искать в ответе легче, так как они не встречаются в служебных данных. Кроме того, при таком кодировании в одном ответе сервера можно передавать состояние нескольких параметров, чего ваш код не поддерживает в принципе.
есть пример?
коллеги, у каждого из Вас виду опыта больше чем у меня прошу помочь по моему вопросу, что мне править и как задать просмотр указаного параметра
скетч скинь свой. и с браузера по ссылкам что давал при нажатии кнопки значение меняется?
через часа 2 смогу написать
прошу помочь по моему вопросу, что мне править и как задать просмотр указаного параметра
накидал для примера код, который пропускает весь заголовок и извлекает 1 символ из третьей строки блока данных. Номер строчки, откуда читается параметр, задается переменной data_string_num Строки считаются только начиная с пустой строки в конце заголовка, пустая строка имеет номер 0.
большое спасибо за потраченое время сейчас приеду буду пробовать .
По ссылкам которые были выше проверил значение в браузере меняеться 0либо 1 зависимо от положение включателя
вот такой код сейчас загружен
По ссылкам выдат 1 либо 0 зависит от того включено или выключено
сейчас возьму за основу исходный код как из первоисточника и допишу о результатах сообщу
где косяк
сериал выдает
75 строка лишняя
ругаеться компилятор на 20 строку кода
19
if
( c==
'1'
) buff=1;
// извлекаем параметр из первого символа строки
20
if
( c==
'0'
) buff=0;
прошу помочь по моему вопросу, что мне править и как задать просмотр указаного параметра
накидал для примера код, который пропускает весь заголовок и извлекает 1 символ из третьей строки блока данных. Номер строчки, откуда читается параметр, задается переменной data_string_num Строки считаются только начиная с пустой строки в конце заголовка, пустая строка имеет номер 0.
тут еще в 13 строке вместо ( { поставь и запиши стоочку так char c = client.read();
у меня с такой записью не заработало( ищу где накосячил
75 строка лишняя
но на результате не отразилось (
тут еще в 13 строке вместо ( { поставь
да, верно, не ту скобку поставил
и обьявление char с куда-нибудь добавьте.
залей этот и покажи что в сериал плюет
залей этот и покажи что в сериал плюет
фигурную скобку со строки 59 надо переставить в строку 55, иначе ответ после каждого символа будет замирать на целую секунду.
Ну а сам результат Олег уже выкладывал - и не раз. например в сообщении #24. Что вы там нового надеетесь увидеть, интересно?
интересно почему сервер ему 2 лишних значения выдает на ардуино. хотя с браузера все верно работает...
если б ему в браузер выдавало 3 значения то копать надо было бы на сервере ... хотя мож чего не знаю
я попробовал твой пример залить - не работает... меняй номер строик не меняй, ответ выше выложен
где косяк
сериал выдает
косяк в вашей редакции моего кода. Нафига вы оператор client.stop() вставил в цикл приема сообщения? Вы же крашите канал после приема первого же символа - "H" из заголовка "HTTP..."
Все операторы строк 86-89 вынесите наружу цикла while. Или, что тоже самое - переставьте скобку со строки 90 в строку 85
я попробовал твой пример залить - не работает... меняй номер строик не меняй, ответ выше выложен
выше написал. Не понимаешь кода - не редактируй.
косяк в вашей редакции моего кода. Нафига вы оператор client.stop() вставил в цикл приема сообщения? Вы же крашите канал после приема первого же символа - "H" из заголовка "HTTP..."
Все операторы строк 86-89 вынесите наружу цикла while. Или, что тоже самое - переставьте скобку со строки 90 в строку 85
Опять даете яблоко беззубым... Они ж его не разжуют.
да, в сериал выводит точно такое же сообщение
да, в сериал выводит точно такое же сообщение
пробуйте код из сообщения №74 , только строчки с 86 по 89 выкиньте совсем, а после скобки в строке 90 добавьте вывод значения buff в Serial (желательно с какой-нить строкой, типа "buff=" чтоб не спутать с другими нулями и единицами)
сейчас проверил вот такой код в сериале при включенном положениии включателя идут одни еденицы но светодиод не загораеться
блин, я ж написал вам, как поправить код. Почему не слушаете?
Строку 77 запишите так:
Serial.print("buff = "); Serial.println(buff);
Они ж его не разжуют.
похоже на то...
Не сдержался, не смог смотреть, как один беззубый учит жевать другого :)
просто не успеваю за сообщениями я написал только потом увидел ваше сообщение
работает
ток номер строки поправить нужно
подскажите почему сервер выплевывает еще несколько значений после системного?
А что ему еще делать, если вы его заставляете печатать всё, что в буфере клиента имеется? Если этого не нужно, просто выпрыгивайте из while() и после стопа сетевого клиента чистите буфер. Кстати, flush делает немного не то, что вы ожидаете.
блин я не смог проверить у меня перестала ардуина прошиваться
блин я не смог проверить у меня перестала ардуина прошиваться
93 поста держалась, а на 94-ом таки не вынесла её душа таких издевательств. Мир ей!
Заработала ардуина залил код
в сериале следующее сообщение
Hbuff=
которое не реагирует на положение включателя
попробуй
byte
data_string_num =2; так..... у тебя 2е значение меняется после 1й пустой строки и задержку на конце поставь 100. но тормазит порядком все равно отклик
так.. 1е значение (1) это значене "с" 2е значение это buff
концовку поправь
Вот такой последний код я использую и вот такое сообщение в мониторе порта при включенов включателе
HTTP/1.1 200 OK