Параллельно с SMS‑управлением хочу добавить второй канал связи — через GPRS. SIM800L умеет держать TCP‑соединение, и это позволяет организовать работу примерно по аналогии с IP‑телефонией: холодильник сам инициирует исходящее подключение к серверу, держит его живым за счёт периодических keep‑alive, а сервер по этому же соединению отправляет команды.
Архитектура сейчас вижу так. Уже есть рабочий GSM‑шлюз, который по HTTP‑эндпоинту принимает запросы и отправляет SMS (он сейчас рассылает уведомления клиентам о заказах, его планирую использовать и для холодильников). Отдельно под этот проект подниму GPRS‑шлюз: обычный сервер, который слушает входящие TCP‑подключения от SIM800L‑модемов. Каждый холодильник при старте поднимает GPRS, устанавливает TCP‑соединение с этим шлюзом, представляется своим ID и периодически шлёт heartbeat‑пакеты. Если шлюз видит, что соединение активно, он может в любой момент отправить команду «open» уже по GPRS, минуя SMS.
Код: Выделить всё
[ Клиент (браузер, QR-код) ]
|
v
[ Сайт на WordPress ]
|
v
[ GPRS-шлюз (сервер) ]
| \
(HTTP API) \ (HTTP API)
| \
v v
[ SMS-шлюз ] [ БД / панель управления ]
На стороне сайта (WordPress) планирую сделать раздел с холодильниками: список устройств с ID, привязанным номером SIM для SMS, статусом (в сети по GPRS — зелёный, офлайн — красный), версией прошивки и т.п. Клиент сканирует QR‑код на морде холодильника, попадает на страницу конкретного устройства и жмёт кнопку «Открыть». Дальше логика такая: если GPRS‑шлюз считает, что у холодильника есть активное TCP‑соединение, команда «open 52001» уходит по GPRS‑каналу (TCP → SIM800L → Arduino → оптопара). Если соединения нет — шлюз дергает HTTP‑API существующего SMS‑шлюза, и тот шлёт приоритетную SMS с текстом «52001 open» на SIM‑карту холодильника.
Код: Выделить всё
INTERNET / GPRS
+--------------------------------------+
| |
v |
[ GPRS-шлюз (сервер) ] <------------------------+
^ ^ | |
| | TCP (постоянное | |
| | соединение + keep-alive) | |
| | | |
| [ SIM800L EVB ] --- UART --- [ Arduino Nano ]
| (логика, парсинг
| команд, ID и т.д.)
| |
| |
| [ Оптопара / ключ ]
| |
| [ Кнопка двери ]
|
| HTTP API
|
[ SMS-шлюз ] <--------+
^ |
| SMS |
+----------- [ Сотовая сеть / GSM ] --------------+
Таким образом получается двухканальная схема: основной канал — GPRS (быстрее, дешевле по объёму, удобнее для расширения протокола), резервный — SMS (если нет интернета, если оператор режет GPRS или что‑то по пути падает). Холодильник сам может отслеживать обрыв TCP‑соединения и после нескольких неудачных попыток переподключения отправлять на шлюз специальное SMS‑сообщение вида «52001 net_down», чтобы сервер знал, что с этим устройством лучше говорить только по SMS. Обратная сторона — как только TCP снова поднимается и какое‑то время держится, можно переводить устройство обратно в состояние «онлайн по GPRS».
На будущее хочу в эту же инфраструктуру вписать удалённое обновление прошивки Arduino через GPRS. Понимаю, что на чистом Nano это задача со звёздочкой (нужен свой загрузчик и, вероятнее всего, внешняя память под образ прошивки), но в протоколе и веб‑морде уже планирую оставить под это место: хранение версии прошивки, команда на обновление, возможно, указание URL для скачивания бинарника. По мере развития проекта можно будет либо дописать загрузчик под Nano, либо перейти на более подходящий контроллер с готовыми OTA‑решениями.
В общем, сейчас получается такой «мини‑SIP для холодильников»: устройства сами стучатся на сервер, держат сессию, получают команды по живому TCP‑каналу, а если что‑то ломается в дата‑канале — всегда остаётся SMS как надёжный резерв. Если у кого‑то был похожий опыт (GPRS + SMS любой модуль, не обязательно SIM800L) или есть мысли по формату протокола/организации OTA — буду рад услышать.