Парсинг Get запроса на сервер Arduino

Dessan
Offline
Зарегистрирован: 04.09.2019

Добрый день,

На сервер Arduino отправляется get запрос вида:

GET /?username=Dessan&password=12345 HTTP/1.1

Сервер Ардуино принимает запрос и выводит в порт:

GET /?username=Dessan&password=12345 HTTP/1.1
Host: 192.168.0.177:5000
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 YaBrowser/19.9.3.314 Yowser/2.5 Safari/537.36
Origin: null
Accept-Encoding: gzip, deflate
Accept-Language: uk,ru;q=0.9,en;q=0.8
 
Я хочу, чтоб в результате get запроса я получал отдельно username, отдельно Dessan, отдельно password и отдельно 12345 и мог с этими данными что-то делать, например сравнивать и выполнять какое-либо действие.
Весь get запрос записывается в переменную tempChar но она имеет свой непонятный мне формат и как я не пытался сделать её строковой у меня ничего не вышло. Я создал другую строковую переменную readString и присвоил ей содержимое tempChar. Насколько я понял, строковые переменные в Arduino являются сами по себе массивами. После манипуляций с indexOf и substring мне удалось распарсить нужную мне строку, однако она выводит не полностью слово , к примеру, username а начинает вывод по буквам.
Вот код парсинга строки:
String readString;
...
while (client.connected()) {
      if (client.available()) {
        tempChar = client.read();
       
        //Serial.write(tempChar); 
        if (readString.length() < 100 ) { 
               readString += tempChar; 
               //Serial.print(readString.length()); 
               ind1 = readString.indexOf("?");
               ind2 = readString.indexOf("=");
               teststring = readString.substring(ind1, ind2);
               teststring.replace("?", " ");
               teststring.trim();
...

Вот результат парсинга (значение в teststring):

u
us
use
user
usern
userna
usernam
username
username
username
username
username
username
username

и далее ещё штук 20 таких вот username

Получается , что если делать проверки содержит ли переменная username , то дальнейший код реагирует и на username и на u и на us и на use и т.д. В принципе оно работает, но хочется иметь нормальный код более менее а не совсем уже говнокод.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Сделать циклический буфер размером 8 байт, туда по кругу вносить весь приход, после каждого байта сравнивать с искомой строкой, как найдётся - поставить некий флаг что пришло и далее уже читать данные.
Читать построено до /n в буфер и так же каждую строку парсить

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

пытался осмыслить что хочет ТС нифига не понял
зачем в цикле приема что то искать многократно? прими весь запрос и ройся в буфере потом

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:

Весь get запрос записывается в переменную tempChar но она имеет свой непонятный мне формат и как я не пытался сделать её строковой у меня ничего не вышло.

чота ржу...

Переменная tempChar "неизвестного формата" :) -это один единственный символ!

Попытайтесь теперь переосмыслить свой код с учетом этой информации - может быть поймете, почему у вас строчка "username" набирается по буквам.

Как правильно делать - вам выше уже обьяснили - не хвататься распарсить каждую букву, а сначала накопить данные либо до конца строки. либо некоторое число символов. С другой стороны, пытаться вычитать весь HTPP запрос за один раз тоже не стоит, запросы бывают размером в несколько мегобайт...

 

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

тогда склеивай по символу в буфер пока в нем не появится \r\n потом парси
а так получается индексОф находит ? а второй индексОф -1 что для сабстринг вывести всю строку до конца вот она и выводит u us use user а потом еще сотню раз юсернейм целиком

sadman41
Offline
Зарегистрирован: 19.10.2016

Или пропускай всё до '?', потом складывай в буфер до '=' - вот тебе имя поля. Запомнил его. Пропустил '=', принимай в буфер до '&' - вот тебе значение. 

Dessan
Offline
Зарегистрирован: 04.09.2019

Парни, спасибо за быстрые ответы, но я не понимаю как мне сделать, чтоб то что насобиралось в буфер выводилось целиком, а не по 1 букве. Я ж говорю, что String это тот же массив, а как мне объявить, чтоб то что насобиралось стало именно строкой?Какой формат мне нужно использовать? Я мучался ни один день с этим. Не понимаю как мне рыться в буфере, чтоб данные стали целостными, а не отдельными символами. Вот начиная с tempChar = client.read(); что писать, чтоб целостно выделить нужную мне информацию и уже потом её парсить? Я понимаю, что мой код - полная ерунда, это все переделанные варианты кода с разных сайтов, потому что полноценный вариант я не нашёл. 

Это ж в этом примере username есть, а вообще должно распарсить любые символы начиная с /? и заканчивая  HTTP/1.1, внутри разделители = и &. Например GET /?usE90ame=Des&pas2=1TY45 HTTP/1.1

Я очень надеюсь, что примерно смог пояснить, что мне нужно

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пятницо :)

b707
Offline
Зарегистрирован: 26.05.2017

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

вы даже своей проблемы правильно не осознаете - она вовсе не в том что "String - это массив".

sadman41
Offline
Зарегистрирован: 19.10.2016

Dessan пишет:

Это ж в этом примере username есть, а вообще должно распарсить любые символы начиная с /? и заканчивая  HTTP/1.1, внутри разделители = и &. Например GET /?usE90ame=Des&pas2=1TY45 HTTP/1.1

Я же написал как... пропускай всё, пока tempChar != '?'. Потом складывай в строку, пока tempChar != '='. Как только tempChar == '=' - у тебя в строке уже готовое имя поля. И т.д.

Парсинг - это занятие нетривиальное, так что с наскоку ничего не выйдет.

Dessan
Offline
Зарегистрирован: 04.09.2019

Когда появится символ "?" начинаем вписывать всё в буфер пока не появится символ "=". По идее так?

char tempChar;
String readString;

tempChar = client.read();
       
        
        if (readString.length() < 100 ) { 
               if (tempChar == '?'){
                     while (tempChar != '='){  
                        readString += tempChar;
                     }
                      
                
               }
               
               Serial.print(readString); 
          }

Правда, вообще ничего не выводится теперь, но вы это имеете в виду?

sadman41
Offline
Зарегистрирован: 19.10.2016

По сути так, а по форме - нет.  В 10-й строке новые байты из космоса берутся?

Dessan
Offline
Зарегистрирован: 04.09.2019

так client.read() принимает весь get запрос и посимвольно вписывает в буфер readString если условие выполняется. А как нужно?

sadman41
Offline
Зарегистрирован: 19.10.2016

С чего Вы взяли? Посмотрите описание функции прежде чем совать ее в свой код. А то так перепишете квартиру на ардуину.

Dessan
Offline
Зарегистрирован: 04.09.2019

С того, что в описании "read() считывает следующий байт, пришедший к клиенту от сервера, к которому он подключен (после последнего вызова функции read())".

tempChar = client.read();
Serial.print(tempChar);



Выводит целиком:

Server address:192.168.0.177
New request from client:
GET /?username=Dessan&password=12345 HTTP/1.1
Host: 192.168.0.177:5000
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 YaBrowser/19.9.3.314 Yowser/2.5 Safari/537.36
Origin: null
Accept-Encoding: gzip, deflate
Accept-Language: uk,ru;q=0.9,en;q=0.8

Break

Вот я беру каждый байт (т.е. символ) и присваиваю его буферу readString при выполнении условия...получаю ничего

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:

С того, что в описании "read() считывает следующий байт

считывает байт. Один. А не весь запрос get, как вы думаете. Чтоб в tempChar появился следующий байт - надо снова вызвать процедуру read()

и так столько раз. сколько символов в запросе. На вид в вашем запросе символов этак двести - вот столько раз и надо выполнить read(). А у вас в коде сообщения #10 read() всего один - в строке 4

Dessan
Offline
Зарегистрирован: 04.09.2019

Да нет же, это часть кода просто. Он же и так в цикле:

 while (client.connected()) {
      if (client.available()) {
        tempChar = client.read();
       
        
        if (readString.length() < 100 ) { 
               if (tempChar == '?'){
                     //while (tempChar != '='){  // вот этот цикл 
                        readString += tempChar;
                     //}
                      
                
               }
              Serial.print(readString); 
         }
      }
}

Но я так понимаю, что имелось в виду, что while не подходит, потому что while выполняется пока условие True. А так как перед этим я получаю только один байт, то второй while делает бесполезную работу

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю о каком втором вайле идёт речь, в приведённом коде я вижу только один (да и тот нафиг не нужен). Пятница закончилась, так что кончайте тупить и просто накапливайте свой запрос в буфере пока перевод строки не встретите. А как встретите, тогда и обрабатывайте.

Dessan
Offline
Зарегистрирован: 04.09.2019

да, я понял, что нужно накапливать запрос в буфере, а не знаю как мне накапливание в буфере сформулировать в виде кода. От того что вы мне ещё раз скажете, что запрос нужно накапливать в буфере до нужного символа, а потом его целиком от туда извлекать и накапливать следующий - ничего не поменяется. Я понимаю, что его нужно накапливать, я кодом не могу это записать, я не понимаю как и что для этого использовать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dessan пишет:

я кодом не могу это записать

А словами можете?

Напишите. Примерно так

В цикле вызова loop
   если пришёл символ ТО
        ...
        если это символ есть перевод строки ТО
             ...
        }
    }
}

Можете заменить многоточия на нужные слова? Сделайте это

b707
Offline
Зарегистрирован: 26.05.2017

Dessan - так чего вы от форума ждете? Что кто-то напишет вам код? - тут это не принято

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707, я готов не то, чтобы написать код, но показать ему как слова в код транслировать, если он напишет словами, как я просил. Потому что выражения типа "я понял но не знаю как сказать словами" на деле означают "ни хрена не понял". А вот если действительно понял и может словами сказать, что из слов код получается легко (и в разы короче и проще, чем то, что мы видм сейчас). Это я готов показать - жду "слов". Может уже не сегодня (поздно), но пусть напишет словами.

Dessan
Offline
Зарегистрирован: 04.09.2019

Господа учителя:

char tempChar;
String readString;
int ledPin = 2;
int pos = 0;

while (client.connected()) {
      if (client.available()) {
        tempChar = client.read();
       
        //Serial.print(tempChar); /
        if (readString.length() < 100 ) { 
               if (tempChar == '?'){
                     pos = 1;
               }
              
               if((tempChar != '=') && (tempChar != '/') && (tempChar != '?') && (pos = 1)){
                      readString += tempChar;
                      
               }
                if (tempChar == '='){
                  Serial.println(readString); // GET /?username
                  readString.replace("GET", " "); //   username
                  readString.trim();
                  Serial.println(readString); //username
                      pos = 0;
                        
                        break;
                     
               }  
 if (readString == "username") { // не срабатывает условие
              
              digitalWrite(ledPin,HIGH);
              
             }
            
                
        } 
}
}   

1. Почему записывается GET /? если я указываю , что начинать записывать с "?"

2. Почему не срабатывает условие для включения пина?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

господин ученик...

вы в 16 строке допустили ошибку в сравнении!

садитесь - два!

 

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

без проверок на возможные ошибки просто смысл

заодно сам спрошу, какой максимальный размер буфера на стеке в ардуинке?

char buf[100], *p=buf;
while (client.avail() && (*p++=client.read()) != '\r');

p = buf;
while (*p++!='?');
char* username = p;
while (*p++!='='); *(p-1)='\0';
char* dessan = p;
while (*p++!='&'); *(p-1)='\0';

serial.print(username);
serial.print(dessan);

или так))

char username[64], dessan[64], *p;
while (client.read()!='?');

p = username;
while ((*p++=client.read())!='=');
*(p-1)='\0';

p = dessan;
while ((*p++=client.read())!='&');
*(p-1)='\0';

serial.print(username);
serial.print(dessan);

 

Dessan
Offline
Зарегистрирован: 04.09.2019

Как только код дойдёт до второго while, он зациклится пока второй while будет True и ничего не выдаст, потому что не будет обращения к client.read(). Об этом писал b707

По поводу буфера, если тебе поможет:

По умолчанию и для приемного и передающего буферов заданы размеры:

  • 16 байтов для микроконтроллеров с памятью до 1023 байта;
    64 байта для микроконтроллеров с памятью свыше 1023 байта.

Для Arduino UNO R3 буферы передачи и приема имеют размер 64.

  • 1. Буфер переполниться не может по тому, что программа считывает из него данные намного быстрее, чем они могут поступить из UART. При скорости 9600 бод 1 байт может быть принят за время не менее 1 мс. А программа проверяет буфер Serial в цикле loop c периодом несколько микросекунд.

    2. Если буфер переполнится, то старые данные будут потеряны.

    3. Буфер находится в оперативной памяти и никак не угрожает загрузчику во Flash памяти.

Я байты/биты не понимаю вообще. Я прочитал, что 1 байт = 8 бит или 256 вариантов как записать символ, а 1 бит = 0 или 1 и в большинстве случаев 1 байтом записывают 1 символ. На этом мои познания закончены, а дальше все пишут то, что им хочется и устраивают споры на пол форума. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Dessan, начинающие, как правило, ищут простой путь, который оказывается крайне неоптимальным. Затем десятки раз всё переделывают. Большинство из нас через это прошли. Поэтому обучать Вас незамысловатым, но явно глупым приемам никто не горит желанием. А что-то нормальное Вы начинаете называть "спором на полфорума".

Поймите это и определитесь - нужна Вам нормальная помощь, для получения которой придётся скилл прокачивать или нет.

И еще: работа с микроконтроллером - это манипуляции с байтами и битами в 90% случаев. Хотите "как на пэхэпэ" - пишите на PHP.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dessan пишет:

Господа учителя:

Господин ученик, про "почему" Вам уже объяснили, но главное не в этом, а в том, что весь это Ваш развесистый код нахрен не нужен. Нужная функциональность пишется в три строки без единого while (который вообще вреден в скетчах). Но для этого надо понимать что делаете. Я Вам предложил описать словами что нужно делать (и, заодно, понять), но Вы предпочитаете упираться в неверное решение и пытаться что-то в нём подправить без понимания - дело хозяйское. Мне пофиг.

Dessan
Offline
Зарегистрирован: 04.09.2019

Я имел в виду, что, возможно, есть такие функции о которых я и не слышал, например нашёл sscanf. Ищу сейчас о ней документацию. 

Хорошо, Евгений, давайте попробуем:

вот сам запрос GET /?usE90e=De4s&pas2=1TY45 HTTP/1.1

 

String readString;
 
 
void loop() { //ф-ция главного цикла
  client = server.available(); // ожидаем объект клиент 
  
  if (client) { // при перезагрузке страницы client станет равным 1
    
    Serial.println("New request from client:");
    readString = "";
 
    while (client.connected()) {
       if (client.available()) {
        tempChar = client.read(); // сюда по 1 символу приходит мой Get запрос и присваивается в переменную типа char 
           далее логика вида:
              если в tempChar появился символ "?" и при этом символ != "=" то:
                 все следующие символы записываем в буфер типа String переменной readString
                   если в tempChar символ "=" и при этом символ != "&" то:
                      прекращаем записывать символы в readString
                      создаём переменную Param1 и записываем содержимое readString в эту переменную
                      стираем всё содержимое readString
                      начинаем записывать новые данные в readString
                           
                             если в tempChar символ "&" и при этом символ != "=" то:
                                   прекращаем записывать символы в readString
                                   создаём переменную Param2 и записываем содержимое readString в эту переменную
                                   стираем всё содержимое readString
                                   начинаем записывать новые данные в readString
                                    
                                      если в tempChar символ "=" и при этом символ != "\r" то:
                                                прекращаем записывать символы в readString
                                                создаём переменную Param3 и записываем содержимое readString в эту переменную
                                                стираем всё содержимое readString
                                                начинаем записывать новые данные в readString
    
                                             если в tempChar символ "\r"  то:
                                                   прекращаем записывать символы в readString
                                                   создаём переменную Param4 и записываем содержимое readString в эту переменную
                                                   стираем всё содержимое readString
                                                    
  Но это какой-то идиотизм а не логика. Я уверен есть какая функция, которая примет все символы, запишет их в буфер
 и сделает сортировку и первого символа "?" до "=" и всё содержимое присвоит переменной
затем от "=" до "&" - присвоили переменной
от "&" до "=" - присвоили переменной
от "=" до "  " - присвоили переменной
 
А ещё лучше определить количество пар параметров согласно разделителю &: если 1 разделитель то создавать нужно 4 переменные так как у нас 4 параметра, если 2 разделителя - 6 переменных и 6 параметров нужно будет присвоить этим параметрам, если нет разделителя - 2 параметра и 2 переменные.
 
А потом уже делать условия вида: если параметр1 = "LedOn" то digitalWrite(ledPin,HIGH);
Собственно за разумным и функциональным решением я на форум и пришёл                                  
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Dessan, удобных функций тут нет, все ручками, старайтесь не использовать тип String, помните что у вас всего 2кб ОЗУ, большие буферы сделать не получиться, сами попробуйте сделать функцию поиска подстроки в строке что бы понять как это все работает.

Вот простенький пример разбора get запроса
http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalno...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dessan пишет:

 например нашёл sscanf.           

Это над Вами на юа поглумились. Это очень капризная и сложная функция для СТРОГО определённых форматов. Вам она без надобности.

Dessan пишет:

Хорошо, Евгений, давайте попробуем:

Боюсь, Вы не умеете не только программировать, но и читать. Я в #19 просил Вас расписать что нужно СЛОВАМИ без использования сущностей, которых Вы не понимаете. А Вы опять своих вайлов навалили. Скажу Вам по огромному секрету - вайл тут НАХРЕН НЕ НУЖЕН от слова "вообще".

Вы словами может расписать, что Вы собираетесь делать? Если нет, забудьте о программировании.

Dessan пишет:

Собственно за разумным и функциональным решением я на форум и пришёл                                  

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

Dessan
Offline
Зарегистрирован: 04.09.2019

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

Dessan
Offline
Зарегистрирован: 04.09.2019

Я во многих примерах вижу подключение библиотеки #include <string.h> для работы ф-ции strtok(). А то у меня как-то примеры даже не работают и я не нахожу библиотеку #include <string.h> .

И ещё меня интересует библиотека #include <stdio.h> , наверно её у меня тоже нет. Эти две библиотеки качаются отдельно или стандартно с ардуино устанавливаются? 

Вы могли бы показать какие-то рабочие примеры с strtok() и sscanf() , чтоб я знал причина во мне или в софте.

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:

Вы могли бы показать какие-то рабочие примеры с strtok() и sscanf() , чтоб я знал причина во мне или в софте.

ваша проблема решается в 3-5 строк безо взсяких strtok() и sscanf(), одним только чтением и сравнением символов. Если вы не знаете что такое байты и биты, то никакие функции вам не помогут

Dessan
Offline
Зарегистрирован: 04.09.2019

Да, я хочу только проверить у меня работают вообще  strtok() и sscanf() или нет. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, есть у Вас и  <string.h> и <stdio.h> . подключайте, работайте и не выносите мозг ни себе, ни нам.

Примеров мне не жалко, только я уже устал Вам повторять - до тех пор пока Вы не знаете что собираетесь делать, никакие волшебные библиотеки Вам не помогут. И не нужны на самом деле Вам эти функции (особенно scanf)

Вот пример с strtok - http://arduino.ru/forum/programmirovanie/parsing#comment-312218

Вот со scanf - http://arduino.ru/forum/programmirovanie/hex-string-byte-array#comment-95027

 

Dessan
Offline
Зарегистрирован: 04.09.2019

Спасибо, strtock работает, а scanf - мало того, что одни ошибки так ещё и  ">>". Есть другой пример, который Вы сами писали, который без ошибок и не выглядит как "прога кул хацкера"?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну примеров навалом, но мне проще новый написать, чем искать :)

Сейчас чё-нить придумаю. Но, не нужна она Вам, она не для этого!

Щас чё-нить найду или напишу.

void setup(void) {
	Serial.begin(57600);
	const char * data = "a=123&b=321&c=54&d=67";
	int a = 0, b = 0, c = 0, d = 0;

	sscanf(data, "a=%d&b=%d&c=%d&d=%d", &a, &b, &c, &d);

	Serial.print("a="); Serial.println(a);
	Serial.print("b="); Serial.println(b);
	Serial.print("c="); Serial.println(c);
	Serial.print("d="); Serial.println(d);
}

void loop(void) {}

 

Dessan
Offline
Зарегистрирован: 04.09.2019

Кстати, в той моей логике не было никаких вайлов, там были if...

После всего этого обсуждения я решил вообще не ловить каждый символ в цикле while а дождаться его выполнения, то есть:

while (client.connected()) {
      if (client.available()) {
        tempChar = client.read();
        readString += tempChar;
}

//GET /?username=Dessan&password=12345 HTTP/1.1
              
               ind1 = readString.indexOf('?');
               ind2 = readString.indexOf('\n');
               
               teststring = readString.substring(ind1+1, ind2-9);

            //username=Dessan&password=12345

               if (teststring.indexOf('&')){
                    teststring.replace('&', '=');
               }
              //username=Dessan=password=12345
          

А дальше я уже думал использовать strtok() или sscanf(), но не нашёл простых рабочих примеров с этими функциями.

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

В цикле вызова loop
   если пришёл символ "?" ТО
        заполняем буфер
        если это символ есть перевод строки ТО
             прекращаем заполнять буфер, так как остальные данные нам не нужны    

        }
    }
}

И что нам это всё даёт? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если не можете, то не можете. На нет и суда нет.

Но, пока не сможете, ничерта не получится.

Dessan
Offline
Зарегистрирован: 04.09.2019

Класс, работает. Теперь,я бы  совместил мой код и Ваш, а перед этим нужно понять строку

const char * data = "a=123&b=321&c=54&d=67";

А точнее этот тип данных и как этот тип данных связать с моим типом данных...

Но мне очень интересно как решить мою задачу в 3-5 строк

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:

После всего этого обсуждения я решил вообще не ловить каждый символ в цикле while а дождаться его выполнения

это сработает при условии, что весь запрос поместится в память. А если нет - все программа развалится и ардуина зависнет. А запросы HTPP, как правило, имеют длину сотни и тысячи символов.

Цитата:
А дальше я уже думал использовать strtok() или sscanf(), но не нашёл простых рабочих примеров с этими функциями.

А выше ни один пример не показался вам "простым"? - ну так вас же предупреждали, что эти функции не для новичка

Цитата:
А ту логику, которую Вы от меня хотите добиться, я не могу осознать с точки зрения функциональности. У меня неизвестное количество параметров.

Вам в любом случае придется работать "с неизвестным числом параметров", какую бы логику вы не выбрали

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это обычный указатель на символ - используется как строка. Как Вы собрались работать с strtok и прочим добром, если Вы указателя на символ не знаете?

Чтобы решить задачу в 3-5 строк, нужно не упираться рогом, а делать что говорят. Тогда бы мы продолжили. Вы же упорно доказываете мне. что так делать не надо. Ну, если не надо, то что ж я могу сделать.

Dessan
Offline
Зарегистрирован: 04.09.2019

ЕвгенийП пишет:

Ну, если не можете, то не можете. На нет и суда нет.

Но, пока не сможете, ничерта не получится.

Может Вы мне напишите словами, что Вы имеете в виду, а я Вам объясню почему я об этом не подумал или по какой причине решил отказаться от такого решения. Мне уже самому интересно очень что там за такое решение без использования функций

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:
Может Вы мне напишите словами, что Вы имеете в виду, а я Вам объясню почему я об этом не подумал или по какой причине решил отказаться от такого решения.

а вы уверены, что Евгению это интересно - почему вы отказались от его решения? :)) - по глупости

Dessan пишет:

Мне уже самому интересно очень что там за такое решение без использования функций

код из #10. только с исправлением ошибок. какие именно ошибки - вам тоже уже сказали. Та часть, что извлекает нужные символы из строки - как раз таки всего 5 строчек

Dessan
Offline
Зарегистрирован: 04.09.2019

b707 пишет:

А выше ни один пример не показался вам "простым"? - ну так вас же предупреждали, что эти функции не для новичка

Все люди "уникальные", может то, что для новичка должно быть сложно, для меня наоборот легко, а сложно для меня когда вижу что-то типа ">>" или char * const , а уж совсем не регулярные выражения

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:

Все люди "уникальные", может то, что для новичка должно быть сложно, для меня наоборот легко, а сложно для меня когда вижу что-то типа ">>" или char * const , а уж совсем не регулярные выражения

как видите -  эта функция сложна не только регулярными выражениями :)

Dessan
Offline
Зарегистрирован: 04.09.2019

b707, у меня не повторяющиеся символы а чередующиеся = и & из постоянных только ? и новая строка

Dessan
Offline
Зарегистрирован: 04.09.2019

Я ничем не упираюсь, думаете я тут столько страниц текста исписал специально, чтоб ничего не делать? Я не могу понять к какой логике Вы меня подталкиваете

b707
Offline
Зарегистрирован: 26.05.2017

Dessan пишет:

b707, у меня не повторяющиеся символы а чередующиеся = и & из постоянных только ? и новая строка

к чему это? не понял

Штудируйте код #10. а ошибки вам подсказал sadman41

Dessan
Offline
Зарегистрирован: 04.09.2019

ЕвгенийП пишет:

Чтобы решить задачу в 3-5 строк, нужно не упираться рогом, а делать что говорят. Тогда бы мы продолжили. Вы же упорно доказываете мне. что так делать не надо. Ну, если не надо, то что ж я могу сделать.

Какой дурак будет упираться и писать пост №28?