GSM Hoster

disconnected

Что это такое

GSM Hoster — это ретранслятор между GSM-модемами (UDP-абоненты, они же «downlink») и TCP-клиентами (uplink, обычно пульт управления или софт на ПК). Модемы ходят на сервер по UDP и держат связь auth-пакетами; пульты приходят по TCP, авторизуются командой и получают/отправляют raw-данные в/из модема.

Как отправить данные на GSM-модем через TCP

1. Подключение

Открой TCP-соединение на сервер, порт 35555. Любой TCP-клиент: nc, telnet, собственная программа с сокетом — подойдёт.

2. Авторизация

Первым делом пришли строку авторизации в формате:

gsm link <id>

где <id> — десятичный идентификатор GSM-абонента (0..65535). Число 65535 — специальный режим broadcast: ты получаешь и шлёшь данные всем модемам сразу.

Правила завершения id (какой байт серверу считать концом числа):

  • Пробел / таб / \r / \n — терминатор съедается, следующий байт — первый byte raw-данных.
  • Пауза в 1 секунду без новых байт — id коммитится по таймауту, следующий пришедший байт — первый byte raw-данных.
  • Любой другой не-цифровой байт — терминатор НЕ съедается, он становится первым byte raw-потока.

3. Отправка данных

После авторизации всё, что ты пишешь в TCP-сокет, — это raw-байты, которые сервер чанкует на куски по 128 байт и оборачивает в UDP-кадры с заголовком DIR='u', ID=<твой id>, LC=2, и отправляет выбранному best-линку соответствующего модема.

Границы write() не сохраняются — TCP это поток.

Пример сессии (bash + nc)

# Подключаемся и отправляем 'hello world' модему с id=20788
printf 'gsm link 20788\nhello world' | nc gsm-hoster.radio-most.ru 35555
Терминатор числа id — это \n. Если пропустить его (например, 'gsm link 20788hello'), то по новой семантике первый raw-байт h не потеряется, но проще всё же разделять явно.

Как получать данные от GSM-модема

После успешной авторизации тот же TCP-сокет двунаправленный: сервер пишет в него raw-байты, которые приходят от модема(-ов). Фильтр:

  • Принимаются только кадры с LC=2 (payload-канал). Служебные и другие каналы в TCP не форвардятся.
  • Дубликаты подавляются — форвардится только кадр от best-линка модема (если у одного id несколько GSM-каналов).
  • Если подписан как gsm link 65535, то получаешь данные всех активных модемов, interleaved в один поток без маркеров источника.

Порядок байт внутри одного кадра сохраняется; между кадрами от разных модемов (в broadcast-режиме) гарантий порядка нет.

Пути данных — коротко

GSM-модем <──UDP:36100──> gsm-hoster <──TCP:35555──> пульт (TCP-клиент)
                                 │
                                 └── HTTP/WS :34444 (веб-мониторинг, локально через nginx)

Веб-интерфейс

Эта страница показывает состояние сервера в реальном времени:

  • Вкладка «GSM абоненты» — список UDP-линков (модемов) с идентификатором, адресом, флагом BEST, uptime, временем последнего пакета, накопленной статистикой RX/TX по байтам и пакетам, и моментальным rx/s (пакетов за последнюю секунду).
  • Вкладка «TCP клиенты» — список подключённых uplink-клиентов (прошедших авторизацию) с их endpoint-ом, uptime и статистикой.
  • Клик по строке GSM-абонента открывает модальное окно «Отправить сообщение»: вписываешь текст, жмёшь «Отправить», и UTF-8 байты уходят на этот модем ровно так же, как если бы ты их прислал по TCP.

Таблицы обновляются каждую секунду через WebSocket. Индикатор connected в правом верхнем углу показывает статус соединения, при обрыве дашборд автоматически переподключается.