Принятие и обработка метода Get с дальнейшем использованием

Alex-human
Offline
Зарегистрирован: 03.11.2014

Здравствуйте,

имеется Arduino Uno R3, Ethernet Shield W5100.  Хочу передать запрос с другой программы на изернет об изменении константы или на включение светодиода. Вообще понять как оформлять запросы и разбирать их. Нужна ваша помощь. Кто работал с этой темой и данным обуродованием помогите пожалуйста. Как отправить запрос и как его получить? Это первый вопрос, а второй - как его распарсить на ардуино. Сам конечно же искал, но ничего толковоо не нашел. Сделал сервер на ардуине, который передает данные с датчиков. Дальше не могу работать, т.к. знаний не хватило в этих вопросах.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Alex-human пишет:

Хочу передать запрос с другой программы на изернет об изменении константы или на включение светодиода.

О как! Изменение константы? Серьезная заявка на победу.

Alex-human пишет:

Сам конечно же искал, но ничего толковоо не нашел. Сделал сервер на ардуине, который передает данные с датчиков. Дальше не могу работать, т.к. знаний не хватило в этих вопросах.

Вы ничего не искали. На форуме КУЧА постов про все это.

Alex-human
Offline
Зарегистрирован: 03.11.2014

Если бы я нашел готовое решение, я не создавал бы специально для этого тему. А если вы знаете где именно и какой пост, киньте ссылку. Ведь интернет одним форумом не ограничивыется. КУЧУ киньте. И мне не надо про все подряд, я задал конкретный вопрос.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Может мне просто написать Вам готовый скетч?

Alex-human
Offline
Зарегистрирован: 03.11.2014

А что вы вдруг захотели мне написать скетч??? Я попросил пример как работать, а не скетч готовый. Если жалко ссылку кинуть, смысл писать всякое не по теме?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Alex-human пишет:

А что вы вдруг захотели мне написать скетч??? Я попросил пример как работать, а не скетч готовый. Если жалко ссылку кинуть, смысл писать всякое не по теме?

бой барабанов ссылка... кидаю

www.google.ru

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

а для тех у кого башня не жилая как в новом танке...

справа вверху окошечко поиска... там можно написать " w5100 GET " и получить 6 страниц тем с примерами и хороводами

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Я, к примеру, для w5100 брал отсюда всю инфу для изучения http://zelectro.cc/Ethernet_shield_W5100 . Правда там метод post, а не get, но если долго вникать (как я это делал с нулевыми знаниями практически), то все становится ясно). 

Alex-human
Offline
Зарегистрирован: 03.11.2014

Сделал управление. Но так как сервер поддерживает одновременно подключение до 4 клиентов, создается вопрос, который необходимо решить. КАК СДЕЛАТЬ ТАК, ЧТОБЫ СЕРВЕР НА АРДУИНЕ ПРИНИМАЛ ЗАПРОСЫ С КОНКРЕТНОГО IP АДРЕСА???

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Принимать он будет все равно все подряд, но если парсить хидер то можно отбрасывать ненужные подключения.

А зачем большие буквы?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

А почему с конкретного ip.... Может авторизацию захерачить просто?:-) 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Тогда я надеюсь что ТС знает разницу между динамическим и статическим IP

Alex-human
Offline
Зарегистрирован: 03.11.2014

Авторизация не прокатит. поднималась тема и не раз. на ардуино уно не потянет. как парсить хедер? клиент подключается с постоянного ip адреса. как сделать чтобы только он мог отправлять запросы и все? 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Думаю, коли добрался уже до шилда, то знает... Помню, не так давно, я был так рад тому скетчу из своего поста выше... Релюшки по сети! Вау! Но для тех, кто залазит в ардуино-дебри этого быстро становится МАЛО)))

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Alex-human пишет:

Авторизация не прокатит. поднималась тема и не раз. на ардуино уно не потянет. как парсить хедер? клиент подключается с постоянного ip адреса. как сделать чтобы только он мог отправлять запросы и все? 

Только если подключить напрямую проводом. Больше никак. Совсем никак.

И почему это вдруг не прокатит авторизация? Что еще за ерунда?

Alex-human
Offline
Зарегистрирован: 03.11.2014

Потому что другие пробовали и не хватило мощности уно поднять сервер с авторизацией. За другие конечно не могу сказать.

Тогда другой вопрос. Как распарсить строку на значение. содержится в запросе ip/$tmin=15 как вытащить значение после знака =? 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Alex-human пишет:

Потому что другие пробовали и не хватило мощности уно поднять сервер с авторизацией. За другие конечно не могу сказать.

Поясните, о какой авторизации речь.

Может вы об аутентификации на почтовом сервере? С ней да, проблемы.

Цитата:

Тогда другой вопрос. Как распарсить строку на значение. содержится в запросе ip/$tmin=15 как вытащить значение после знака =? 

http://www.arduino.cc/en/Reference/StringObject

 

Alex-human
Offline
Зарегистрирован: 03.11.2014

Аутентификация имеется ввиду. Проверка на ввод имени и пароля. Это имел ввиду. Подскажите пожалуйста функцию или хотя бы алгоритм как распарсить запрос. Я могу проверить только что если втретилось t1= то выполнить действие. а прочесть после = как не могу найти.

Alex-human
Offline
Зарегистрирован: 03.11.2014

Есть ли функция, которая считывает с определенного символа или после символа и до конца строки???

Не могу найти. Преобразовал запрос в строку. получаю $tmin=25

Как вытащить 25??? Ну подскажите пожалуйста

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Что не позволяет вводить имя и пароль в строке адреса?

Попробуте "хакнуть" мою дуню: http://webdom.synology.me/webdom

indexof, strpos - пользуйтесь раз уж в гугле забанили

Alex-human
Offline
Зарегистрирован: 03.11.2014
void loop()
{
  // ожидание подключения клиентов
  EthernetClient client = server.available();
  if (client) {
    // Запрос HTTP заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // Если будет получен символ переноса строки и
    // сама строка при этом пустая, значит
    // HTTP-запрос закончился, можно отвечать
 
 if (c == '\n') {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          client.println("XXX");
          client.println(str); 
          client.println("<br />");     
          client.println("</html>");
          break;
 }
 
 
    // считываем URL с символа "$" до первого пробела
        if(incoming && c == ' '){
          incoming = 0;
        }
        if(c == '$'){
          incoming = 1;
        }
 
        // Определяем что было в URL: $1 или $2
        if(incoming == 1){
         // Serial.println(c);
 
          if(c == 'tmin='){
///вот как тут можно считать символы после 'tmin=' объясните пожалуйста. не могу разобраться
          }
          
        }
 
        if (c == '\n') {
          // началась новая строка
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // в текущей строке ещё есть символы
          currentLineIsBlank = false;
        }
      }
    
    }
    // даём время браузеру для получения данных
    delay(1);
    // закрываем соединение
    client.stop();
  }
}

 

Alex-human
Offline
Зарегистрирован: 03.11.2014

Можно ли вытащить из char С как-то? Или это делать из строки???

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Вы вообще понимаете что и почему Ваш скрипт делает? (если он конечно Ваш)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Alex-human пишет:

Тогда другой вопрос. Как распарсить строку на значение. содержится в запросе ip/$tmin=15 как вытащить значение после знака =? 

indexOf();
substring();
toInt();

Эти три функции решают все вопросы с парсингом.

Alex-human
Offline
Зарегистрирован: 03.11.2014

Да, понимаю конечно. мы получаем запрос, и посимвольно можем вывести Serial.println(c) или сделав так String a(c) вывести а строку. Но вот проверить на содержание символа могу if(c=='tmin=') т.е. если есть такое то можно выполнить действие какое-то в этом цикле. У меня загвоздка как считать символы после = все до конца. потом то присвоить их int я знаю как. Вот в чем провал. И тут требуется помощь.

Alex-human
Offline
Зарегистрирован: 03.11.2014

Вот проверяю indexOf на =. Выводит -1-1-1-1-10-1-1 А что далее? substring не работает. как им вывести?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Alex-human пишет:

Вот проверяю indexOf на =. Выводит -1-1-1-1-10-1-1 А что далее? substring не работает. как им вывести?

А... вы в этом смысле...

Так бы и написали, что ленитесь читать документацию...

//?bed=22door=26bathroom=24
int bedRangeValue,  doorRangeValue, bathroomRangeValue;

void parseGetRequest(String str){
  Serial.print("Parsing this string: ");
  Serial.println(str);
  
  int bedIndex = str.indexOf("bed");
  int doorIndex = str.indexOf("door");
  int bathroomIndex = str.indexOf("bathroom");
  String bedString = str.substring(bedIndex+4);
  String doorString = str.substring(doorIndex+5);
  String bathroomString = str.substring(bathroomIndex+9);
  
  bedRangeValue = bedString.toInt();
  doorRangeValue = doorString.toInt();
  bathroomRangeValue = bathroomString.toInt();
    
}

 

Alex-human
Offline
Зарегистрирован: 03.11.2014

У меня выводит 0 посимвольно в строке. В чем проблема может быть? Субстринг не работает получается?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Alex-human пишет:

У меня выводит 0 посимвольно в строке. В чем проблема может быть? Субстринг не работает получается?

Могу сказать наверняка - субстринг работает. У меня пока низкий левел магического умения читать чужой код на расстоянии. Попробуйте его тут выложить...

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Мои карты таро подсказывают что Вы ищите в переменной "с". И могу Вас уверить - хрен Вы что там найдете с Вашими запросами.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

JollyBiber пишет:

Мои карты таро подсказывают что Вы ищите в переменной "с". И могу Вас уверить - хрен Вы что там найдете с Вашими запросами.

 так понимаю что тебе стало скучно в отпуске?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

я на работе. у меня плохое настроение и булочку с маком уже доел :( в отпуск в пятницу

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

JollyBiber пишет:

я на работе. у меня плохое настроение и булочку с маком уже доел :( в отпуск в пятницу

ну доставай батон тогда с маслом и колбасой :) поправляй настроение

Alex-human
Offline
Зарегистрирован: 03.11.2014

Да, к сожалению не сразу заметил, что с считывается посимвольно. Как сделать чтоб получить строку? Ее получается надо собрать из этих символов. 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Такой подход мне больше нравится: сам спросил - сам ответил.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

JollyBiber пишет:

Такой подход мне больше нравится: сам спросил - сам ответил.

вид батона поднимает тебе настроение? хочешь я тебе еще фоток с рыбалки пришлю :)

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Кофеёк видать взбодрил. Остальное просто самоконтроль. Но из последних сил.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

JollyBiber пишет:

Кофеёк видать взбодрил. Остальное просто самоконтроль. Но из последних сил.

аналогично, чет не спиться. сижу вот фигней страдаю. дочь обзывает хипстером...

Alex-human
Offline
Зарегистрирован: 03.11.2014

Да ответить ответил, только сделать не могу. подскажите хотя бы, не получается собрать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Alex-human пишет:

Да ответить ответил, только сделать не могу. подскажите хотя бы, не получается собрать

а как пытаешся собирать? или ты сидишь ждешь когда тебе все напишут?

ты покажи свои попытки, а потом уже бум править..

Alex-human
Offline
Зарегистрирован: 03.11.2014
boolean incoming = 0;
 String str;
 char zapros=[15];
 char z;
void setup()
{
  pinMode(2, OUTPUT);
 
  // запускаем Ethernet соединение и сервер:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}
 
void loop()
{
  // ожидание подключения клиентов
  EthernetClient client = server.available();
  if (client) {
    // Запрос HTTP заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        
        while (client.available()) {
              zapros[z] = client.read();
              z++;
          }

Не могу понять, как считать с накоплением

Alex-human
Offline
Зарегистрирован: 03.11.2014

char zapros=[15];

Ругается на это

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Alex-human пишет:

char zapros=[15];

Ругается на это

грязно ругается? матом? О.о

а не можешь скорее всего от того что код нужно писать самому и понимать что он делает.. а не вымораживать что бы люди на форуме за тебя его писали... форум нужно спрашивать если чего не понятно.. 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012
JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Все проблемы в том, что у Ардуины ужасный компилятор - ни синтаксические, ни орфографические ошибки сам исправить не в состоянии. Да и код не оптимирует. Ацтой короче.

Alex-human
Offline
Зарегистрирован: 03.11.2014

Так я и спросил, мне не понятно как считать символы в строку. Вот здесь мы получаем от клиента символ 

if (client.available()) {
          char c = client.read();

ну если он равен переносу на другую строку то отсылаем страницу. читаем посимвольно. но не могу понять как собрать все символы. Вот и спрашиваю. Как накопить их в одну переменную? В этом месте (где читаем посимвольно же) тут мы должны накапливать? Подскажите пожалуйста как накапливается. Смотрел как из Сериал порта принимали и накапливали. Но так не получилось.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012
Alex-human
Offline
Зарегистрирован: 03.11.2014

Я вообще хотя бы там проверяю и считывать пытаюсь? А то я посылаю запрос и ничего не выводится. Есть примеры где считывается в массив? Не могу понять где я что неправильно делаю

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Есть. Прямо в примерах в ИДЕ.

Я не знаю где Вы пытаетесь считывать.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014
String requestString="";
char c;

	    while (client.connected()) {
	      if (client.available()) {
	       c = client.read();
requestString = requestString + c;
          }
}

Настоятельно рекомендую разобрать примеры из библиотеки ETHERNET.

Вам на самом деле не нужен весь ответ клиента, вам нужен только заголовок, его и парсите.

Alex-human
Offline
Зарегистрирован: 03.11.2014
void loop()
{
  // ожидание подключения клиентов
  EthernetClient client = server.available();
  if (client) {
    // Запрос HTTP заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        
      while (c=='!'){
              zapros[z] = client.read();
              z++;
      }
Serial.println(zapros);

Вот тут я пытаюсь считать. Но ничего не получается. В запросе в конце ставлю ! . чтобы понимать что конец запроса.