Настроить интеграцию по SMPP можно двумя способами — через Stunnel или IPsec. При работе с SMPP учитывайте требования и методы работы с ошибками, о которых рассказываем ниже.
Способ 1. Черeз Stunnel
- Создайте SMPP-подключение в личном кабинете: раздел Интеграции > SMPP > введите скорость отправки SMS и IP-адреса, с которых будете отправлять SMS
- Установите Stunnel на компьютер и запустите. Как установить Stunnel на разные ОС, читайте в инструкции
- При подключении командой bind_transceiver, используйте IP-адрес Stunnel 127.0.0.1 и порт 3800. Если Stunnel и SMPP клиент находятся на разных хостах, укажите IP-адрес хоста, на котором установлен Stunnel
- При запуске сессии командой bind_ установите в PDU параметры:
system_id — логин, который вы получили при создании SMPP-подключения в личном кабинете, password — пароль, оттуда же - После того, как запустите сессию — можно отправлять SMS командой submit_sm
Подробнее о команды bind_* и submit_sm — в спецификации SMPP 3.4
Как установить Stunnel
На Windows x64
Нужна версия 5.56+
1. Перейдите на stunnel.org и загрузите файл stunnel-5.XX-win64-installer.exe. Вместо XX должен быть номер актуальной версии
2. Щёлкните дважды по скачанному .exe-файлу, чтобы начать установку
3. Следуйте инструкциям мастера установки. Рекомендуется оставить все параметры по умолчанию
4. После установки нажмите на ярлык Stunnel на рабочем столе, чтобы запустить приложение
5. Откройте файл конфигурации. В главном окне программы выберите Configuration > Edit Configuration
6. Откроется файл конфигурации. Удалите из него всё и внесите новые данные:
1 2 3 4 | [smpp] client = yes accept = 0.0.0.0:3800 connect = smpp.marketolog.mts.ru:3800 |
7. Сохраните файл и перезапустите приложение через меню Configuration > Reload Configuration или полностью закройте и запустите заново
На Linux
Ubuntu 20.04 и выше
1. Установите Stunnel:
sudo apt-get install stunnel42. Создайте файл conf и сконфигурируйте коннект:
sudo nano /etc/stunnel/stunnel.conf
[smpp]
client = yes
accept = 0.0.0.0:3800
connect = smpp.marketolog.mts.ru:38003. Запустите Stunnel:
sudo systemctl start stunnel
sudo systemctl enable stunnelCentOS 7 и ниже
1. Скачайте Stunnel, вместо XX нужно указать доступную версию:
wget https://www.stunnel.org/downloads/stunnel-5.XX.tar.gz2. Распакуйте:
tar -xvf stunnel-5.XX.tar.gz3. Соберите и установите. В процессе сборки могут потребоваться дополнительные пакеты в системе, их нужно будет доставить:
cd stunnel-5.XX
./configure
make
make install4. Создайте файл conf и сконфигурируйте коннект:
sudo vim /etc/stunnel/stunnel.conf
[smpp]
client = yes
accept = 0.0.0.0:3800
connect = smpp.marketolog.mts.ru:38005. Запустите Stunnel:
stunnel /etc/stunnel/stunnel.confИз Docker
sudo docker run -d -e STUNNEL_CLIENT=yes -e STUNNEL_ACCEPT=0.0.0.0:3800 -e STUNNEL_CONNECT=smpp.marketolog.mts.ru:3800 -e STUNNEL_SERVICE=smpp -p 3800:3800 dweomer/stunnelСпособ 2. Черeз IPsec
- Напишите нам на почту supmarketolog@mts.ru. Тема письма: SMPP IPsec, в письме: ИНН, лицевой счёт кабинета. С вами свяжется менеджер и обсудит детали. После этого мы сделаем все настройки на стороне МТС
- После настроек на стороне МТС настройте L2L сеть через IPsec
- Поднимите SMPP-подключение:
- при подключении командой bind_transceiver, используйте IP-адрес 10.241.88.195, порт 3700. Либо URL prov.omnichannel.vas.mts.ru:3700
- при запуске сессии командой bind_ установите в PDU параметры: system_id — логин и password — пароль, которые вы получили при создании SMPP-подключения в личном кабинете
4. После того, как запустите сессию — можно отправлять SMS командой submit_sm
Подробнее о команды bind_* и submit_sm — в спецификации SMPP 3.4
Требования к отправке сообщений
Термины
- SMSC — SMS-центр
- Пользователь — вы
- Оборудование — например, ваш сервер
- Абонент — получатель SMS
Требования
- Протокол взаимодействия с SMSC — SMPP v3.4
- Сервис работает в синхронном и асинхронном режимах. Размер окна — 99, пропускная способность — 10 SMS в секунду
- Для обмена SMS между оборудованием и SMSC может использоваться любой из типов подключения: transmitter, receiver, transceiver — в зависимости от направления трафика: на Пользователя, от Пользователя, на и от Пользователя
- Если SMPP- и TCP-сессии оборвутся, ожидайте 1,5 минуты — после установите новую TCP-сессию и отправьте в сторону SMSC PDU команду bind_transceiver/ bind_transmitter / bind_receiver. Если соединение оборвётся, увеличьте ожидание до 2 минут
- При отправке PDU bind_transceiver выставите значения полей:
Address TON (addr_ton) = 0
Address NPI (addr_npi) = 0
Address Range (address_range) = NULL- Номер получателя в формате 7ХХХХХХХ должен иметь:
destination_addr_ton = 1 и destination_addr_npi = 1- Буквенно-цифровой номер отправителя — alphanumeric. Он должен иметь:
source_addr_ton = 5, source_addr_npi = 0
Пример настройки интерфейса
- Оборудование должно отправлять на каждый полученный от SMSC PDU deliver_sm (data_sm) подтверждение deliver_sm_resp (data_sm_resp) со статусом 0 (OK). Отправка PDU generic_nack запрещена
- Оборудование должно отправлять PDU enquire_link каждые 30 секунд, независимо от наличия или отсутствия трафика в SMPP-соединении
- SMS из более чем одного сегмента, отправленные со стороны контент-провайдера, должны содержать UDH или SAR параметры — чтобы корректно соединить части сообщения абонентским терминалом пользователя
- В одной части составного SMS можно передавать не более 67 символов в кириллице и 153 в латинице
- Если SMSC получает от оборудования составное SMS, то отправляет ответ в PDU submit_sm_resp — каждый раз, когда получает часть SMS. При этом оборудование должно передать все части составного SMS в течение 60 секунд. Если не соблюдать требование, SMSC не отправит полученные от оборудования части составного SMS и вернёт на оборудование PDU deliver_sm с отчётом о доставке delivery report, содержащим код ошибки 0x00000384 (ESME_RCNCTTIMEOUT)
- Используйте схему кодировки DCS 0х03 (HEX) для текста на латинице и DCS 0х08 (HEX) для текста на кириллице — в соответствии со спецификациями SMPP v3.4/v.5.0, 3GPP TS 23.038
- Значение параметра validity_period не должно быть меньше 60 секунд. Если значение будет меньше, оно принудительно изменится на 60
- Кодировка поля destination_addr должна быть в ASCII — символы между 36 (0x24) и 126 (0x7E)
- Значение поля protocol_id должно быть = 0
- Контролируйте равномерность скорости отправки SMS. Например, если установлено ограничение в 100 SMS в секунду, отправляйте SMS каждые 10 миллисекунд, а не все 100 SMS в первые 100 миллисекунд
- Если при разрыве TCP-сессии со стороны SMSC в сторону оборудования отправляется TCP-пакет с флагом FIN, то в ответ оборудование должно отправить пакет FIN (FIN, ACK). Любой другой ответ запрещён
- Чтобы отслеживать корректность взаимодействия SMSC и оборудования по протоколам TCP и SMPP, рекомендуем использовать протокольный анализатор, например, Wireshark. Если возникнут проблемы в работе сервиса, проведите анализ tcpdump, опишите проблему и отправьте tcpdump на supmarketolog@mts.ru
Как работать с ошибками протокола
Как обрабатывать ошибки протокола SMPP
Если SMS не отправилось, SMSC может передать код ответа в PDU submit_sm_resp, так и в PDU deliver_sm в виде отчёта о доставке. Даже если SMS принято к отправке — это не значит, что оно точно будет доставлено.
| Операция | Код ошибки | Что делать |
|---|---|---|
| submit_sm_resp | Invalid Destination Address | Удалите сообщение из очереди и больше не пытайтесь отправить |
| submit_sm_resp | Throttling error | Поместите сообщение, на которое пришла ошибка, в начало очереди на отправку. Время ожидания перед повторной отправкой сообщений с оборудования в данном соединении должно составлять 1 секунду |
| submit_sm_resp | Message Queue Full | Поместите сообщение, на которое пришла ошибка, в конец очереди. Выполните от 3 до 5 повторных попыток отправки, каждый раз возвращая это SMS в конец очереди, если ошибка повторяется. Рекомендуем применять прогрессивный метод обработки этой ошибки: после первой ошибки делать паузу перед отправкой 5 секунд, при второй — 15 секунд, третьей — 45 секунд и так далее. Если после 3-5 попыток доставить SMS возвращается ошибка Message Queue Full, удалите его из очереди. |
| deliver_sm | 620 | |
| submit_sm_resp | Invalid Source Address | Заблокируйте отправку сообщений с данного номера отправителя. Не повторяйте отправки, пока не получите от МТС уведомление, что номер внесли в разрешённый список номеров отправителей на SMSC |
| submit_sm_resp | Message Length is invalid | Уменьшите количество символов в тексте сообщения в полях short_message или message_payload TLV в соответствии с ограничениями протокола GSM. Спецификация GSM 03.40/3GPP TS 23.040 |
| deliver_sm | 950 | Приостановите отправку SMS, удалите сообщения из очереди и не отправляйте снова в течение 24 часов |
Код ошибки 903 SMSC delivery timeout (ESME_RDLVRTIMEOUT) формируется, если через 72 часа после принятия SMS к отправке, если от SMSC не получен pdu deliver_sm c delivery_report. Либо после истечения срока, который задан в pdu submit_sm (validity period).
Коды ошибок в submit_sm_resp
| SMPP Error Code | Value (HEX) | Description | CDR ‘command_status’ field (message status) | Value (HEX) | Value (DEC) | Description |
|---|---|---|---|---|---|---|
| ESME_ROK | 0x00000000 | No Error | MSG_ERROR_NONE | 0x00 | 0 | No error occurred |
| ESME_RINVMSGLEN | 0x00000001 | Message Length is invalid | MSG_ERROR_VALIDATION | 0x84 | 132 | Message is invalid |
| ESME_RSYSERR | 0x00000008 | System Error | MSG_ERROR_UNROUTABLE | 0x0b | 11 | Unroutable message |
| ESME_RINVSRCADR | 0x0000000A | Invalid Source Address | MSG_ERROR_INVALID_SRC | 0x85 | 133 | Invalid source address |
| ESME_RINVSRCADR | 0x0000000A | Invalid Source Address | MSG_ERROR_FORBIDDEN_SRC | 0x8b | 139 | Forbidden source address |
| ESME_RINVDSTADR | 0x0000000B | Invalid Dest Addr | MSG_ERROR_UNKNOWN_RECIPIENT | 0x81 | 129 | The recipient is unknown |
| ESME_RINVDSTADR | 0x0000000B | Invalid Dest Addr | MSG_ERROR_INVALID_DST | 0x88 | 136 | Invalid destination address(es) |
| ESME_RINVDSTADR | 0x0000000B | Invalid Dest Addr | MSG_ERROR_FORBIDDEN_DST | 0x8c | 140 | Forbidden destination address |
| ESME_RINVDSTADR | 0x0000000B | Invalid Dest Addr | MSG_ERROR_MNP_CHECK_BARRING | 0x8e | 142 | MNP check barring error |
| ESME_RMSGQFUL | 0x00000014 | Message Queue Full | MSG_ERROR_CONGESTION | 0x0a | 10 | Congestion error |
| ESME_RTHROTTLED | 0x00000058 | Throttling error (ESME has exceeded allowed message limits) | MSG_ERROR_THROTTLED | 0x09 | 9 | Throttling error |
| ESME_RINVEXPIRY | 0x00000062 | Invalid message validity period (Expiry time) | MSG_ERROR_EXPIRED | 0xff | 255 | The message has expired |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_TEMPORARY | 0x01 | 1 | A temporary error occurred |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_TRANSPORT_ERROR | 0x02 | 2 | A transport error occurred |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_SRI_TRANSPORT_ERROR | 0x03 | 3 | A SRI transport error occurred |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_SIM_CARD_FULL | 0x04 | 4 | The SIM card of the receiver is full GSM MAP memoryCapacityExceed error |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_ABSENT_SUBSCRIBER | 0x05 | 5 | The mobile subscriber is absent GSM MAP absentSubscriber error |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_TIMEOUT | 0x06 | 6 | Transaction has timed out |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_ILLEGAL_EQUIPMENT | 0x07 | 7 | GSM MAP illegalEquipment error |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_CANCELLED | 0x08 | 8 | Message processing has been cancelled |
| ESME_RX_T_APPN | 0x00000064 | ESME Receiver Temporary App Error Code | MSG_ERROR_NO_RETRY_LEFT | 0x82 | 130 | No retry left |
| ESME_RX_P_APPN | 0x00000065 | ESME Receiver Permanent App Error Code | MSG_ERROR_DEFINITIVE | 0x80 | 128 | A definitive error occurred |
| ESME_RX_P_APPN | 0x00000065 | ESME Receiver Permanent App Error Code | MSG_ERROR_VALIDATION | 0x84 | 132 | Message is invalid |
| ESME_RPROHIBITED | 0x00000101 | ESME Prohibited from using specified operation. | MSG_ERROR_CHARGING | 0x8d | 141 | Charging error |
| ESME_RPROHIBITED | 0x00000101 | ESME Prohibited from using specified operation. | MSG_ERROR_BLACKLISTED | 0x8f | 143 | Blacklisted recipient |
Коды ошибок в deliver_sm
| Код ошибки в DR (DEC) | Соответствует коду ошибки SMPP | Код ошибки в submit_sm_resp (HEX) |
|---|---|---|
| 601 | Message Length is invalid (ESME_RINVMSGLEN) | 0x000000001 |
| 608 | System Error (ESME_RSYSERR) | 0x000000008 |
| 610 | Invalid Source Address (ESME_RINVSRCADR) | 0x00000000A |
| 611 | Invalid Dest Addr (ESME_RINVDSTADR) | 0x00000000B |
| 620 | Message Queue Full (ESME_RMSGQFUL) | 0x000000014 |
| 688 | Throttling error (ESME has exceeded allowed message limits) (ESME_RTHROTTLED) | 0x000000058 |
| 698 | Invalid message validity period Expiry time (ESME_RINVEXPIRY) | 0x000000062 |
| 700 | ESME Receiver Temporary App Error Code (ESME_RX_T_APPN) | 0x000000064 |
| 701 | ESME Receiver Permanent App Error Code (ESME_RX_P_APPN) | 0x000000065 |
| 857 | ESME Prohibited from using specified operation (ESME_RPROHIBITED) | 0x000000101 |
| 900 | Сoncatenation timeout (ESME_RCNCTTIMEOUT) | 0x00000384 |
| 901 | Routing error (ESME_ROUTERR | 0x00000385 |
| 902 | SMSC response timeout (ESME_RRESPTIMEOUT) | 0x00000386 |
| 903 | SMSC delivery timeout (ESME_RDLVRTIMEOUT) | 0x00000387 |
| 904 – 949 | Резерв | |
| 950 | Временный код ошибки, формируется в течение 24 часов после замены SIM-карты абонентом «МТС». | 0x000007FFF |
| 951-998 | Резерв |
Что делать, если SMS не отправляются
- Проверьте, что у вас подключён подходящий тариф
- Проверьте, что имя отправителя подключено на всех нужных операторов
- Если на вашей стороне нет проблем, напишите нам supmarketolog@mts.ru. Укажите в письме подробности, чтобы мы могли помочь быстрее:
- название компании
- system_id — логин для подключения к платформе
- описание проблемы
- пример сообщения — дата, время, system_id, имя отправителя, номер получателя, message_id, коды ошибок
- tcpdump, логи с ошибкой, статистика по ошибке