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

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

b707 пишет:

Dessan пишет:

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

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

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

Что ж в нём хорошего?Во-первых там блокирующий While, а даже если от него избавиться, то проверка if (tempChar == '?'){ будет true только 1 раз

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

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

Удачи

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

дессан ставь visualstudio бери книжку кернигана и ричи и учи сишку там а потом велком в ардуинку)

 

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

baby_in_Arduino пишет:

дессан ставь visualstudio бери книжку кернигана и ричи и учи сишку там а потом велком в ардуинку)

 

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

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

Dessan пишет:

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

это просто LOL

Дессан, не позорьтесь. "Язык ардуино" - это самый натуральный С/С++. А то, что мы обсуждаем в вашей ветке - это вообще чистый Си, никаким "ардуино" тут и не пахнет

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

Ну, хрен с Вами. Я сейчас в командировке, торчу один в гостинице и делать мне нехрен.

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

Ну чего тут сложного, ну смотрите. Ставим простую задачу: принимаем из Serial символы по одному, пока не накопится строка (признаком конца строки является символ '\n' или '\r'). Как только строка пришла – печатаем её и принимаем следующую. Пока же строка приходит (посимвольно) занимаемся своими делами, т.е. не блокируем программу ожиданием конца строки. Пустые строки «съедаем».

Ну и давайте расписывать:

ПРИ КАЖДОМ ПРОХОЖДЕНИИ loop

   ЕСЛИ пришёл символ ТО
         Читаем пришедший символ
         ЕСЛИ это символ конца строки
                 ЕСЛИ принятая строка не пуста
                           Передаём принятую строку на обработку (печать)
                 КОНЕЦ ЕСЛИ
                 Обнуляем принимающий буфер (для приёма новой строки)
         ИНАЧЕ
                 Запоминаем принятый символ в буфере
         КОНЕЦ ЕСЛИ
   КОНЕЦ ЕСЛИ

Вот собственно и всё. Мы описали как мы будем принимать строки посимвольно, а по мере прихода целой строки их обрабатывать (печатать).

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

#define BUF_LEN	200	// Длина буфера

char buffer [BUF_LEN];

bool receiveCharacter(void) {
	static int bufPtr = 0; // Указатель следующего свобоного байта в приёмном буфере
	if (! Serial.available()) return false; // Если ничего не пришло, выходим сразу (строка не готова)
	const char c = Serial.read();           // Читаем символ
	if (c == '\n' || c == '\r') {           // Если прочитанный символ - конец строки, то 
		const bool retVal = bufPtr > 0; // запоминаем, была ли у нас строка
		buffer[bufPtr] = 0;             // пишем в буфер признак конца
		bufPtr = 0;                     // В следующий раз начнём с начала
		return retVal;                  // Строка сформирована
	}	
	buffer[bufPtr++] = c;	                // запоминаем вновь полученный символ
	if (bufPtr == BUF_LEN) {/* что-то делаем */} // Реакция на переполнение буфера (пока никакой)
	return false;	                        // строка не готова
}

void setup(void) {
	Serial.begin(57600);
}

// 
//  Здесь мы обязательно дергаем receiveCharacter
//  он получит символ (если пришёл) и вернёт истину
//	если строка полностью пришла. Пока он не вернул
//	истину не паримся. а занимаемся своими делами
//
void loop(void) {
	if (receiveCharacter()) Serial.println(buffer);
	//	...
	// что-то нужное и важное
}

Теперь для разминки попробуйте усовершенствовать код так, чтобы он принимал только строки, начинающиеся со слова GET, а другие съедал. Опять же, сначала распишите словами, потому уж беритесь программировать

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

Я сейчас в командировке, торчу один в гостинице и делать мне нехрен.

Случайна, не в Н-ске?

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

Да, ты чо? Нешто я б тебе не позвонил бы. Думаю, мне было бы чем заняться вместо писания тривиальных скетчей :-)

Не, я вот здеся дурочку валяю.

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

И как там, ардуины уже строем по плацу ходят, бордюры красят, нужники драют?

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

Командировки - это хорошо, больше денег платят.

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

В жизни такую логику не придумал бы...Вот наша строка:

GET /?username=Dessan&password=12345 HTTP/1.1/n/r (надеюсь /n/r я верно поставил)

 /r - отсутствие символа, /n - новая строка 

ПРИ КАЖДОМ ПРОХОЖДЕНИИ loop

   ЕСЛИ пришёл символ ТО 
         Читаем пришедший символ
         ЕСЛИ это символ конца строки
                 ЕСЛИ принятая строка не пуста

                         Передаём принятую строку на обработку (печать)
                 КОНЕЦ ЕСЛИ
                 Обнуляем принимающий буфер (для приёма новой строки)
         ИНАЧЕ
                 Запоминаем принятый символ в буфере
         КОНЕЦ ЕСЛИ
   КОНЕЦ ЕСЛИ

Летит символ G: конец строки?-нет - Запоминаем принятый символ в буфере

Летит символ E: конец строки?-нет - Запоминаем принятый символ в буфере

Летит символ T: конец строки?-нет - Запоминаем принятый символ в буфере

Летит символ ПРОБЕЛ: конец строки?-нет - Запоминаем принятый символ в буфере

далее все символы влетают так же и проходят проверку аж до /n: /?username=Dessan&password=12345 HTTP/1.1/n

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

И за несколько часов до Вашего поста я написал вот такой код наивно полагая, что он заработает:

char parsed_Req[100];
boolean run = false;
char tempChar;
String Bufer;
int i = 0;
...
void loop() {
  
  client = server.available(); 
  if (client) { 
    while (client.connected()) {
      if (client.available()) {
        tempChar = client.read();

               if (tempChar == '?'){ // если символ '?' (начинаются нужные нам данные) то run становится True
                     run = true;
               }
              
               if((tempChar != '=') && (tempChar != '&') && (tempChar != ' ') && (run = true)){
                      Bufer += tempChar; // записываем все символы что удовлетворяют условию в буфер
                      
               }
               
                if ((tempChar == '=') || (tempChar == '&')){ // если появился символ = или &
                  parsed_Req[i] = Bufer; //присваиваем содержимое буфера нашему массиву под нужным индексом
                  Bufer = " "; //обнулили буфер
                  i+= 1; // прибавили счётчик индекса
                        
                  //break; //не знаю нужно прерывать код или нет и вообще break ли прерывает
                     
               } 

               if (tempChar == ' '){ //если появился символ Пробела
                  parsed_Req[i] = Bufer; //присваиваем содержимое буфера нашему массиву под нужным индексом
                  Bufer = " "; //обнулили буфер
                  i = 0; //обнулили счётчик на всякий случай
                  run = false; // флажок run выключаем
                        
                  //break;
                     
               } 
            }
         }
      }   
  }// end while
Serial.println(parsed_Req);
    Serial.println(parsed_Req[0]);
    Serial.println(parsed_Req[1]);
    Serial.println(parsed_Req[2]);
    Serial.println(parsed_Req[3]);

...

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

 

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

вы неисправимый (подставить самому)

почему в строке 15 вы пишите

if (tempChar == '?')

а в 19, опять

&& (run = true)

???

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

Dessan, как только Вы написали слово while, Вы тут же тормознули весь остальной код. Потом не спрашивайте "А почему у меня во время приёма данных кнопки не реагируют?". Я Вам показал как делать без него, есть символ - получаем, нету - в другой раз получим и никаких тормозов.

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

sadman41 пишет:

И как там, ардуины уже строем по плацу ходят, бордюры красят, нужники драют?

Я туда еще не добрался. Приехал сегодня, т.к. завтра ещё кое с кем надо пересечься, а мероприятие в "Эре" начинается во вторник. Вот тогда и посмотрю.

Но не думаю, что ардуины. Насколько я знаю, эти ребята на такое не размениваются. Там всё по взрослому: "клавиатура компьютерная - 200 тыс. руб.", "монитор компьютерный 14" - 980 тыс. руб." (зато с военной приёмкой и защищённые от вражеских сниферов) Какие уж тут ардуины. Там если кто и драит, так совсем другие устройства. Вояки - они во всём мире одинаковые.

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

Так проверяю строку, если пришёл символ '?' , то ставим run = true , чтоб знать с какого момента начинать обрабатывать get запрос и записывать символы в буфер. То есть пока true - мы обрабатываем. Совсем плохо?

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

Dessan пишет:

Так проверяю строку, если пришёл символ '?' , то ставим run = true , чтоб знать с какого момента начинать обрабатывать get запрос и записывать символы в буфер. То есть пока true - мы обрабатываем. Совсем плохо?

вам пишут не про 16-ую строчку, а про 19-ую

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

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

Dessan, как только Вы написали слово while, Вы тут же тормознули весь остальной код. Потом не спрашивайте "А почему у меня во время приёма данных кнопки не реагируют?". Я Вам показал как делать без него, есть символ - получаем, нету - в другой раз получим и никаких тормозов.

Да, куда мне там что писать если я типы данных подружить не могу даже. В ардуино есть стандартный пример Ethernet - WebServer, я посмотрел с десяток роликов про эту плату в которых никто ничего не переделывал,а делал из двух плат бутерброд, запускал этот пример, показывал как подключить кабель и заходил через браузер на сервер с гордой надписью "Hello World!" , потом на этой основе другие люди делали уже типа "умные дома" с двумя убогими кнопками и каким-то лейблом, то есть у них сервер отсылал запросы сам себе. Я захотел отправлять запросы не со страницы веб сервера, а с любой страницы браузера формировать Get запрос и обрабатывать его на сервере ардуино. Таких роликов я почему-то не нашёл. Вот Get запрос я сформировал, принял его на ардуино, обрадовался и решил, что распарсить его пятиминутное дело. Вот идёт четвёртый день.

Хотя, может, я с какого-то форума взял код, но что на форумах, что на ютьюб каналах, что в примерах ардуино - эти коды все как под копирку и везде цикл while. И я взял первый попавшийся рабочий код и методом тыка начал его править. Так что никакие while циклы я не создавал, я, наоборот, постирал всё, что считал лишним.

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

b707 пишет:

Dessan пишет:

Так проверяю строку, если пришёл символ '?' , то ставим run = true , чтоб знать с какого момента начинать обрабатывать get запрос и записывать символы в буфер. То есть пока true - мы обрабатываем. Совсем плохо?

вам пишут не про 16-ую строчку, а про 19-ую

Я тоже про 19. Все 4 условия должны выполниться. 

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

И Вы мне обещали код в 3-5 строчек одним только чтением и сравнением символов. Очень хочется его увидеть

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

А что Вы, вообще, за устройство-то делаете?

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

Не поверите...умный дом. Только не такой как на форумах с кучей кнопок на сером фоне и циферками, а с неограниченным ресурсом html,css и javascript, чтоб сделать красивую панель управления и заходить локально с любого устройства

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

А... с неограниченным... Blynk, Arduino Mega Server не подходит? 

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

Dessan пишет:

b707 пишет:

вам пишут не про 16-ую строчку, а про 19-ую

Я тоже про 19. Все 4 условия должны выполниться. Я пояснил свою логику, я не спорю, что она глупая.

пилять... причем тут ваша логика? вы разницу между run = true и run == true понимаете?

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

b707 пишет:

пилять... причем тут ваша логика? вы разницу между run = true и run == true понимаете?

Так вот в чём дело. Первое - присваивание, второе - сравнение

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

Dessan пишет:

Так вот в чём дело. Первое - присваивание, второе - сравнение

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

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

Dessan пишет:

И Вы мне обещали код в 3-5 строчек одним только чтением и сравнением символов. Очень хочется его увидеть

А чё, то, что я дал нещитова?

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

Теперь дошло!)Это я опечатался...код всё равно не работает из-за неправильного типа данных

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

Dessan пишет:

Не поверите...умный дом. 

Вот это, что-ли?

 

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

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

Dessan пишет:

И Вы мне обещали код в 3-5 строчек одним только чтением и сравнением символов. Очень хочется его увидеть

А чё, то, что я дал нещитова?

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

А перед этим мне нужно на примерах изучить типы переменных и как их "дружить" друг с другом

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

Dessan пишет:

Теперь дошло!)Это я опечатался...код всё равно не работает из-за неправильного типа данных

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

Сядьте и прочитайте любой учебник по языку - хотя бы первую половину

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

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

Dessan пишет:

Не поверите...умный дом. 

Вот это, что-ли?

Примерно это, только с проводами в стене.

Баловство, конечно, но почему бы и нет

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

b707 пишет:

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

Мне тут читать на месяц вперёд уже.

А с массивами-то что не так у меня?Или Вы про типы данных?

Да, error: cannot convert 'String' to 'char' in assignment

Буду исправляться

 

 

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

Хорошо, всем спасибо за помощь и участие, эту тему можно закрывать.

Учиться и учиться...

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

Dessan пишет:

А с массивами-то что не так у меня?

практически все не так. Вот, например, строка 25 кода - чушь:

parsed_Req[i] = Bufer;

Bufer - это вся строка, а parsed_Req[i] - это один единственный символ. И как вы думаете, что получится. если присвоить строку одному символу? - точно не то, что вы планировали

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

b707 пишет:

Bufer - это вся строка, а parsed_Req[i] - это один единственный символ. 

Как это единственный символ...

Вот же примеры на этом же сайте...

int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // myArray[0]    первый элемент, содержит 9
     // myArray[9]    последний элемент, содержит 11
     // myArray[10]   это неверно возможно возвращение произвольного значения из области памяти не относящийся к массиву

Присваиваем значение элементу массива:

mySensVals[0] = 10;

 

Нулевому элементу значение 10 присвоили. Здесь же не один единственный символ присвоили.

Хорошо, я неверно понял значит. Пошёл читать матчасть. 

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

Да, ты чо? Нешто я б тебе не позвонил бы. Думаю, мне было бы чем заняться вместо писания тривиальных скетчей :-)

Не, я вот здеся дурочку валяю.

А, ну в Анапах-то лучше, канеш.  У нас с утра -12 было.  Кот морду всеми лапами закрывает, видимо, усы подмерзают-таки. 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Пробую связку NodeMCU V3 CH340G + WS2811 (50 шт.).

С планшета управляю через POST запросы программкой HTTP Shortcuts.

Код парсинга, скорее всего кривой, но зато мой.

Проблема в том, что после отправки Post запроса, гирлянда реагирует через 5-7 секунд (примерно). При этом на планшете выходит, что вышел таймаут. Думаю что именно функция парсинга тормозит. Нужно как-то по другому парсинг завершать?

#include <ESP8266WiFi.h>

#define FASTLED_ESP8266_RAW_PIN_ORDER
#include "FastLED.h"
#define NUM_LEDS 50
#define PIN D8
#define COLOR_ORDER RGB

#define lenArr(sizedArr) sizeof(sizedArr)/sizeof(*sizedArr)

#define MODE 0
#define NUM 1
#define BRIGHT 2
#define RED_C 3
#define GREEN_C 4
#define BLUE_C 5


const char* ssid = "LuminousBall";
const char* password = "12345678";
IPAddress local_IP(10, 10, 10, 1);
IPAddress gateway(10, 10, 10, 1);
IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);

CRGB leds[NUM_LEDS];

const char nameP[][16] {
  {"mode"},
  {"num"},
  {"bright"},
  {"red"},
  {"green"},
  {"blue"}
};
uint8_t const lenNameP = lenArr(nameP);
uint8_t valueP[lenNameP] {};

void parsing(char const c) {
  static bool go = 0, nameS=0, valueS=0;
  static char nameStr[16];
  static uint8_t iNameP=0, value=0, iValue=0;
  if (go) {
    if (nameS && c != '=') {nameStr[iNameP] = c; iNameP++;} else if (c == '=') nameStr[iNameP] = '\0';
    if (valueS && (c != '&' && c != ' ')) value = value * 10 + (uint8_t(c) - 48); 
  }
  if (c == '?') go = 1;
  if (go) {
    if (c == '?' || c == '&') {nameS = 1; valueS = 0; for (uint8_t i = 0; i < 16; i++) nameStr[i] = ' ';}
    if (c == '&' || c == ' ') valueP[iValue] = value;
    if (c == '=') {
      valueS = 1; nameS = 0; value = 0; iNameP=0;
      for (uint8_t i = 0; i < lenNameP; i++)
          if (strcmp(nameP[i], nameStr) == 0) { iValue = i; break;}
    }
  }
  if (c == ' ') {go = 0; nameS = 0; valueS = 0;}
}

void allLeds(uint8_t red, uint8_t green, uint8_t blue, uint8_t bright) {
    for (uint8_t i=0; i< NUM_LEDS; i++) leds[i] = CRGB(red, green, blue);
    FastLED.setBrightness(bright);
}

void setup() {
   
    WiFi.mode(WIFI_AP);
    WiFi.softAPConfig(local_IP, gateway, subnet);
    WiFi.softAP(ssid, password);
    server.begin();

    FastLED.addLeds<WS2811, PIN>(leds, NUM_LEDS);
    
}

void loop() {
   
  WiFiClient client = server.available();
  while (client.connected()) 
       if (client.available()) parsing(client.read());
  if (!client.connected()) 
    client.stop();

  if (valueP[MODE]) {
    switch (valueP[MODE]) {
      case 2: {
        allLeds(valueP[RED_C], valueP[GREEN_C], valueP[BLUE_C], valueP[BRIGHT]);
        break;
      }
    }
    FastLED.show();
    for (uint8_t i = 0; i < lenNameP; i++) valueP[i] = 0;
  }
    
   delay(10);
}

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

что-то как-то сетевые настройки при такой маске у тебя странноваты )))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

ua6em пишет:

что-то как-то сетевые настройки при такой маске у тебя странноваты )))

22 строка там в принципе и не нужна, но исправил.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ua6em пишет:

что-то как-то сетевые настройки при такой маске у тебя странноваты )))

Это намек на "192.168" и так далее? Так никто не мешает делать как автор (и не запрещает этого!).

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

По теме вопроса - перемести вот это:

while (client.connected())

В Setup()

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

BOOM пишет:

ua6em пишет:

что-то как-то сетевые настройки при такой маске у тебя странноваты )))

Это намек на "192.168" и так далее? Так никто не мешает делать как автор (и не запрещает этого!).

У меня действительно была ошибка в 22 строке, уже подредактировал, в маску не попадало. А так у нас на работе и 10.10.10.0 /24 тоже технологическая сеть используется.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

AndreyD пишет:

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

Видимо редактировал до того как я посмотрел - ничего криминального там не увидел ))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

BOOM пишет:

По теме вопроса - перемести вот это:

while (client.connected())

В Setup()

А ну да, он то и тормозит, ну думаю тут надо по другому.

Так вроде.

  while (client.connected()) {
       if (client.available()) parsing(client.read());
       else client.stop();
  }

Проверил, заработало нормально.

Но в HTTP Shortcuts ошибка unexpected end of stream on connection

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну если это все в setup() перенес, то работать только 1 раз будет. Надо примерно так:

#include <ESP8266WiFi.h>

#define FASTLED_ESP8266_RAW_PIN_ORDER
#include "FastLED.h"
#define NUM_LEDS 50
#define PIN D8
#define COLOR_ORDER RGB

#define lenArr(sizedArr) sizeof(sizedArr)/sizeof(*sizedArr)

#define MODE 0
#define NUM 1
#define BRIGHT 2
#define RED_C 3
#define GREEN_C 4
#define BLUE_C 5


const char* ssid = "LuminousBall";
const char* password = "12345678";
IPAddress local_IP(10, 10, 10, 1);
IPAddress gateway(10, 10, 10, 1);
IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);

CRGB leds[NUM_LEDS];

const char nameP[][16] {
  {"mode"},
  {"num"},
  {"bright"},
  {"red"},
  {"green"},
  {"blue"}
};
uint8_t const lenNameP = lenArr(nameP);
uint8_t valueP[lenNameP] {};

void parsing(char const c) {
  static bool go = 0, nameS = 0, valueS = 0;
  static char nameStr[16];
  static uint8_t iNameP = 0, value = 0, iValue = 0;
  if (go) {
    if (nameS && c != '=') {
      nameStr[iNameP] = c;
      iNameP++;
    } else if (c == '=') nameStr[iNameP] = '\0';
    if (valueS && (c != '&' && c != ' ')) value = value * 10 + (uint8_t(c) - 48);
  }
  if (c == '?') go = 1;
  if (go) {
    if (c == '?' || c == '&') {
      nameS = 1;
      valueS = 0;
      for (uint8_t i = 0; i < 16; i++) nameStr[i] = ' ';
    }
    if (c == '&' || c == ' ') valueP[iValue] = value;
    if (c == '=') {
      valueS = 1; nameS = 0; value = 0; iNameP = 0;
      for (uint8_t i = 0; i < lenNameP; i++)
        if (strcmp(nameP[i], nameStr) == 0) {
          iValue = i;
          break;
        }
    }
  }
  if (c == ' ') {
    go = 0;
    nameS = 0;
    valueS = 0;
  }
}

void allLeds(uint8_t red, uint8_t green, uint8_t blue, uint8_t bright) {
  for (uint8_t i = 0; i < NUM_LEDS; i++) leds[i] = CRGB(red, green, blue);
  FastLED.setBrightness(bright);
}

void setup() {

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(local_IP, gateway, subnet);
  WiFi.softAP(ssid, password);
  server.begin();
  while (!client.connected());
  FastLED.addLeds<WS2811, PIN>(leds, NUM_LEDS);

}

void loop() {

  WiFiClient client = server.available();
  if (client.available()) {
    parsing(client.read());
  }
  if (valueP[MODE]) {
    switch (valueP[MODE]) {
      case 2: {
          allLeds(valueP[RED_C], valueP[GREEN_C], valueP[BLUE_C], valueP[BRIGHT]);
          break;
        }
    }
    FastLED.show();
    for (uint8_t i = 0; i < lenNameP; i++) {
      valueP[i] = 0;
    }
  }
  delay(10);
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

BOOM пишет:

А мне не нужно только раз, клиент может подключаться несколько раз.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Пробовал тот код, что я привел?

Смысл клиента вай-фай понимаешь? Ему подключиться к вайфаю нужно и все. Дальше железки сами общаются по tcp/ip.

Переподключаться к сети вай-фай при отключении вай-фай или потери сигнала железка сама должна. Но можешь для успокоения души конечно налепить что-то еще в лупе, но я лично точно это не знаю.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

BOOM пишет:

Пробовал тот код, что я привел?

Смысл клиента вай-фай понимаешь? Ему подключиться к вайфаю нужно и все. Дальше железки сами общаются по tcp/ip.

Переподключаться к сети вай-фай при отключении вай-фай или потери сигнала железка сама должна. Но можешь для успокоения души конечно налепить что-то еще в лупе, но я лично точно это не знаю.

У меня же nodeMCU это точка доступа, а к ней уже клиенты подключаются.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну а причем тут клиент тогда? (особо в код не вчитывался)

http://www.joyta.ru/12628-sozdanie-prostogo-veb-servera-nodemcu-esp8266-v-arduino-ide/

Читай.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

BOOM пишет:

Ну а причем тут клиент тогда? (особо в код не вчитывался)

http://www.joyta.ru/12628-sozdanie-prostogo-veb-servera-nodemcu-esp8266-v-arduino-ide/

Читай.

Почитаю. Но уточню, nodeMCU на данный момент у меня точка доступа (позже в планах добавить настройку на подключение к произвольному wifi роутеру), сейчас должно работать без роутера. Веб сервера на nodeMCU не будет, будет управляться POST запросами. Ну это как я вижу, ещё разбираюсь.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

AndreyD пишет:

Веб сервера на nodeMCU не будет, будет управляться POST запросами.

Тогда заодно еще и читай что такое POST-запросы на WEB-СЕРВЕР. )))