| 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 — это сервер-ретранслятор, который связывает твою программу (TCP-клиент) с GSM-модемами. Подключаешься к серверу одним TCP-соединением, указываешь id модема — и дальше пишешь/читаешь сырые байты, как будто работаешь с модемом напрямую.
Как отправить данные на GSM-модем
1. Подключение
Открой TCP-соединение на сервер, порт 35555. Любой TCP-клиент:
nc, telnet, собственная программа с сокетом — подойдёт.
Адрес сервера указан в шапке этой страницы (в скобках после «GSM Hoster»).
Если нужен IP-адрес — узнать его можно командой ping <адрес>,
например ping . Полученный IP
используешь в качестве хоста при подключении TCP-клиента.
2. Авторизация
Первым делом пришли строку авторизации в формате:
gsm link <id>
где <id> — десятичный идентификатор GSM-абонента (0..65535).
Число 65535 — специальный режим broadcast: ты получаешь и
шлёшь данные всем модемам сразу.
Правила завершения id — что сервер считает концом числа:
- Пробел / таб /
\r/\n— терминатор съедается, следующий байт — первый байт твоих данных. - Пауза в 1 секунду без новых байт — id коммитится по таймауту, следующий пришедший байт — первый байт твоих данных.
- Любой другой не-цифровой байт — терминатор НЕ съедается, он сам становится первым байтом твоих данных.
3. Отправка данных
После авторизации всё, что ты пишешь в TCP-сокет, сервер передаёт на GSM-модем с указанным id. Никакой обёртки сверху не нужно — это просто поток сырых байт.
Границы write() не сохраняются — TCP это поток.
Пример сессии (bash + nc)
# Подключаемся и отправляем 'hello world' модему с id=20788
printf 'gsm link 20788\nhello world' | nc 35555
\n. Если пропустить его
(например, 'gsm link 20788hello'), то по новой семантике первый raw-байт
h не потеряется, но проще всё же разделять явно.
Как получать данные от GSM-модема
После успешной авторизации тот же TCP-сокет двунаправленный: сервер пишет в него сырые байты, которые приходят от модема. Никакой обработки на стороне клиента не требуется — что приходит от модема, то ты и читаешь.
Если подписан как gsm link 65535, то получаешь данные
всех активных модемов, interleaved в один поток без маркеров источника —
режим имеет смысл только если ты заранее знаешь как их различать.
Детали
Связь между сервером и GSM-модемами идёт по UDP — это обусловлено особенностями работы GSM-сетей (нестабильный канал, плавающие задержки, разрывы, NAT-трансляции в сетях операторов). UDP позволяет модему дёшево «отметиться» и продолжать жить дальше без накладных расходов на поддержание долгого TCP-соединения.
Из этого следует важное: гарантии доставки данных нет — ни в одну, ни в другую сторону. Отдельные пакеты могут теряться, приходить в изменённом порядке или дублироваться. Если твой протокол поверх gsm-hoster требует надёжной доставки — реализуй её на уровне приложения (последовательные номера, ACK, повторы).
Также сервер реализует механизм best-link. Один и тот же GSM-модем (с одинаковым id) может одновременно держать несколько UDP-каналов со стороны провайдера — например, при пере-NAT-инге, переключении соты или двух SIM-карт. Сервер раз в секунду оценивает их активность и помечает один канал как «best». Дальше:
- Данные от модема к тебе форвардятся только с best-канала — это убирает дубли, когда один и тот же кадр приходит одновременно с двух каналов.
- Данные от тебя к модему отправляются на best-канал unicast'ом, чтобы не нагружать остальные.
- Если best-канал в данный момент молчит (нулевая активность за последнюю секунду), сервер автоматически переходит в fallback-режим и шлёт сразу всем известным каналам этого id — на случай, если best только что отвалился и ещё не успел смениться.
В таблице «GSM абоненты» best-канал помечен пилюлей BEST.
У одного id может быть только один best в каждый момент времени.
Веб-интерфейс
Эта страница показывает состояние сервера в реальном времени:
- Вкладка «GSM абоненты» — список GSM-модемов на связи с идентификатором, адресом, uptime, временем последнего пакета и накопленной статистикой по принятым/отправленным байтам и пакетам.
- Вкладка «TCP клиенты» — список подключённых TCP-клиентов с их адресом, uptime и статистикой. Клиент появляется в таблице сразу при подключении (со статусом pending) и обновляется на конкретный id после успешной авторизации.
- Клик по строке GSM-абонента открывает модальное окно «Отправить сообщение»: вписываешь текст, жмёшь «Отправить», и UTF-8 байты уходят на этот модем ровно так же, как если бы ты их прислал по TCP.
Таблицы обновляются каждую секунду через WebSocket. Индикатор connected
в правом верхнем углу показывает статус соединения, при обрыве дашборд
автоматически переподключается.