Роль посредника между HTML-страницей и Ардуино

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

Мужики, добрый день! Никак не выходит каменный цветок, сколько бы я ни бился... Цель такова: создать приличную по виду веб-страничку управления дуинкой, с онлайн отображением/отправкой данных по средством AJAX... Я уже как-то поднимал подобную тему, но вспомнить ее название так и не получилось.... Так вот, собственно, в чем вопрос: помогите понять принцип такой передачи... Я перечитал уже вагон даже англоязычных статей и в связи с этим вагоном еще больше запутался... Итого втречал несколько способов такого взаимодействия:

1. HTML - AJAX(jQuery) - PHP - (тут вроде как что-то на С++ для считывания UARTа) - UART-Ардуино.. Тобишь взаимодействие БЕЗ w5100-шилда...

2. HTML - AJAX(jQuery) - W5100 - Arduino... Взаимодействие С w5100-шилдом...

3. MajorDomo - там вроде все шикарно, даже с киборгом разговаривать можно, но инструкции понятной общения с дуинкой нету да и половина плюшек попросту не нужна...

4. ArduinoMegaServer - но это, как я понимаю, частный случай пункта №2...

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

1. Как все-таки правильно должен выглядеть пункт №1? (и вообще правильный ли пункт №2?)

2. Просто совет: А кто какой системой пользуется и почему выбрал именно ее?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Чё-то сумбур какой-то......

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Чтобы ардуина умела общаться с внешним миром - ей нужно, грубо говоря, окно во внешний мир. Это может быть UART, или любой другой шлюз, например, TCP/IP. Если вы хотите общаться с ардуиной посредством TCP/IP - то вам по-любому придётся использовать железный шлюз, типа ESP или уже упомянутого W5100.

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

Личное мнение: не советовал бы хранить всю вебморду на ардуине, будь то прошитая в скетч жёстко или хранящаяся на SD-карте. Во-первых, скорости отдачи будут черепашьи, сколько вы ни бейтесь - ну добьётесь максимум 10 килобайт в секунду - ну черепаха же! Во-вторых - это отнимает и так небольшие ресурсы дуины.

Что бы посоветовал для домашней автоматизации? Роутер с прошивкой openWRT - там и базу sqlite3 можно поднять, и скорости отдачи вебморды, понятное дело, нормальные. На роутере - вся вебморда, хоть для ста устройств. Конечное устройство - общается с роутером только короткими командами, отдавая ему по запросу слепок своего внутреннего состояния, и умея, опять же, по запросу извне - менять своё внутреннее состояние (включать/выключать чего там надо и т.п.).

Естественно, при таком раскладе ардуина может работать и автономно, при наличии неких прошитых в неё настроек. Можно к ней приделать экран с кнопками, и помимо вебморды - рулить настройками ещё и так. Ограничений - практически никаких.

Так что ответ на ваш вопрос таков: роль посредника между HTML-страницей и ардуино выполняет железка, реализующая внутри себя стэк TCP/IP. Железок этих - масса: ESP8266, W5100 и пр. и пр.

Но, повторюсь: я бы делал опрос ардуины из-под openWRT, и не по 80-му порту точно. Ибо нефик - грузить дуину ненужной для нее безделицей.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

В первом варианте, посредника можно писать в привычной для ардуинщиков IDE processing.

Есть две библиотеки с примерами, которые можно для этого использовать: Serial и Network.

Я сейчас тоже делаю что-то подобное, только без выхода в интернет, на чистом JAVA.

Processing по сути это тоже JAVA.

https://processing.org/download/

https://processing.org/reference/libraries/

https://processing.org/reference/

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

DIYMan, ,благодарю Вас за развернутый ответ...Кстати, ни одно уведомление не пришло на почту об ответе... Вы говорите про "Роутер с прошивкой openWRT "... У меня, в принципе, вместо него есть целый системный блок с виндой в подвале и установленным денвером... Думаю сойдет...

DIYMan пишет:
 Если вы хотите общаться с ардуиной посредством TCP/IP - то вам по-любому придётся использовать железный шлюз, типа ESP или уже упомянутого W5100.

Это да, но что-то мне подсказывает с таким вариантом мне придется изучить кучу литературы по jQuery и AJAX и написать кучу кода по обработке ответов на самой дуинке (хотя я 99% могу быть не прав)... А как быть, если ардуинка будет общаться с внешним миром через УАРТ??? Честно говоря, разбор полетов (строк) по Serial мне кажется более простым (наверное, потому, что я привык к нему просто). К примеру Ардуино раз в секунду выплевывает в УАРТ строку вида "D1=0;D2=1;T=30;" а ЧТО-ТО на противоположной стороне обрабатывает эту строку и посредством AJAXа отображает значения в веб-морде... Вот что это ЧТО-ТО??? PHP? Или какая другая? Если роль этого единственного посредника между веб-мордой и УАРТом ардуины может выполнить PHP, то скажите мне об этом и я начну наизусть учить сайт php.su...Ну и обратный процесс, следовательно, подобный: жму я, допустим, на кнопку в своей веб-морде и jQuery посредством ajax посылает опять же в это ЧТО-ТО данные, а это ЧТО-ТО обрабатывает эти данные и пихает в сериал порт ардуинки... Вот так наиболее просто я в данный момент вижу это взаимодействие...

Nosferatu пишет:

В первом варианте, посредника можно писать в привычной для ардуинщиков IDE processing.

Есть две библиотеки с примерами, которые можно для этого использовать: Serial и Network.

Nosferatu, Благодарю Вас за ответ... Если бы я 5 лет зря не потерял изучая сто процессов металлообработки всем чем под руку попадется, то, наверное, сразу бы Вас понял))). Можно суть немного поподробнее?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Andrey-S пишет:
что-то мне подсказывает с таким вариантом мне придется изучить кучу литературы по jQuery и AJAX и написать кучу кода по обработке ответов на самой дуинке (хотя я 99% могу быть не прав)... А как быть, если ардуинка будет общаться с внешним миром через УАРТ??? Честно говоря, разбор полетов (строк) по Serial мне кажется более простым (наверное, потому, что я привык к нему просто). К примеру Ардуино раз в секунду выплевывает в УАРТ строку вида "D1=0;D2=1;T=30;" а ЧТО-ТО на противоположной стороне обрабатывает эту строку и посредством AJAXа отображает значения в веб-морде... Вот что это ЧТО-ТО??? PHP? Или какая другая? Если роль этого единственного посредника между веб-мордой и УАРТом ардуины может выполнить PHP, то скажите мне об этом и я начну наизусть учить сайт php.su...Ну и обратный процесс, следовательно, подобный: жму я, допустим, на кнопку в своей веб-морде и jQuery посредством ajax посылает опять же в это ЧТО-ТО данные, а это ЧТО-ТО обрабатывает эти данные и пихает в сериал порт ардуинки... Вот так наиболее просто я в данный момент вижу это взаимодействие...
Очередной сумбур "смешались в кучу кони люди и залпы тысячи орудий".

Ты ведешь речь о взаимодействии клиент-сервер. Клиентом выступает браузер на твоем компе, сервером - дуина. Инициатор всегда клиент, именно он генерит GET/POST запросы серверу. Сервер только отвечает на запросы. Какая тебе в данный момент разница при помощи чего формируются эти запросы? Хоть ручками набери в адресной строке браузера, хоть html формой, хоть javascriptом. Это вопрос дизайна web морды, а не дуины... Сервер ничего не делает раз в секунду, он лишь отвечает на запросы клиента. Да, PHP вклинивается между клиентом и сервером на стороне сервера. Но как это облегчает твою жизнь? Ты не поверишь, но шилды обычно подключаются к дуине, как serial порты и GSM и Ethernet и Wi-Fi. Разная среда передачи, разная специфика работы с устройствами, но суть одна, получить от клиента запрос и ответить на него.

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

Andy пишет:

Ты ведешь речь о взаимодействии клиент-сервер. Клиентом выступает браузер на твоем компе, сервером - дуина. Инициатор всегда клиент, именно он генерит GET/POST запросы серверу. Сервер только отвечает на запросы. Какая тебе в данный момент разница при помощи чего формируются эти запросы? Хоть ручками набери в адресной строке браузера, хоть html формой, хоть javascriptом. Это вопрос дизайна web морды, а не дуины... Сервер ничего не делает раз в секунду, он лишь отвечает на запросы клиента. Да, PHP вклинивается между клиентом и сервером на стороне сервера. Но как это облегчает твою жизнь? Ты не поверишь, но шилды обычно подключаются к дуине, как serial порты и GSM и Ethernet и Wi-Fi. Разная среда передачи, разная специфика работы с устройствами, но суть одна, получить от клиента запрос и ответить на него.

Спасибо, но Ваш ответ немного не о том... Меня больше интересует ЧТО (php, javascript, питон и т.п.)будет первоочередно обрабатывать поступившие с УАРТа дуинки данные и далее отправлять их в веб-морду посредством AJAX-запроса. Вот тут https://habrahabr.ru/post/167209/ в принципе объясняется то, что я хочу... Только связка там Ардуино(уарт) - питон - веб-морда... Я бы сделал все как там, да без питона хочется...Да и код там кривоват

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Andrey-S пишет:

Спасибо, но Ваш ответ немного не о том... Меня больше интересует ЧТО (php, javascript, питон и т.п.)будет первоочередно обрабатывать поступившие с УАРТа дуинки данные и далее отправлять их в веб-морду посредством AJAX-запроса. Вот тут https://habrahabr.ru/post/167209/ в принципе объясняется то, что я хочу... Только связка там Ардуино(уарт) - питон - веб-морда... Я бы сделал все как там, да без питона хочется...Да и код там кривоват

Вам уже сказали, что вы всё смешали в кучу. Вот смотрите, на примере UART: у вас есть дуина, которая выплёвывает в порт раз в секунду данные. Вы хотите, чтобы эти данные отображались на веб-страничке. Давайте разберём на примере линукса:

1. Соединяете комп и ардуину по UART;

2. На стороне компа открываете порт (/dev/чего-то-там), и начинаете его слушать.

3. Как только пришли данные - складываете их хоть куда: в базу, в файл, ещё куда-нибудь;

4. ВСЁ!!!!!!

Всего четыре пункта, чтобы иметь на компе (роутере с openWRT) актуальный слепок состояния контроллера, как видите. Далее вам нужна вебморда:

1. Запускаем сервер на компе (Apache, например);

2. Пишем скрипт (например, на PHP), который выдаёт по запросу к нему слепок состояния контроллера, сохранённый ранее в файл/в базу/ ещё куда.

3. Открываем браузер, вводим адрес вашего сервера и имя странички, загружаем её, любуемся.

4. ВСЁ!!!!!!

Если нужен AJAX - это также делается на вебморде: берётся jQuery, например, и с клиентского скрипта запрашивается ваш PHP-скрипт, который пихает в ответ слепок состояния ардуины.

В итоге получаете жирнейшую вебморду, без ограничений по скорости загрузки, кол-ву рисунков, кол-ву поддерживаемых контроллеров и т.д. При этом всё общение с ардуиной сводится к регулярному гонянию по UART пары сотен байт в секунду, всё.

Так понятней?

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Andrey-S пишет:

Nosferatu пишет:

В первом варианте, посредника можно писать в привычной для ардуинщиков IDE processing.

Есть две библиотеки с примерами, которые можно для этого использовать: Serial и Network.

Nosferatu, Благодарю Вас за ответ... Если бы я 5 лет зря не потерял изучая сто процессов металлообработки всем чем под руку попадется, то, наверное, сразу бы Вас понял))). Можно суть немного поподробнее?

Есть у меня скетч на процессинге, для записи того, что шлёт ардуино, в файл на компьютере.

Лучше я покажу мам код, чем разглагольствовать.

import processing.serial.*;  
Serial port; 
String[] list;
void setup()
{
  port = new Serial(this, "COM7", 9600); // Имя порта и скорость
}

void draw()
{     
  if(port.available() > 0){  // Если пришли данные
    String inBuffer = port.readString();  // Записываю данные из порта в переменную 
    if (inBuffer != null){	
      String lines[] = loadStrings("log.txt"); // Читаю содержимое файла и создаю массив строк
      list = split(inBuffer, ' '); // Разбиваю на строки по пробелу 
      list = concat(lines, list); // Объединяю  два массива
      saveStrings("log.txt", list); // Записываю массив строк в файл
    }
  }
}

Что бы не выдавало ошибку, надо рядом со скетчем создать файл "log.txt".

Вы можете немного изменить этот код и использовать файл "log.txt"  как базу данных.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Andrey-S пишет:
Меня больше интересует ЧТО (php, javascript, питон и т.п.)будет первоочередно обрабатывать поступившие с УАРТа дуинки данные и далее отправлять их в веб-морду посредством AJAX-запроса.
Другими словами: 2 компа, один из которых выполняет роль клиента, другой роль WEB сервера, дуина подключена к серверу по COM порту. На сервере запущен PHP. При запросе клиентом странички с сервера, PHP запускает прогу, которая получает данные с дуины и складывает их в файл, далее PHP скрипт генерит html код с этими данными и отдает клиенту. Так?

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

Andy, точно в яблочко! 

Andy пишет:

При запросе клиентом странички с сервера, PHP запускает ПРОГУ, которая получает данные с дуины и складывает их в файл, далее PHP скрипт генерит html код ...

Вот что это за ПРОГА??? Nosferatu, я так понимаю, Ваш код это как раз та ПРОГА, написанная в процессинге, о которой говорил Andy в предыдущем посте? 

DIYMan, спасибо за объяснение...

DIYMan пишет:

2. Пишем скрипт (например, на PHP), который выдаёт по запросу к нему слепок состояния контроллера, сохранённый ранее в файл/в базу/ ещё куда.

Вот этот момент интересен...Скрипт выдает слепок состояния контроллера, сохраненный ранее в файл/базу/..... ЧЕМ сохранен?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Andrey-S пишет:
Вот что это за ПРОГА?
Я в таких случаях открываю VisualStudio и пишу эту самую прогу.

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

Andy пишет:

Я в таких случаях открываю VisualStudio и пишу эту самую прогу.

Я не знаком с такой программой еще совсем... Тобишь, я так понимаю, ручками пишется программа на языке Си, которая хранит в себе полученное с дуинки по УАРТу значение и отдает это значение php-скрипту, который в свою очередь выплевывает эти данные в соответствующий раздел html-страницы? Ну и обратный процесс аналогичен, соответственно.  А код из 8-го поста это не то же самое, что и программа в  VisualStudio ?

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Andrey-S пишет:

Andy пишет:

При запросе клиентом странички с сервера, PHP запускает ПРОГУ, которая получает данные с дуины и складывает их в файл, далее PHP скрипт генерит html код ...

Вот что это за ПРОГА??? Nosferatu, я так понимаю, Ваш код это как раз та ПРОГА, написанная в процессинге, о которой говорил Andy в предыдущем посте? 

Да, но только этот код надо немного переделать.

Вообще, используя Processing, можно отказаться от использования AJAX и PHP .

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

Nosferatu пишет:

Вообще, используя Processing, можно отказаться от использования AJAX и PHP .

Умеете Вы заинтриговать)))

axill
Offline
Зарегистрирован: 05.09.2011

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

если вам нужно рулить железом с красивых полновесных вэб страниц то для этого есть мини писи, типа raspberry pi. Их сейчас много разных по мощности, размеру и цене. На любую можно поставить линукс с апаче и писать сайт на чем угодно, на некоторые вроде даже есть win10 если очень хочется. Там же есть целая куча пинов для железа включая SPI, UART и I2C

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

axill пишет:

если вам нужно рулить железом с красивых полновесных вэб страниц то для этого есть мини писи, типа raspberry pi. Их сейчас много разных по мощности, размеру и цене. На любую можно поставить линукс с апаче и писать сайт на чем угодно, на некоторые вроде даже есть win10 если очень хочется. Там же есть целая куча пинов для железа включая SPI, UART и I2C

Спасибо за информацию... Я уже заказал вроде бы нечто подобное... http://ru.aliexpress.com/item/Orange-Pi-One-ubuntu-linux-and-android-mini-PC-Beyond-and-Compatible-with-Raspberry-Pi-2/32603308880.html  Подойдет такое чудо? Но это если говорить об оптимальной так скажем технологии реализации поставленной задачи... Можно ж вообще нанять кого-то и напишут мне за энную сумму код и скажут и покажут как собрать велосипед из пряников, а мне все же интересен сам процесс: как, зачем ды почему... 

axill
Offline
Зарегистрирован: 05.09.2011

Andrey-S пишет:

Спасибо за информацию... Я уже заказал вроде бы нечто подобное... http://ru.aliexpress.com/item/Orange-Pi-One-ubuntu-linux-and-android-mini-PC-Beyond-and-Compatible-with-Raspberry-Pi-2/32603308880.html  Подойдет такое чудо? Но это если говорить об оптимальной так скажем технологии реализации поставленной задачи... Можно ж вообще нанять кого-то и напишут мне за энную сумму код и скажут и покажут как собрать велосипед из пряников, а мне все же интересен сам процесс: как, зачем ды почему... 

такая подойдет. Сам с такой сейчас играюсь. Их правда многие ругают за перегрев, а так же пишут, что они очень требовательны к мощности источника питания, не менее 2-3А. Имейте в виду. Сам планирую приделать мелкий радиатор на процессор и поставить вентилятор с датчиком температуры, ибо мне нужен режим 24х7х365. Цена уж больно у них интересная.

Так здесь все и собрались в основном те, кому интересен процесс и результат собственными руками-мозгами. Дерзайте. Нужно правда будет освоить другую среду програмирования кроме Arduino IDE. Я склоняюсь к использованию Си.