command_status — это 4-байтовое поле заголовка, сообщающее результат операции. В запросе оно равно 0 (ESME_ROK); в ответе оно несёт код ошибки ESME_R*. 0x00000000 означает успех; ненулевые значения указывают на конкретные сбои, такие как неверный пароль, троттлинг или переполненная очередь сообщений.
Как работает command_status
Каждый PDU-ответ повторяет sequence_number запроса и устанавливает command_status в результат. ESME_ROK (0) означает успех. Любое другое значение — это ошибка, числовой код которой соответствует именованной константе ESME_R* из спецификации. Коды 0x00000100–0x000003FF зарезервированы для расширений SMPP, а 0x00000400–0x000004FF — для ошибок конкретного производителя SMSC, поэтому всегда корректно обрабатывайте неизвестные коды.
Коды, которые вы реально увидите
Небольшой набор кодов покрывает большую часть реальной обработки. Сгруппируйте их по реакции: повторить после задержки (троттлинг, переполнение очереди, системная ошибка), исправить запрос (неверный адрес, TON/NPI, data_coding, длина сообщения) и фатальные для сессии (неверный пароль или системный идентификатор, сбой bind).
| Значение | Имя | Значение | Типичная реакция |
|---|---|---|---|
| 0x00000000 | ESME_ROK | Нет ошибки | Успешно |
| 0x00000001 | ESME_RINVMSGLEN | Недопустимая длина сообщения | Исправление полезной нагрузки / сегмента |
| 0x00000005 | ESME_RALYBND | Bind уже выполнен | Не выполняйте повторный bind; используйте существующую сессию |
| 0x0000000A | ESME_RINVSRCADR | Неверный адрес источника | Исправить отправителя / TON / NPI |
| 0x0000000B | ESME_RINVDSTADR | Неверный адрес назначения | Исправить MSISDN получателя |
| 0x0000000D | ESME_RBINDFAIL | Ошибка bind | Сделайте паузу (backoff), проверьте учётные данные |
| 0x0000000E | ESME_RINVPASWD | Неверный пароль | Критическая ошибка — исправьте учетные данные |
| 0x0000000F | ESME_RINVSYSID | Неверный идентификатор системы | Критическая ошибка — исправьте учетные данные |
| 0x00000014 | ESME_RMSGQFUL | Очередь сообщений заполнена | Сделайте паузу (backoff) и повторите попытку |
| 0x00000043 | ESME_RINVESMCLASS | Некорректный esm_class | Исправить биты esm_class |
| 0x00000058 | ESME_RTHROTTLED | Throttling — превышена скорость | Снизьте скорость, backoff с джиттером |
| 0x00000062 | ESME_RINVEXPIRY | Некорректный validity_period | Исправьте формат срока действия |
| 0x000000FE | ESME_RDELIVERYFAILURE | Ошибка доставки (data_sm) | Проверка/повторная попытка в соответствии с политикой |
| 0x000000FF | ESME_RUNKNOWNERR | Неизвестная ошибка | Записать в журнал, оповестить, осторожно повторить |
Зарезервированные диапазоны и диапазоны производителей
Не каждый полученный код есть в основной спецификации. Спецификация резервирует 0x00000100–0x000003FF для будущего использования в SMPP и 0x00000400–0x000004FF для кодов конкретного SMSC, поэтому ваш провайдер может вернуть значение, объяснённое только в его документации. Сопоставляйте коды провайдера с нормализованной внутренней таксономией (неверный номер, заблокирован, троттлинг, временный сбой), чтобы качество разных маршрутов оставалось сопоставимым.
| Диапазон | Зарезервировано для |
|---|---|
| 0x00000100 – 0x000003FF | Расширения протокола SMPP |
| 0x00000400 – 0x000004FF | Ошибки, специфичные для поставщика SMSC |
| 0x00000500 – 0xFFFFFFFF | Зарезервировано |
Часто задаваемые вопросы
Что означает ESME_RTHROTTLED и как это обрабатывать?
ESME_RTHROTTLED (0x00000058) означает, что вы превысили разрешённую скорость отправки сообщений. Прекратите наращивать нагрузку, приостановите отправку и выдержите паузу с джиттером перед повтором. Продолжение на той же скорости грозит тем, что провайдер разорвёт bind.
Восстановима ли ошибка ESME_RINVPASWD?
Нет, не во время работы. ESME_RINVPASWD (0x0000000E) указывает на неверные учётные данные. Не зацикливайте bind; исправьте конфигурацию system_id/password и переподключитесь. Повторные неудачные bind могут привести к блокировке IP.
В чём разница между ESME_RMSGQFUL и ESME_RTHROTTLED?
ESME_RMSGQFUL (0x00000014) означает, что очередь SMSC временно переполнена; ESME_RTHROTTLED (0x00000058) означает, что вы превысили лимит скорости. Оба требуют выдержки, но троттлинг касается вашего TPS, а переполнение очереди — ёмкости SMSC.
Я получил код ошибки, которого нет в спецификации — почему?
SMPP резервирует 0x400–0x4FF для кодов конкретного производителя SMSC, поэтому ваш провайдер может вернуть значение, задокументированное только им. Обратитесь к таблице ошибок провайдера и сопоставьте его со своей внутренней таксономией.
Технические характеристики источника
На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)