Прямая работа с SMS-сервисом МТС: история одной интеграции

    Многие считают, что SMS — одна из причин того, что Твиттер так хорошо «выстрелил» на Западе. В США и ряде стран Европы твиты можно как публиковать, так и получать через SMS, при этом цена исходящего твита равна цене обыкновенной SMS, а входящие сообщения — бесплатны. Для пользователей без смартфонов (коих большинство) это значительно снижает порог на вход.

    В этой статье я поделюсь опытом прямой интеграции с крупным российским сотовым оператором (обратите внимание: именно напрямую, а не через шлюзы), а также на вводном уровне порассуждаю об околоSMS-ных технологиях и протоколе SMPP — без скучных таблиц и спецификаций, в стиле короткой детективной истории.

    Завязка сюжета


    Однажды мы (Рутвит) обратились с предложением к крупнейшему оператору связи — компании МТС. Мы понимали: чтобы сделать цену твита неотличимой от цены обычного SMS, нужна прямая интеграция с ОПСОС-ом (кстати, это слово расшифровывается как «Оператор Сотовой Связи»). МТС — огромная компания, заточенная на сотрудничество с крупными партнерами, поэтому я полагал, что наше предложение рассмотрят нескоро, и не особенно рассчитывал на успех. Какова же была наша радость, когда МТС не только быстро ответила, но и в результате конструктивных переговоров приняла решение запустить совместный проект с Рутвитом.

    Все мы знаем, что крупные компании зачастую медлительны и неповоротливы, однако это, похоже, не относится к МТС. Рабочая группа, с которой мы контактировали в процессе интеграции, быстро реагировала на наши вопросы, и мы продвигались вперед. Это было особенно ценно в той связи, что прямая интеграция с сотовым оператором оказалась на порядок сложнее, чем подключение какого-нибудь популярного SMS-шлюза: я еще расскажу о технических подробностях ближе к концу статьи.

    И вот мы сначала запустили альфа-версию SMS-сервиса на Рутвите (читать совместный с МТС пресс-релиз на сайте ПРАЙМ-ТАСС), а сегодня заменяем в этом сервисе значок «альфа» на «бету», о чем и сообщаем в данной статье. Сервис, помимо прочего, позволяет отправлять твиты с помощью SMS по обычной стоимости (согласно тарифного плана абонента) не только в Рутвит, но и в большой Твиттер — через механизм экспорта.

    Итак, отправлять твиты по SMS можно ровно за те же деньги, за которые вы отправляете любую другую SMS. Для этой же цели мы решили использовать не короткий номер, а более привычный, длинный: +7 916 140-0-140. Люди часто не доверяют коротким номерам, т.к. не уверены, сколько денег с них снимут за SMS: с длинным номером такой проблемы как будто бы нет.

    Как начать писать твиты по SMS?


    Чтобы начать писать твиты по SMS, введите номер своего телефона на сайте Рутвита:



    Затем отправьте слово «да» (регистр не важен) на номер Рутвита +7 916 140-0-140. Как только робот увидит это сообщение, он привяжет ваш номер к вашему аккаунту, и все последующие SMS на номер +7 916 140-0-140 будут восприниматься как твиты от вашего имени.

    А еще можно писать SMS по себестоимости в Твиттер, FriendFeed, Facebook, LiveJournal, Buzz


    Если вы поклонник Твиттера, настройте экспорт сообщений Рутвит -> Твиттер (или FriendFeed, Facebook, LiveJournal, Buzz) и пишите в Твиттер (FriendFeed, Facebook, LiveJournal, Buzz) SMS по себестоимости, используя Рутвит в качестве шлюза:



    (Для справедливости стоит отметить, что в Twitter можно отправлять SMS и через зарубежные шлюзы, однако в России это получается сильно дороже: ведь SMS на британский номер +44xxxx, предоставляемый Твиттером, дороже SMS на российский номер Рутвита +7 916 140-0-140.)

    Теперь ложка дегтя, присутствующая в бета-версии. Одна из наших целей — сделать так, чтобы пользователь мог не только отправлять SMS в Рутвит по цене обычного SMS, но также и бесплатно получать по SMS твиты на мобильный телефон. Некоторые сервисы микроблогов просто покупают GSM-модем (или смартфон с Linux) и принимают/отправляют SMS через него, однако этот способ работает только на небольших объемах трафика: он плохо масштабируется. Тем не менее, мы хотим избавить пользователей социальных сетей от дополнительных затрат при активации и пользовании данным сервисом. Но только техническая интеграция и заключение договора напрямую с оператором позволит этого добиться. А пока идут переговоры, в бета-версии не реализована возможность приема SMS на телефон: можно только отправлять твиты в систему. В этом вопросе мы делаем ставку на будущее.

    Технические подробности прямой интеграции


    Мы раньше никогда не работали с SMS и протоколом SMPP. И, когда мы подписали договор с МТС, мы столкнулись с выбором:
    • либо сделать SMPP-клиента вручную (с использованием модулей для Perl, например);
    • либо использовать готовый SMPP-сервер промышленного масштаба (самый популярный из них — Kannel).
    В итоге было решено остановиться на втором варианте, и мы не пожалели об этом, потому что в процессе интеграции мы наступили на массу подводных граблей, многие из которых были успешно разрешены Kannel-ом.

    Немного о SMPP, протоколе передачи SMS-сообщений


    Протокол SMPP (расшифровывается как «Short Message Peer to Peer») сам по себе весьма сложен. Он очень низкоуровневый (спецификации занимают 170 страниц). Сложность обусловлена, главным образом, историческими причинами. Группа протоколов для передачи голоса разрабатывалась в 1975 г. В те времена никаких SMS еще не было (не было даже ЖК-дисплеев для сотовых телефонов, как и самих мобильников). И вот, в 1985 г. в стандартные пакеты протокола передачи голоса решили «упихать» поддержку текстовых сообщений. Но полезного места в этих пакетах было мало, поэтому сообщения получились короткими, всего 160 символов — Short Messages.

    Полезный объем данных, который можно передать в SMPP-пакете, составляет 140 байт. Это не опечатка. Как же в них поместилось 160 символов? Вы, наверное, уже догадались: 1 символ ASCII можно закодировать 7 битами. Таким образом, получается 160 * 7 = 1120 бит, или 140 байт.

    Если бы мы жили в США, где кодировки ASCII «должно быть достаточно каждому», то мы бы спокойно писали твиты размером 160 символов. Однако при передаче русских букв по SMS они упаковываются в кодировку UTF-16, т.е. 2 байта на 1 русскую букву. Поэтому в 1 сообщении может поместиться не более 140/2 = 70 символов русского алфавита. Если текст длиннее, он упаковывается в 2 и более SMS-сообщения, которые затем «склеиваются» при отображении на телефоне.

    Но это еще не все. В 2 SMS-сообщениях можно доставить вовсе не 70 * 2 = 140 русских букв, а всего только 134. Дополнительное место требуется для кодирования служебной информации, в частности, информации о числе SMS в цепочке и номере текущей SMS в ней.

    Kannel сотоварищи


    Сервер Kannel, который мы использовали, на самом деле имеет более широкую область применимости. Он предназначен для контент-провайдинга, когда запрос представляет собой SMS, а ответ — некоторый SMS-контент: мелодии, картинки и т.д. Мы используем только ту часть, которая организует прием и трансляцию SMS: Kannel принимает SMPP-сообщение, распаковывает/расшифровывает его и передает нам HTTP-запросом номер телефона и текст. В ответ же мы не посылаем никакого контента.

    Правда, не обошлось без сюрпризов. У МТС весьма скурпулезная схема тестирования: мы не только должны корректно принимать сообщения, но и укладываться во всевозможные тайм-ауты при постановке запросов в очередь, поддерживать throttling, вовремя отправлять сообщения-подтверждения доставки при взрывном росте нагрузки. На тестовом стенде мы столкнулись с проблемой, для решения которой нам пришлось немного пропатчить Kannel (он написан на Си). Вкратце ее можно описать так: предположим, на Kannel пришли 2 SMPP-пакета, а третий — уперся в ограничение пропускной скособности, заданной МТС, а поэтому — застрял в очереди. Если теперь ограничение снялось, но тут же пришло 4-е сообщение, то в стандартном варианте Kannel поставит это 4-е сообщение перед всеми ранее застрявшими. Поэтому 3-е сообщение опять окажется в конце очереди и будет отодвигаться все дальше и дальше по мере поступления новых SMS. Оказывается, для нагрузочных тестов МТС это поведение имеет значение — как и многие другие аспекты, которые пришлось учесть при прямой интеграции.

    Мы не имели опыта работы с SMPP ранее, но Kannel позволил нам выкарабкаться. На наше счастье, Kannel даже в базовой конфигурации обрабатывает очень многое из того, что было нужно ОПСОС-у. Но, положа руку на сердце, сейчас, уже «съев собаку» на SMPP, мы бы стали все делать с использованием Perl и модулей с CPAN, а не Kannel. Но это было бы возможно только благодаря тому опыту, который мы получили с Kannel. Без этого опыта программирование прямой интеграции с ОПСОС-ом на Perl — все равно, что учить человека плавать, бросив его в воду с обрыва: может, и научится, а может, утонет. МТС особенно скурпулезен при тестировании обработки ошибок, выдерживания разнообразных тайм-аутов. Например, четко регламентируется время отправки подтверждений *_resp на SMPP-сообщения: задержки должны укладываться в заданные МТС временные интервалы. Если вы решите работать с SMPP напрямую, изучите вначале Kannel: я бы рекомендовал делать вам собственное решение, повторяя архитектуру Kannel-а, особенно — аспектов буферизации сообщений.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 80

      0
      а почему отказались от использования sms шлюзов. Сейчас стала интересна тема смс шлюзов, возникла необходимость отправлять смс пользователям, присматриваюсь к gnokii с отравкой через «обычный» телефон, но пока безрезультатно…
        0
        Ну, мы не ищем легких путей. :-) А если серьезно, то только прямое сотрудничество с большой компанией может позволить в будущем делать ряд других интересных SMS-сервисов (в перспективе — организовать бесплатный для абонента прием SMS с Рутвита).
        • UFO just landed and posted this here
          +3
          Писать твиты по себестоимости можно ещё через приватбанковский t.liqpay.com

          Короткий номер на Россию и Украину.
            +1
            Спасибо!
            А то рутвит оставляет свой копирайт…
              –2
              Какой-такой «копирайт»?
                +2
                Ссылку добавляете на рутвит…
              +1
              работает. спасибо.
                0
                А где можно почитать, что по себестоимости? На офф.сайте что-то не видно, или я не там смотрю.
                  0
                  Там же на сайте выделено: «Стоимость СМС — по тарифам оператора». Последний раз, когда я им пользовался (правда, довольно давно) снялась обычная стоимость смс.
                    0
                    Там общая лента, логотип Твиттера и короткие номера, видимо нужно регистрироваться. Спасибо.
                0
                По себестоимости — дорого. Сторонние сервисы предлагают около 16 копеек за СМС и ниже.
                Например turbosms.com.ua
                  +1
                  Простите, а как связаны служба рассылки смс и отправка смс с собственного телефона?
                    0
                    Опс, недопонял тему разговора.
                  0
                  а входящие твиты он присылает или только постить позволяет?
                    0
                    Только постить.
                      0
                      В планах — сделать входящие тоже. Когда сделаем, снимем значок «бета» с сервиса.
                  +1
                  Интересно. У нас тоже стояла подобная задача, правда мы конектились к гейту, но тоже через SMPP. Нужно было как принимать, так и отсылать SMPP сообщения. Для этого дела я разработал свой модуль на РНР, основанный на древней PEAR библиотеке (глюючной, правда). Что скажу… Написание заняло около месяца у одного человека, потом ещё неделя-две тестирования, за этот месяц я вкуривал все возможные документации по SMPP (официальную, специфику работы гейта), смотрел разные реализации и написал свою интегрированную в symfony. Из того что знаю, то в РНР реализациях никто не создавал ресиверов, только трансмиттеры, а потому его пришлось писать просто наощупь. Сейчас это многопроцессный демон на том же пыхе, который, как ни странно, работает.

                  Выбором написать свою реализацию я доволен (хотя я и не выбирал :) ), тестирование идет нормально, посмотрим как оно будет с реальными нагрузками работать.

                  Если работодатель позволит выложу реализацию в виде плагина, или продадим его тому же гейту :)
                    0
                    Счастливый… у вас был гейт. :-) А нас отдел тестирования оператора гонял по полной (правда, совершенно заслуженно гонял, они молодцы вообще: намучились с нами, наверное), документации — 100 страниц, 3 раза пришлось переделывать отдельные места.
                      0
                      Тю, а в чем отличие? Только в том что за тестовые смс мы платили свои деньги :( Гейт нужен был только для того, чтобы конектится ко многим операторам. Никакой поддержки они нам не предоставляли, только присылали технические документы.

                      Или МТС на вас ещё свой передатчик тестировали? ;)
                        0
                        Не понимаю… у отдела тестирования опсоса обычно такая обязанность тестировать ПО. А то что дока на сто страниц — так это не много.
                        Вот когда тестят систему у которой ТЗ на пару сотен страниц, потом руководство пользователя на столько же, ещё админ гайд на полтиник. А потом им ещё нужно писать тесткейсы по вашему ТЗ. Потом регрессить систему.

                        Но всё это не так сложно… сложности начинаются, когда попадаются тестеры которые не хотят всё это делать. И тут начинает переписка, по некоторым системам у моих знакомых аналитиков можно подшить несколько увесистых томов.
                          0
                          Даеш твиттер в пчелайне! :)
                            0
                            Мда… только со сраным пейбоксом разберутся :D
                              0
                              юмцс всех переживет!!! :)
                                0
                                Да что-то с каждым днём мне в это всё меньше веритцо :(
                        0
                        делали проект с билайном, тоже интегрировался серез SMPP. К счастью решил бросить PHP и взять Perl — модуль работает на отлично (еще и многопоточно), написал свою обертку вокруг него. Не без танцев с бубном, но за полторы недели запустили.
                          0
                          А зачем через smpp? У них же есть специальные интерфейсы без этого, простите, геморроя.
                            0
                            не сказал бы что гемморой, довольно просто и быстро получилось
                              0
                              Каждому своё… Я просто не люблю низкоуровневые протоколы… хоть и приходится иногда писать, правда, при этом матерюсь как сапожник.
                        0
                        жаль, что официально не работает
                          0
                          Вы имели в виду «официальный Твиттер», видимо (странно, что в нем такого «официального», вроде нормальный сервис, без галстука :-). Да, «большой Твиттер» в России не поддерживает отправку дешевых SMS. Можете через rutvit.ru настроить экспорт (тогда пишете в Рутвит, а оно попадает в Твиттер), ну или как выше предлагали.
                            +1
                            Оно работает, если вы привязали Россию до того, как она исчезла из списка. У меня, например, по вашей ссылке мой привязанный номер мобильного, с которого я могу отправлять твиты на английский шлюз+447624801423. Правда, учитывая стоимость международных смс, большого смысла в этом не вижу.
                              0
                              Простите, я не знаю специфику России — а у вас международные СМС стоят дороже обычных?
                                0
                                Вероятно, это зависит от оператора и тарифа, но да, несколько лет назад стали дороже. Вот к примеру, на одном из тарифных планов Билайна:
                                Отправка одного сообщения:
                                на все местные номера города и области подключения 0,95 руб.
                                на номера российских операторов 2,95 руб.
                                на телефоны «Билайн» в страны СНГ,
                                на номера других зарубежных операторов 5,45 руб.
                                  0
                                  Мда. То-то у меня так быстро деньги в Москве на телефоне заканчивались :)

                                  У нас на том же life:) — 129 руб. за SMS в любую сторону света (1,29 российских). Это без учёта всяких акций и хитрых тарифов, где цена может падать до 20 и ниже.
                                –1
                                на СМС одна цена, куда бы ты не слал… хоть в африку.
                                  0
                                  ну не считая «спец» номеров разводил которые в сговоре с ОПСОСами
                                    +1
                                    Когда это было-то? Сейчас единая стоимость только Россия и Украина, куда за моря отправить уже дороже (вот например: www.belgorod.tele2.ru/tariffs_strike.html).
                                      0
                                      ого. каюсь. только сейчас заметил.
                                    0
                                    Россию можно вернуть в этот список — воспользовавшись html редактором =) Firebug
                                    0
                                    Не сочтите за рекламу и оффтоп, но я нашел способ наладить написание sms в twitter с любого российского оператора. webdev.vdzr.ru/articles/sms2twi
                                      0
                                      Интересная дырка, однако :)
                                        0
                                        Я в свое время для этой дырки даже скриптик написал… userscripts.org/scripts/show/72161
                                          0
                                          работает)
                                      +2
                                      И сколько времени ушло на интеграцию с их СМСЦ по SMPP?
                                      Какой, к стати, SMPP? 3.3 или 3.4?
                                        +1
                                        Протокол SMPP 3.4. Заняло 3 недели технической работы.
                                          +1
                                          Три недели? Действительно оперативно. А какой МТС, московский?
                                        –1
                                        И сколько времени ушло на интеграцию с их СМСЦ по SMPP?
                                        Какой, к стати, SMPP? 3.3 или 3.4?
                                      • UFO just landed and posted this here
                                          +1
                                          а почему нельзя купить «телефон», подключить к серверу и обрабатывать сообщения?
                                            +2
                                            Можно, отчего ж нельзя. Только сразу возникают вопросы: с нагрузкой (так и представляю себе: «На окне стояли 27 включенных телефона. Только Штирлиц мог догадаться, что явка провалена.»), с тем, что в ДЦ телефон так просто не поставишь, с отсутствием перспектив, да и, наконец, с тем, что с точки зрения оператора это — нецелевое использование сервиса.
                                              +1
                                              Я тут диплом делал, смс оповещение для кафедры, расписание и прочая студенческая шляпа. Использовал smstools. Ведь всю систему можно держать в дц, а сотики где то дома. Или в нескольких домах на неттопах и упсах, чтобы деферсифицироваться ;)
                                              +1
                                              … а за нецелевое использование оператор люто борется с нецелевыми использователями. И если сервис себя уважает, таких вещей он делать не будет, потому что сегодня ваш входящий номер работает — а завтра нет.
                                              –4
                                              Люто, бешено ненавижу МТС. Жаль, что стали взаимодействовать с этим оператором. Но за сервис спасибо.
                                                0
                                                Компания теряла мое доверие постепенно. Последней каплей стала кастрация безлимитки. В один прекрасный день увидите маааааленькую звездочку у слова бесплатно, вас это очень порадует… =)
                                                0
                                                Молодцы (сам когда-то курил Kannel, правда, в 2005-м)! Но вам не кажется, что sms-решения это уже некоторый олдскул? Особенно прием входящих твит-сообщений.
                                                  0
                                                  Кажется. Но что делать, если гиков в России мало, а у основной массы населения — телефоны несмартфонового типа… Приходится подстраиваться.
                                                    +1
                                                    + находясь в роуминге — не хочется платить за GPRS трафик, а на SMS можно потратиться.
                                                      0
                                                      Я как вспомню стоимость SMS в роуминге, так вздрогну
                                                  +1
                                                  С недавних пор «Му-му» у меня ассоциируется с некоей девушкой, отчего сообщение на экране заставило меня на минутку зависнуть.
                                                  Виктор Анатольевич, вас же на хабре нет, правда?
                                                    +1
                                                    Я 2 года назад интегрировался с МТС, Билайн, Теле2 и Мегафон (к нему через Инкор, в подключении напрямую отказали)
                                                    По SMPP 3.4 (хочу заметить, у каждого из операторов были свои детали имплементации SMPP)
                                                    Самое жесткое тестирование провел Tele2, за что им отдельное спасибо.
                                                      +1
                                                      я и сейчас шлю твиты через SMS без всякого РуТвита…
                                                      на офф сайте вбиваешь мобильный и тебе дают номер +44 многоцифр. посылаю на него, получаешь твит.

                                                      основная проблема, нет «России» в выборе. Но при наличии Google Chrome, Firefox Firebug… это легко обманывается :)
                                                        0
                                                        не у всех одинаковые тарифы внутри страны и за бугор
                                                        +4
                                                        Если речь зашла о публикации в твиттер посредством смс-ссобщений, то какое-то время назад мне удалось воспользоваться стандартным сервисом. Написал простенький скрипт, и все заработало.
                                                        userscripts.org/scripts/show/72161
                                                          +4
                                                          именно! все работает прекрасно без всякого РуТвита
                                                            0
                                                            Работает, но только дороже выходит. В России SMS на номер +44xxxxxx (UK) SMS стоят дороже, чем на номер Рутвита +7 916 140-0-140.

                                                            Кроме того, через Рутвит можно слать обновления по SMS не только в Твиттер, но также и в FriendFeed, Facebook, LiveJournal и даже Buzz.
                                                              0
                                                              в России я могу открыть GPRS/3G в рамках своей сети, запустить приложение и сделать пост.
                                                          +1
                                                          Не скурпулезный, а скрупулезный.
                                                            0
                                                            Skrupellos=Skrupel+los без крупинки сомнения.
                                                            von lat. scrupulus = камушек — мера веса=6 карат

                                                            de.wikipedia.org/wiki/Skrupel
                                                            0
                                                            smpp — есть в этом протоколе что-то… магическое… ресиверы, трансмиттеры, трансиверы...3.3, 3.4, 3.4+, 5.0… каждый производитель smsc еще норовит протокол добавляет чего нить особо нужного...;)

                                                            мы просто писали для полосатого оператора гейт, который из нескольких входных потоков(soap, smpp, sql, mq) кидает на выход smpp с большой скоростью(3k/s).

                                                            Ребята настолько устали от проблемы, что каждой апликухе нужно лезть через smpp, что решили все унифицировать и пускать через более привычные интерфейсы. Сейчас потихоньку все переводят на отправку через гейт.

                                                            Кстати все на j2ee + oracle вертится
                                                              0
                                                              ужасно (это я про j2ee+oracle).
                                                                0
                                                                Как раз отлично. И то и другое ТРУ энтерпрайз. И дебажить и тестить и рефакторить — одно удовольствие. А стало быть и надежность сервиса растет.
                                                                  0
                                                                  Если бы это ещё работало бы на веблоджике, а не вебсфере было просто прекрасно… Проблемы с авторизацией у .NET приложений, которые забирают сообщения, вообще считаю подставой и постоянные брожения с безопасниками по этому вопросу стабильником раз в полгода — это просто песня.
                                                                    0
                                                                    Ага, то пароль не передается, то пользователя нужно одноименного виндового заводить :) то ли дело в яве :)
                                                                      0
                                                                      Если уж предоставляешь API, то уж будь добр реализовать это по человечески… а не через «место»
                                                              +2
                                                              Я, когда работал в МТС, написал протокол SMPP под twisted (очевидно, на питоне).
                                                              Сам по себе протокол простой как две копейки, а вот через каннел с ним работать всё равно что через жопу (каннел я, кстати, тоже патчил, только вапбокс — чтобы он под нагрузкой не ложился, и работал нормально с телефонами многими).

                                                              Проблема основная была в том, что хотя сам протокол простой как две копейки, смпп-приблуда от смс-центра компании цбосс работала отвратительно. Она по своему желанию переставляла поля в UDH и делала много ещё всякой разной всячины, а когда цбоссовцам было указано на баг они это обозвали фичей и добавили флажок «сохранять порядок полей в UDH» (а чтобы это отловить, мне пришлось втыкать анализатор между смс центром и коммутатором и долго пыриться в дамп ss7).

                                                              Такие дела.
                                                              Привет.

                                                              P.S. На говнокод можно посмотреть здесь: gitorious.org/ota-configurator/mainline/trees/master/src
                                                                +2
                                                                Всегда удивляло что наши операторы не сделали 160 символов тоже. Внутри бы всё билось на 2-3 сообщения, да. Телефон умеет писать сколько сообщений уйдёт с учётом русского, но явно если бы в своё время сделали 160 символов, то было бы 160. Себестоимость смсок для оператора однозначно копеечна.
                                                                  0
                                                                  а расскажите, как вы отправляли смс через kannel в итоге? просто запрашивал из своих скриптов урл /cgi-bin/sendsms?user=tester&pass=foobar& smsbox'а?

                                                                  Only users with full accounts can post comments. Log in, please.