Архитектурное решение связи Арудино с удаленным сервером (SIM800)

Народ всем привет,

кто сталкивался, подскажите как правильно реализовать такой функционал (не могу понять что-то). Имеем веб-сервер и удаленный терминал на основе Ардуино Мега 2560 + шилд с SIM800C. Удаленный терминал постоянно опрашивает веб-сервер по API для получения некоторых данных.

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

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

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

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

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

Если одна сторона желает уведомить другую немедленно, то между ними либо должна уже существовать сессия, либо она должна быть организована заинтересованной стороной.

Я использую TinyGSM - чтобы не париться с АТ командами, и соединяюсь с АПИ по http (а тут только клиент может начать соединение). Может есть ссылка на какую нибудь библиотеку где пример с tcp есть ?

вот и вопрос как организовать сессию со стороны сервера до терминала ? Насколько я понял ардуино как клиент работает с TinyGSM, хотя можно и сервером его сделать, но это тоже для меня не вариант. А сделать его клиент-сервером не получится (или я плохо искал)

Очевидно, что нужна достижимость ардуины с сервера. Т.к. “удаленный терминал имеет динамический ip и городить систему с DDNS для того чтобы к нему был доступ думаю не реально”, то решения нет.

не имеет значения как вы соединяетесь. В вашем случае смена http на tcp ничего принципиального не изменит.
Чтобы клиент был достижим оперативно - вы либо держите сессию открытой постоянно, либо запрашиваете данные с сервера каждые N секунд (5 или 30 - это уже зависит от того, насколько “оперативной” должна быть реакция клиента).
При отсуствии коннекта от сервера к клиенту (а это ваш вариант) - ДРУГИХ ВАРИАНТОВ НЕТ.

1 лайк

Опрашивайте с установленным интервалом 5,10,30 мин.
А если серверу нужна железка моментом на связи - то делаем с сервера голосовой звонок, посыл СМС - и железка приняв вызов моментом конектится к серверу т получает то что ей надо.

Зачем так сложно, звонки какие то…
Держите постоянный tcp сокет открытым и никаких проблем

постоянно не получится, для php к примеру время жизни сессии выставлено в 24 минуты по дефолту

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

Ну тот факт, что с пользовательской стороны TCP нет никаких пакетов, - какая это проблема, разумеется. (там есть свой механизм поддержания сессии, без всякого вот этого рукожопства)

сами то пробовали держать на SIM800 постоянный коннект и его поддерживать :slight_smile:
случаев что TCP типа в ESTABLISHED, а по факту не работает масса.

Читал тему. Перечитывал. Много думал. Утром встал вопрос, не то, про что вы подумали - а зачем вы websocket заново изобретаете?

Без сарказма если, то это и есть надстройка на tcp, удобная в описанном контексте.
То есть или мы переспрашиваем о наличии новой информации каждую секунду, условно. Или пользуемся сессиями tcp. Во втором случае вебсокет очевидное решение.
Третий вариант возможен только в алкогольных фантазиях про “гипертекстовый, векторный фидонет”.

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

1 лайк

да у меня на esp32 и rp2040w он из коробки не взлетел, пока забил есть более прозаичные дела

Я бы тоже пошел этим путем. Но раз тут про сессии заговорили, то вебсокет напрашивается.


Посмотрел в первый пост. Там 2560. Никаких вебсокетов оно не потянет, скорее всего.

ты на ESP32 сокет поднял, если да, чья библиотека?

Можно железо поменять если вебсокет более грамотное и надежное решение чем пакетами мелкими часто обмениваться.

что потянет вебсокет кроме 2560? только малинку не предлагать

а не подскажете нормальную библиотеку для ардуино которая работает с TCP?

зыж может опыт с какой имелся и понравилась