bind аутентифицирует и открывает сессию SMPP. bind_transmitter разрешает только отправку, bind_receiver — только приём, а bind_transceiver — и то и другое по одному соединению. ESME передаёт system_id, password и system_type; SMSC отвечает bind_resp. Успешный bind переводит сессию в связанное состояние вплоть до unbind или разрыва.
bind_transceiverОткрыть и аутентифицировать сессиюbind_transceiver_respСессия принятаsubmit_smОтправить сообщениеsubmit_sm_respПринято, возвращен ID сообщенияdeliver_smПодтверждение доставки или входящее сообщениеdeliver_sm_respПодтвержденоenquire_linkKeepalive в режиме ожидания
Три типа bind
Тип bind фиксирует направление трафика для сессии. Выберите transmitter для только исходящего трафика (отправка MT), receiver для только входящего (MO и отчёты о доставке) или transceiver, чтобы передавать оба направления по одному соединению — обычный выбор в v3.4, поскольку это вдвое сокращает число поддерживаемых соединений.
| Операция | command_id | Сессия может |
|---|---|---|
| bind_transmitter | 0x00000002 | Только отправка сообщений (MT) |
| bind_receiver | 0x00000001 | Только приём сообщений / отчётов о доставке (MO + DLR) |
| bind_transceiver | 0x00000009 | Отправка и приём по одному соединению |
Поля запроса bind
Тело bind несёт учётные данные и заявленные возможности ESME. system_id и password аутентифицируют учётную запись; system_type опционально классифицирует ESME; interface_version объявляет версию SMPP; addr_ton, addr_npi и address_range позволяют SMSC маршрутизировать трафик от абонентов на этот bind. Несоответствие address_range молча блокирует маршрутизацию MO/DLR на bind типа receiver или transceiver — распространённая ошибка интеграции.
| Поле | Тип | Макс. | Примечания |
|---|---|---|---|
| system_id | C-Octet String | 16 | Идентификатор учетной записи/логина |
| password | C-Octet String | 9 | Пароль учетной записи |
| system_type | C-Octet String | 13 | Дополнительная категория ESME (часто пустая) |
| interface_version | Integer | 1 | 0x34 = v3.4, 0x50 = v5.0 |
| addr_ton | Integer | 1 | Тип номера для маршрутизации MO этому ESME |
| addr_npi | Integer | 1 | Индикатор плана нумерации |
| address_range | C-Octet String | 41 | Адрес/регулярное выражение, по которому SMSC маршрутизирует на этот bind |
Ответ bind
SMSC отвечает соответствующим bind_resp (например, bind_transceiver_resp, 0x80000009). command_status равен ESME_ROK при успехе либо содержит ошибку, такую как ESME_RINVPASWD (неверный пароль), ESME_RINVSYSID (неверный системный идентификатор) или ESME_RBINDFAIL. Тело возвращает system_id SMSC и, начиная с v3.4, опциональный TLV sc_interface_version, сообщающий ESME, какую версию фактически поддерживает SMSC.
ESME → SMSC bind_transceiver seq=1 system_id=acme password=****
SMSC → ESME bind_transceiver_resp seq=1 status=ESME_ROK system_id=smsc01
(session now BOUND_TRX — submit_sm and deliver_sm may flow)Состояния сессии
Сессия SMPP — это небольшой конечный автомат. Она начинается в состоянии OPEN после установления TCP-соединения, переходит в связанное состояние при успешном bind и возвращается в UNBOUND, а затем CLOSED при unbind или разрыве. Отправка операции, недопустимой для текущего состояния, возвращает ESME_RINVBNDSTS (неверный статус bind). Повторный bind по одному соединению возвращает ESME_RALYBND (уже связан).
| Состояние | Значение |
|---|---|
| OPEN | TCP-соединение установлено, bind ещё не выполнен |
| BOUND_TX | Привязан как transmitter — может отправлять |
| BOUND_RX | Привязан как receiver — может получать |
| BOUND_TRX | Привязан как transceiver — может отправлять и получать |
| UNBOUND | Unbind отправлен, ожидается закрытие |
| CLOSED | Соединение разорвано |
unbind и outbind
unbind (0x00000006) запрашивает корректное закрытие сессии; узел отвечает unbind_resp, и обе стороны закрывают TCP-соединение. outbind (0x0000000B) — это обратный случай: SMSC просит прослушивающий ESME инициировать bind типа receiver; используется, когда SMSC нужно доставить трафик MO на ESME, который обычно ожидает соединений.
Часто задаваемые вопросы
Использовать ли пары transmitter/receiver или transceiver?
Предпочитайте transceiver, где провайдер это допускает — одно соединение несёт и отправку, и приём, вдвое сокращая число соединений и упрощая корреляцию отчётов о доставке. Отдельные bind типа transmitter и receiver используйте только когда провайдер требует разделения по направлениям.
Для чего нужен system_type?
system_type опционально определяет категорию ESME (например, конкретный класс приложения). Многие провайдеры оставляют его пустым. Задавайте его только тем значением, которое выделяет провайдер, поскольку некоторые маршрутизируют по нему.
Почему мой bind типа receiver не получает отчёты о доставке?
Самая частая причина — несоответствие address_range / addr_ton / addr_npi: SMSC маршрутизирует трафик MO и DLR на тот bind, чей address_range совпадает, поэтому неверное значение молча их удерживает. Уточните точные выданные значения у провайдера.
Что означает ESME_RALYBND?
ESME_RALYBND (0x00000005) означает, что ESME уже находится в связанном состоянии и попытался выполнить bind повторно в той же сессии. Выполняйте bind ровно один раз на соединение; если bind не удался, откройте новое соединение, а не выполняйте bind повторно на старом.
Сколько одновременных bind можно открыть?
Это коммерческое ограничение, задаваемое вашим провайдером, а не протоколом. Открытие большего числа bind, чем выделено, — частая причина троттлинга или блокировки учётной записи. Согласуйте число bind и TPS на каждый bind письменно, прежде чем масштабироваться.
Технические характеристики источника
На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)