GSM Hoster

disconnected

Что это такое

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
Терминатор числа id — это \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 в правом верхнем углу показывает статус соединения, при обрыве дашборд автоматически переподключается.