Передать или получить массив по HTTP
- Войдите на сайт для отправки комментариев
Пнд, 04/07/2022 - 02:44
Доброго времени суток. Что-то я подзапутался. Не пойму, как передать/получить массив по HTTP. Вообще хочу передать массивом значение статусов реле. По одному передаю строкой. Получается. Массивом пока не могу придумать.
Допустим есть массив:
int arrayStatus[] = {0,0,0,0,0,0,0,0};
Естественно, его значение может меняться. Но это не важно, как должен выглядеть HTTP запрос/ответ? Понимаю, что приблизительно так, но массив не строка, потому не работает
server.on("/chek_status", [](){ server.send(200, "text/html", arrayStatus); delay(100); });
Потому что любой массив можно передать строкой с разделителями. При отправке сформировать строку, при получении распарсить.
Например:
Ну и другие параметры в эту строку можно «запихать»
8 значений можно байтом передать. Каждый бит - состояние. Одно число в реквесте.
только надо учитывать, что при любом способе передачи. отличном от text/html - нужно еще уметь принять эти данные на стороне приемника. Обычный браузер ничего не знает о том, как например из 1 байта извлечь 8 статусов реле :)
Потому что любой массив можно передать строкой с разделителями. При отправке сформировать строку, при получении распарсить.
Например:
Ну и другие параметры в эту строку можно «запихать»
Да, но у меня что-то не получается собрать элементы массива в строку. Это одна из загвоздок.
8 значений можно байтом передать. Каждый бит - состояние. Одно число в реквесте.
Тоже думал и читал что-то о таком, но не понял как сделать. Типа можно сразу как-то прочитать состояние пинов в байты. И вроде как какие-то PINA, PINB, PINC и PIND используются. Но не нашел как это сделать. И если вдруг 16 пинов? Передать два байта?
только надо учитывать, что при любом способе передачи. отличном от text/html - нужно еще уметь принять эти данные на стороне приемника. Обычный браузер ничего не знает о том, как например из 1 байта извлечь 8 статусов реле :)
Это понятно ))) Браузер вообще почти ничего не умеет. Для этого джаваскрипт нужен. К сожалению php на ардуину не запихнешь.
Да, но у меня что-то не получается собрать элементы массива в строку. Это одна из загвоздок.
Вывести в монитор порта строку "Rele1=ON" можете? А в чем разница со строкой?
Потому что любой массив можно передать строкой с разделителями. При отправке сформировать строку, при получении распарсить.
Например:
Ну и другие параметры в эту строку можно «запихать»
Да, но у меня что-то не получается собрать элементы массива в строку. Это одна из загвоздок.
Чо там может не получаться? Не знаешь просто.
И всего делов то...
Этта шо?
int
arraySize = size (arrayStatus) / arrayStatus[0];
Этта шо?
int
arraySize = size (arrayStatus) / arrayStatus[0];
Этта нехрен тарапиццо )))))
Этта шо?
int
arraySize = size (arrayStatus) / arrayStatus[0];
Этта нехрен тарапиццо )))))
Дидада таг делать! ;))
Это же учебник по С++! Размер массива вынимаиццо шаблоном.
Исключим всех из программистов и отправим снег в Сибири убирать. Весь!
Йа шаблоны не умею, йа не настоящий программист.... ))))
Как вот сделать, чтобы получить это значение, а не напечатать в сериал?
Йа шаблоны не умею, йа не настоящий программист.... ))))
Как вот сделать, чтобы получить это значение, а не напечатать в сериал?
Мне бабушка в детстве про оператор return по секрету рассказывала! ;))
Тып, все-таки, почитал учебник по С++. Давно же на форуме. Неужели не интересно, как на самом деле программировать надо?
----------------
UPDATE
Вот это пример из учебника по С++. Не скажу - из какого, памойму - из ЛЮБОГО!
У меня любительский вопрос: в контексте операции взятия длины массива чем отличается на выходе темплейт от дефайна?
Мне бабушка в детстве про оператор return по секрету рассказывала! ;))
короче - загубленное детство, а мы по скалам, пещерам, рощам, рыбу карбидом или усача на донку и, купаться, купаться и еще раз купаться (если лето)
ступил
тем что шаблонную функцию фиг положищь в .cpp файл - не скомпилится :)
Вывести в монитор порта строку "Rele1=ON" можете? А в чем разница со строкой?
Например так (оставляем только то, что касается перебора массива):
А вот про разницу со строкой не понял, что именно вас интересует?
Чо там может не получаться? Не знаешь просто.
И всего делов то...
Не работает. Я конечно чуток поменял, сразу в функцию закинул, но не думаю, что в этом есть проблема:
Этта шо?
int
arraySize = size (arrayStatus) / arrayStatus[0];
Этта нехрен тарапиццо )))))
Дидада таг делать! ;))
Это же учебник по С++! Размер массива вынимаиццо шаблоном.
Исключим всех из программистов и отправим снег в Сибири убирать. Весь!
К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:
Йа шаблоны не умею, йа не настоящий программист.... ))))
Как вот сделать, чтобы получить это значение, а не напечатать в сериал?
Мне бабушка в детстве про оператор return по секрету рассказывала! ;))
Тып, все-таки, почитал учебник по С++. Давно же на форуме. Неужели не интересно, как на самом деле программировать надо?
----------------
UPDATE
Вот это пример из учебника по С++. Не скажу - из какого, памойму - из ЛЮБОГО!
Дык о return первым делом подумал. Но в функциях знаю как. До шаблонофф не дорос. Да и не нужны они мне - я не настоящий программист. Мне и того (что выше привёл) хватает... Без обид, надеюсь?)
Чо там может не получаться? Не знаешь просто.
И всего делов то...
Не работает. Я конечно чуток поменял, сразу в функцию закинул, но не думаю, что в этом есть проблема:
Дык, ёмоё, я показал идею как можно делать (ты же сказал, что не понимаешь КАК), сам код даже не пытался компилировать. Уж дальше сам. А если так всё тяжко, то повременил бы. Диодиком помигай, релюшкой по щёлкай.
Одно дело подсказать, другое дело сделать ЗА ТЕБЯ. Да и что значит НЕ РАБОТАЕТ? Это общие слова. Ошибка? Или что? Покажи лог, расскажи развёрнуто.
К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:
Нет. Это не правда. Не нужно пользоваться старыми версиями IDE.
Смешно, но ровно на эту же тему был тут эль шкандаль. Вот именно на шаблон и старую версию и эту ошибку!
Тебе - простительно. Ты, всё таки, чайник. Но тот дииспут был с программистом.
К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:
Нет. Это не правда. Не нужно пользоваться старыми версиями IDE.
Смешно, но ровно на эту же тему был тут эль шкандаль. Вот именно на шаблон и старую версию и эту ошибку!
Тебе - простительно. Ты, всё таки, чайник. Но тот дииспут был с программистом.
а так работает )))
а так работает )))
а это - ты молодец!!! Это правильное исправление. И мой недочет!
Дык, ёмоё, я показал идею как можно делать (ты же сказал, что не понимаешь КАК), сам код даже не пытался компилировать. Уж дальше сам. А если так всё тяжко, то повременил бы. Диодиком помигай, релюшкой по щёлкай.
Одно дело подсказать, другое дело сделать ЗА ТЕБЯ. Да и что значит НЕ РАБОТАЕТ? Это общие слова. Ошибка? Или что? Покажи лог, расскажи развёрнуто.
За меня делать не обязательно ))) И я думал, что достаточно того коментария с указанием строки, на которую ругается.
Но в принципе, тут не прав, нужно было и правда более развернуто привести ошибку. Это именно ошибка, не предупреждение (варнинг)
А релюшкой мигаю ))) как раз осталось передать на страничку управления вшитую в ардуинку (esp8266). Я выделил место под фтп, залил туда индекс.штмл с джавоскриптом и мигаю релюшкой по одному индикатору. Можно тупо руками сразу все прописать, но хочется красиво с массивами. С датчиками, движками и прочим пока не связывался. Не нужно в первую очередь.
Пы.Сы. Жаль, что не понял, что вы привели только принципиальную схему. Думал дали уже готовый код.
К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:
Нет. Это не правда. Не нужно пользоваться старыми версиями IDE.
Смешно, но ровно на эту же тему был тут эль шкандаль. Вот именно на шаблон и старую версию и эту ошибку!
Тебе - простительно. Ты, всё таки, чайник. Но тот дииспут был с программистом.
У меня знаний и выдумки не хватит придумать пример лога ошибки ))))) Я ж не зря написал/про цитировал ошибку. Она не с неба взялась. И пользуюсь версией 2, даже не 1.18.13. Правда она портативная, и уже успел заметить как минимум один баг. Не хватает скорости обмена 74880. Из-за чего у меня идут крякозябры. Мне тут не верили и пришлось даже скрин показать. После чего отправили учить мат часть по работе интерфейса UATR. Только так и не пояснили, как это связано и как мне поможет настроить мою портативную Ардуино Иде 2, честно скачанную с офсайта.
Только так и не пояснили, как это связано и как мне поможет ...
всё старо как мир -"лучшее враг хорошего!"
Перевожу на обывательский, поставь 1.8.19 и не выпендривайся...
Но в принципе, тут не прав, нужно было и правда более развернуто привести ошибку. Это именно ошибка, не предупреждение (варнинг)
Явное приведение типа нужно. Вот так у меня компилируется:
resStr += String(
"rele"
) + String(i) + String(
"="
) + String(arrayStatus [i]) + String(
"&"
);
очень затратно в плане памяти и быстродействия. проще сначала слить все при помощи sprintf, а уж потом, если так надо, преобразовать в String
Да это же как пример, а там пусть аффтар сам думает - как ему угодно... )))
ЗЫ: Относительно Atmega8 с Serial:
Без Serial:
Без Serial да еще за комментировал 11 строку:
всё старо как мир -"лучшее враг хорошего!"
Перевожу на обывательский, поставь 1.8.19 и не выпендривайся...
Дело в том, что вторая версия понимает русский язык в названии скетча и может автозавершать код. Пусть и несколько обрезано, но для такого невнимательного человека как я, это большое подспорье.
Но это не поясняет как знание UART помогло бы с настройкой программы.
Явное приведение типа нужно. Вот так у меня компилируется:
Да, так компилирует.
А чем отличается запись типа:
от вашего варианта:
И хочу признаться, что ступил, делал похожий вариант, но не подумал, что нужно ещё и переменные в стринг перевести. По инерции только слова и символы сделал стрингом.
resStr += String(
"rele"
) + String(i) + String(
"="
) + String(arrayStatus [i]) + String(
"&"
);
очень затратно в плане памяти и быстродействия. проще сначала слить все при помощи sprintf, а уж потом, если так надо, преобразовать в String
Попробую и так.
Но у меня появилась мысль все перевести в JSON. Но, к сожалению, не научен понимать, где больше затрат памяти.
Везде кроме прямого принта.
Явное приведение типа нужно. Вот так у меня компилируется:
Да, так компилирует.
А чем отличается запись типа:
от вашего варианта:
И хочу признаться, что ступил, делал похожий вариант, но не подумал, что нужно ещё и переменные в стринг перевести. По инерции только слова и символы сделал стрингом.
В моем примере - явное приведение типа, что такое вы изобразили - понятия не имею.
В моем примере - явное приведение типа, что такое вы изобразили - понятия не имею.
Видел такие примеры на буржуйских форумах. Причем они работают. И я в этой же теме, кроме этого примера, несколькими постами выше привел вполне себе рабочий пример такого использования. Правда я плохо знаю англ, потому не совсем понял перевод, но типа тоже явное приведение к типу стринг, но вроде как быстрое.
Не понял, о чем это. Это про затраты памяти?
И я в этой же теме, несколькими постами выше привел вполне себе рабочий пример такого использования.
типа тоже явное приведение к типу стринг, но вроде как быстрое.
в каком сообщении?
Видел такие примеры на буржуйских форумах. Причем они работают.
Никто и не сомневался )))
Лучше переходи к следующему этапу, если строку сформировать уже можешь.)
Не понял, о чем это. Это про затраты памяти?
Конечно.
И я в этой же теме, несколькими постами выше привел вполне себе рабочий пример такого использования.
типа тоже явное приведение к типу стринг, но вроде как быстрое.
в каком сообщении?
Сообщение вот https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/peredat-ili-poluchit-massiv-po-http#comment-659555
Только у меня появились сомнения о взаимопонимании... Имелось ввиду, что такая запись как у меня быстрее по утверждениям англоязчных форумов (на том уровне, что я понимаю англ язык)
Видел такие примеры на буржуйских форумах. Причем они работают.
Никто и не сомневался )))
Лучше переходи к следующему этапу, если строку сформировать уже можешь.)
Например я сомневаюсь, как лучше. Сам оценить не могу.
И с этим этапом нужно ещё разбираться. СТрока то формируется, но она каждый раз удлиняется. Тоесть посылаешь HTTP запрос и его результат потом висит в памяти, и новый присоединяется к старому результату.
Но я все больше смотрю в сторону джсона. Останавливает только то, что чужие парсил, а свои не составлял. Никак понять не могу, что лучше, передавать массивом или объектом. Да и что значит объектом, если результат выглядит как многоуровневый массив (ассоциативный массив, или словарь)
посылаешь HTTP запрос и его результат потом висит в памяти, и новый присоединяется к старому результату.
Оправил запрос и обнулил результирующую строку. И память цела и ничего ни к чему не присоединяется. ))