Voronar
@Voronar
Code typesetter

Как лучше организовать взаимодействие с настольным Qt/C++ Application через интернет?

Здравствуйте. Возникла задача реализовать удалённое взаимодействие c Arduino через интернет. Кроме того необходим real-time мониторинг данных, посылаемых с Arduino. Я написал Qt App для первичного приёма данных с Arduino, чтобы потом в дальнейшем посылать пакеты данных на сервер (ethernet shield отсутствует) и этой же программой принимать управляющие пакеты.
Теперь я стою перед выбором с лёгким недопониманием. Посмотрев пару статей, я понял, что это мне это не подходит.
Немного поразмыслив, я пришёл к выводу, что можно воспользоваться сокетами. C сокетами работал мало и только в локальной сети. Однако решение я себе представляю таким. То есть создаю сокет в Qt App, запускаю отдельный поток под приём/передачу, делаю sendto to mysite.com. жду входящих пакетов.
С серверной стороной сложнее. Первое, что пришло в голову - это PHP Socket. С ними я никогда не работал и поэтому возникло много вопросов. Как организовать разметку веб-страницы, чтобы php-скрипт работал асинхронно и обновлял разметку в соответствии с полученными данными в реальном времени и при это ещё принимал управляющие frontend-команды пользователя. Да, ещё вдобавок ip-адрес, управляющего arduinoй компьютера, динамический.
Общую абстрактную структуру взаимодействия и процесс обмена данными на уровне пакетов(структур - то бишь void*-массивов) я понимаю. Не знаю какими средствами воспользоваться.
Что посоветуете, уважаемые?
  • Вопрос задан
  • 5255 просмотров
Решения вопроса 1
Voronar
@Voronar Автор вопроса
Code typesetter
Wt, оказывается платный для КИ. В топку тогда его...
Придумал вот такой вариант.
Покупаем VPS за 200 рублей в месяц. Ставим туда прогу на C/C++. Это прога принимает по UDP пакеты из Qt App (эта прога принимает пакеты с Arduino). Обмен проги на C/C++ с клиентским JS идёт по Web socket (libwebsocket for C/C++).
Таким образом я постараюсь добиться отображение данных на моём сайте с Arduino почти в реальном времени.
Тестировать этот вариант буду на 127.0.0.1
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 9
peleron
@peleron
Веду кружки по робототехнике
Предложу три варианта взаимодействия через Web:
1. Соединение "клиент-сервер-клиент". в интернете организовывается простейший HTTP сервер. На него ложится CGI-скрипт, который принимает запросы от управляющего устройства и складывает их в файл. Второе (управляемого) устройство периодически скачивает с сервера запросы и отвечает на них - ответы также складируются на сервере. А затем управляющее устройство выгребает их. Это классический случай, в принципе тут ничего сложного и страшного нет. Но главный минус - real-time'a не получится. Задержки будут в пару секунд
2. Соединение "клиент-клиент через IPv4". Управляющий и управляемый компьютер каким-то образом договариваются о соединении между собой - с целью преодоления всевозможных NAT'ов и файрволлов. А затем обмениваются данными между собой. Плюс - real-time, минус - сложные решения для организации начального соединения. Причём минус жирный - для embedded устройств, особенно без полноценной поддержки сетевого стека и сторонних утилит для сети это организовать очень сложно.
3. Соединение "клиент-клиент через IPv6". Поскольку сеть - IPv6, то не нужно заморачиваться о преодолении NAT'ов - в IPv6 к любому устройству можно достучаться напрямую. Код совсем минимальный. Минус - IPv6 пока не сильно развит, но есть много сервисов, позволяющих пробросить IPv6 через IPv4. Но это требует установки дополнительного софта.
Так что решайте - стоит ли мучаться с Arduino, или же проще взять что-то помощнее, нп. тот же RaspberryPi и ему подобных товарищей
Ответ написан
nekipelov
@nekipelov
Если у вас нет опыта работы с сокетами, то лучше и не беритесь. Воспользуйтесь протоколом более высокого уровня: HTTP, в качестве формата данных json. Не совсем понятно, что вкладывается в понятие "взаимодействие c Arduino", возможно вам потребуется что-то вроде WebSockets, если это взаимодействие может происходить с любой стороны.
Ответ написан
Комментировать
Voronar
@Voronar Автор вопроса
Code typesetter
Вот что я подразумеваю под взаимодействием с Arduino.
Например Arduino чем-то управляет и я хочу воспользоваться управлением Arduino через браузер. Я открываю браузер, набираю адрес и вижу страницу, на которой в реальном времени отображаются какие-то меняющиеся показатели, приходящие с Arduino (температура и прочее). Также на этой странице есть кнопочки, которые я могу нажимать и в следствии нажатия на одну из них Arduino должна отреагировать на эти нажатия соответствующим образом.

То есть Вы предлагаете посылать HTTP-запросы. Если я буду посылать запросы каждые 100 миллисекунд ничего страшного не произойдет? Просто не встречался с этим.
А как же поступить с входящими пакетами, которые формируются при взаимодействии с веб-интерфейсом по средствам кнопочек. Как их посылать на управляющий компьютер? Ответами на запросы? Пока не могу понять.
Ответ написан
Voronar
@Voronar Автор вопроса
Code typesetter
Про сокеты. Так если с ними не работать, то откуда опыт появится?
Немного работал с UDP-сокетами на Linux. Общее преставление о них имею.
Ответ написан
Voronar
@Voronar Автор вопроса
Code typesetter
Размышляя о перспективах, я подумал, что хочу найти достаточно универсальный вариант общения с сервером. Чтобы, я например, имея операционную систему типа linux, android, windows на каком-либо устройстве с интернет соединением, мог общаться с сервером одинаковым образом для каждой из ОС. Ведь для каждой ОС есть реализация сокетов. Мне кажется, что это самый лучший вариант. Проблема только в том, что нужен хостинг с возможностью запуска свой собственной программы, например на С++, которая бы обрабатывал запросы по сокету. Лучше конечно общаться через php-скрипт, который будет работать на более дешевом хостинге. Конечно, это размышление чистого новичка в вебе.
Ответ написан
@Robotex
А почему бы на сервере не запустить приложение на C++, которое тоже будет использовать сокеты?
Посмотрите еще в сторону CppCMS и Wt.
Ответ написан
Комментировать
Voronar
@Voronar Автор вопроса
Code typesetter
Так я сразу и хотел использовать linux-сокеты на плюсах. Проблема в том, где взять такой хостинг, чтобы можно было запускать в терминале любые команды и программы и чтобы он ещё был бесплатный или хотя бы не дорогой. Тем более я ещё даже домен не нашел. Искал бесплатный 3-его уровня, но так и не нашел где заказать. Поэтому пока приходится проводить испытания на локальном сервере.
Вторая загвоздка в том, что я пока не имею полного представления о взаимодействии собственной программы на сервере и клиента. Пока у меня перед глазами такая картина.
Есть программа на плюсах, которая в отдельном потоке получает запросы и отвечает на них. Всё это происходит без остановки в реальном времени (с допустимыми для меня задержками). Тут у меня возникает трудность. Как организовать запрос от js/html клиента через jquery-ajax на сервер к программе на плюсах? Я пока только имел опыт отправки ajax-post запроса php-скрипту, который в ответ через echo отдавал json-строку. Обновление данных происходило только после перезагрузки страницы. Как сделать запросы клиента циклическими в отдельном потоке? Или придётся формировать html-документ вручную на сервере на плюсах?
Сейчас я экспериментирую и пробую обойтись php-скриптом. Уже получил двустороннюю связь, запуская php-скрипт просто в консоли, отдельно от браузера. Однако пока остаётся та же проблема. А именно, как со стороны клиента делать асинхронные непрерывные запросы к php-скрипту, который крутится в процессах и отдаёт json-строку?
Все мои сложности из-за непонимания взаимодействия сервера и клиента на уровне ОС. Уровень браузера не может дать мне полного представления. Что посоветуете на эту тему?
Ответ написан
Комментировать
Voronar
@Voronar Автор вопроса
Code typesetter
Посмотрел в сторону Wt. Заинтригован описанием на Wikipedia.
Спасибо, Robotex. Пока только не пойму на каком хостинге его можно развернуть. Буду разбираться.
Ответ написан
Комментировать
@I_maleficus
А если попробовать использовать стандарты OPC?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы