| ID | Endpoint | LC | Best | Uptime | Last seen | RX bytes | TX bytes | RX pkts | TX pkts | rx/s |
|---|
| ID | Endpoint | Uptime | RX bytes | TX bytes |
|---|
Что это такое
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
\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
в правом верхнем углу показывает статус соединения, при обрыве дашборд
автоматически переподключается.