image

Примерно год назад мы запустили свой маленький проект с оповещениями о поломках Московского метро.

Самой главной проблемой в нем оказалась рассылка смс. Мы не ожидали, что проект понравится и у нас будет 1500+ регистраций. В самом лучшем случае мы расчитывали человек на 300. Этим мы были приятно удивлены.

Проблема с смс в первую очередь была из-за цены. Одна рассылка получалась примерно 3000 рублей. С учетом того, что цена 1 смс 1,5 рубля. Были времена, когда неполадки в движением поездов были каждые 3 дня, т.е. 10 поломок в месяц. 3000*10 = 30 000 рублей. Дороговато для проекта, который не финансируется.

Тут мы начали изобретать велосипед. А именно, искать тарифы с действительно безлимитными смс. В итоге мы его нашли. Стоило что-то около 600 рублей в месяц. Дальше нужно было решить вопрос с отправкой смс. И тут пришло время древней nokia 6610i, которая пылилась в шкафу как память о былой эпохе. Но ее пришлось чуть доработать, а именно подключить по uart к ноуту, чтобы отправлять задания.

imageСхема

Пара диодов тут нужна чтобы сбросить напряжение с 5V до ~3.4V. Падение на диодах суммарно получается 1.6V при тока 1А. Такой ток нокия потребляет только при активной работе с сетью, а большую часть времени падение на них будет около 1.5V.
Большой и толстый конденсатор нужен чтобы сглаживать потребление телефона в тот момент когда работает передатчик, и он много жрет.
А резисторы — заменяют терморезистор и пин идентификации батарейки (BSI), по которому nokia понимает что к ней подключен аккумулятор.
У нас подходящих номиналов резисторов не нашлось, поэтому собрали из того что было.

image

Для отправки использовалась программа gnokii, из названия которой вполне очевидно, что писалась она как раз для таких целей.

Конфиг от нашей 6610i:

[global] port = /dev/ttyUSB0
connection = dlr3p
model = 6510


Команда для отправки
echo 'text' | gnokii --sendsms number


Чтобы рассылать можно можно было не только от root, нужно выставить соответствующие права на /dev/ttyUSB0

Тут понравилось, что нам могли отвечать, и нам отвечали. Но и проблемы тут не закончились, а именно скорость: такая рассылка занимала 4 часа. Поэтому таким образом мы рассылали информацию, которая актуальна длительный период, например, про закрытие части линии на ремонт. 1 симки нам хватало примерно на 3 тысячи сообщений, т.е. на пару рассылок. Дальше нас блокировали. Мы звонили в ТП и спрашивали причины блокировки, на что нам отвечали — рассылка. Один раз нам хватило одной симки на 5 рассылок, таймауты делали побольше и меняли текст. И нам всегда везло на красивые номера — мелочь, но приятно.

А поскольку в обычном случае у нас актуальность информации составляет минут 40, рассылка в идеале должна быть за пару минут. Поэтому мы решили сделать рассылку на телефоне с Android. Главным преимуществом этого решения была скорость, правда тоже далеко не идеально. 1 смс отправлялась за 1.5 секунды, что в результате выходило примерно в 37 минут. Дальше можно было параллелить при помощи подключения еще телефона и добиться нужной скорости. Но тут нас задушил оператор, который блочил нас или посредь первой рассылки или в начале второй.

Логика приложения заключилась в периодическом получении задания с сервера. Примерно раз в несколько минут приложение обращалось на сервер за командой в формате json, которая состояла из массива телефонных номеров и текстов смс.

У нас был поток для забора команды с таймаутом, поток для рассылки смс, BrodasReceiver для запуска после загрузки. Но проект потерялся, ввиду давности, поэтому полного кода не будет. Текст смс мы урезали до максимума 1 смс — 70 символов (это для кириллицы), это делала серверная часть, но на всякий случай отправка смс была ровно на 70 символов:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("NUM", null, "TXT", null, null);


не забывая про права на отправку смс в манифест

<uses-permission android:name="android.permission.SEND_SMS" />


Для автозапуска после включения не забываем про права:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


Прописать в манифест:

<receiver android:name=".Boot"
            android:enabled="true"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
</receiver>


Код Boot:

public class Boot extends BroadcastReceiver 
{

	@Override
		public void onReceive(Context context, Intent intent)
		{
		 тут запуск потока
		}
}



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

Ну и в Activity добавляем запуск потока.

Так же разрешаем приложению доступ в интернет:

<uses-permission android:name=«android.permission.INTERNET»/>

И еще важный момент, чтобы наше приложение работало даже с выключенным дисплеем нужно вызвывать PowerManager. Иначе система будет усыплять приложение по своему желанию, для экономии заряда, и запросы будут выполняться нерегулярно.

Для этого добавляем пермишн:

<uses-permission android:name="android.permission.WAKE_LOCK" />                


Дабавляем код в Activity:

PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|
	       	PowerManager.FULL_WAKE_LOCK| PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "");


И в поток
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();

Обращение к серверу, обработка полученного json 

wl.release();


Такой способ тоже не проработал долго, поскольку постоянно менять симки было не очень удобно и рационально — ценник стремительно рос и это потеряло смысл.

Дальше мы пробовали рассылать через Whatsapp, но тут номера умирали каждые 10 сообщений, а то и быстрее. А регистрация 1 номера стоила 7 рублей. Мы опять начали выходить на те-же цифры, с которых начали.

А не так давно мы сделали бота для телеграм — https://telegram.me/msk_metro, тут все так же как и с PushBullet, который мы подключили по просьбам после первого поста на хабре. Только тут мы можем удалять случайно прошедшие модерацию сообщения, а в PushBullet — нет.
Поделиться с друзьями
-->

Комментарии (73)


  1. x88
    08.07.2016 08:16
    -2

    Почему бы не использовать сервис по рассылке?


    1. nevzorofff
      08.07.2016 09:05
      +3

      Потому что одна смс 1,5 рубля, о чём было написано.


    1. Xalium
      08.07.2016 09:05

      и сколько по цене обойдется в месяц рассылка ~20,000 смс? Точно намного больше 1000 руб.


  1. roboter
    08.07.2016 08:32
    +1

    есть модули GSM которые, стоят дёшево, те же RX TX, и AT команды,
    sim800l например https://www.youtube.com/watch?v=Hm41vcG_hkA
    старые телефоны это хорошо, но нужна и повторяемость
    модулей же можно взять 10 штук и распаралелить


    1. Irenica
      08.07.2016 09:02
      +2

      Проблема не в телефонах. Операторы банят за рассылку, приодится менять симки. Симки так же стоят денег + тариф. Возвращаемся примерно к тем же цифрам от которых отталкивались


      1. Revertis
        08.07.2016 09:42

        А за что они банят? Вы не можете донести до оператора то, что пользователи сами подписываются на эту рассылку, и юридически это уже не спам?


        1. Irenica
          08.07.2016 09:45

          Быстрая отправка походего текса считают как рассылку и более ничего иного услышать от них неудалось. Не спам, но рассылка же


          1. and7ey
            08.07.2016 20:12

            А разве имеют право? Не нарушают ли ваше право на переписку?


            1. Irenica
              08.07.2016 20:19

              Вот тут я не вкурсе, к сожалению


              1. TsarIoann
                09.07.2016 00:35
                +2

                Какие знакомые проблемы. В своём небольшом проекте тоже используем СМС и рассылаем с Android-аппарата (Xperia Ray старая была под рукой). К счастью, нужно в основном рассылать коды подтверждения регистрации и какие-то личные уведомления пользователям. Когда понадобилась массовая рассылка, то после примерно 1000-но СМС оператор заблокировал отправку СМС. Я написал в поддержку, объяснил им, что я не нарушаю никакой закон: все мои клиенты давали согласие на получение такого рода СМС. У меня уточнили паспортные данные (на кого зарегистрирована симка) и включили отправку. Дали пояснения, что она была заблокирована в автоматическом режиме.
                P.S. Оператор — Yota. Там удобно, что безлимитные СМС. И поддержка отвечает быстро.


            1. dcoder_mm
              09.07.2016 14:39

              ТП говорила что блокирует служба безопастности пчелайна. Скорее всего там что-нибудь автоматическое стоит. Характерно, что когда мы меняли текст и рассылали 10 похожих вариантов одного и того-же сообщения, жило несколько дольше.


        1. ad1Dima
          08.07.2016 10:40
          +4

          Денег хотят, что непонятного?


        1. Moskus
          08.07.2016 17:51

          Когда симки покупаются на физлицо?


          1. Irenica
            08.07.2016 18:23

            симки с рынка, потому на кого они записаны нам было не известно


            1. Moskus
              08.07.2016 22:09

              Это был не вопрос вам, а ответ Revertis. Естественно, симки, которые записаны на физлицо, не предполагают использование их для массовых рассылок, потому что оператор такой услугой торгует отдельно, продавая ее тем, кто занимается коммерческой деятельностью.


              1. dcoder_mm
                09.07.2016 14:40

                Симки эти, насколько я помню из разговора с ТП, были на юрлицо.


  1. pengyou
    08.07.2016 08:41
    +1

    Мы тоже, в своё время, столкнулись с проблемой каштомного рассылателя СМС, для которого использовали легендарный Huawei E1550. Всё таки канал связи выделяемый для одного абонента не подходит для массовой рассылки.

    Для production конечно лучше использовать непосредственно интернет-шлюз СМС от какого-нибудь оператора или же один из многочисленных сервисов по массовой рассылке смс, которые предлагают гибкие тарифы, причём прогрессивные, чем больше СМС отправляете, тем дешевле каждое.


  1. cry_san
    08.07.2016 08:44
    -3

    Помню раньше были сервисы для бесплатной отправки СМС. Причем даже на официальных сайтах МТС и Билайна.
    Если они еще остались, то проблем с отправкой бесплатной смс вообще не вижу.


    1. Irenica
      08.07.2016 09:00

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


    1. Alexashka
      08.07.2016 09:03

      Там был приличный временной интервал между сообщениями и ограничение на число сообщений.


    1. bopoh13
      08.07.2016 11:00

      В ЛК МТС можно заблокировать рассылку с сайта. У меня давно функция включена.
      Может поискать какого-нибудь виртуального оператора?


    1. dkv
      08.07.2016 13:17

      Десять лет назад почти во всех регионах у операторов были email-шлюзы, позволяющие отправлять смски через отправку простого письма электронной почтой либо легковесные формы на сайтах без каптч для тех же целей. Даже приложение под j2me соответствующее писал (SMS Send), упрощающее этот процесс для обычных юзеров на их мобилках. Последнее живое подтверждение работоспособности приложения, найденное в сети, датируется 2012-м годом. А по факту с 2008-го года начались отключения шлюзов. Думаю, сейчас проще всё пушами юзерам отправлять и не вспоминать вообще об смс.


  1. gensbest
    08.07.2016 09:05
    +2

    Обычный GSM USB модем прекрасно рассылает СМС.


    1. dcoder_mm
      08.07.2016 09:06

      Модема не было, зато были нокии. А если нет разницы… :)


      1. nevzorofff
        08.07.2016 09:15

        Модемы на авито чуть ли не по 100рублей, а время, потраченное на подключение нокии по юарту да пайку ей источника питания тоже стоит денег.


        1. Irenica
          08.07.2016 09:18

          Количество модемов увеличивают цену 1 смс, поскольку тарифы по 6000? + регулярная смена симок из-за бана. Распараллеливание не решает проблему


          1. Irenica
            08.07.2016 09:33

            Опечатка. 600, а не 6000


        1. Cawqa
          08.07.2016 09:47
          -4

          Почему все последнее время считают деньги? Почему не сделать это все Just for fun или же из любопытства ради?


          1. Irenica
            08.07.2016 09:48
            +5

            Оно так и было изначально just for fun — нас было человек 20 на смс рассылке. А потом появились люди, которые тоже хотят получать наши уведомления. Вот и упирается весь fun в стоимость


  1. marsianin
    08.07.2016 09:40

    А Viber или Skype не планируется?


    1. Irenica
      08.07.2016 09:44

      У Viber закрытое API, поэтому с ним не получается. Вот как спам там рассылают мы еще не осознали. Со скайпом все гораздо проще, но вопрос есть ли у skype что-то наподобии канала и не банят ли за рассылки. Мне к примеру, никогда не приходил спам с неавторизов


      1. marsianin
        08.07.2016 09:48

        У скайпа есть групповые чаты. Я не уверен, что это то, что нужно, но, возможно, стоит посмотреть на них.


        1. Irenica
          08.07.2016 09:50

          Там может писать каждый и это уже не совсем тот формат, что нужно. Может быть информативнее, но из-за количества сообщений от участников что-то увидеть вовремя будет сложно


          1. Hydro
            08.07.2016 10:04

            Telegram! Нужен бот для telegram!


            1. dcoder_mm
              08.07.2016 10:09

              Кто-то не прочитал то место статьи где у всех остальных обычно реклама ;)
              https://telegram.me/msk_metro


          1. Igelko
            08.07.2016 10:21
            +1

            У групчатов скайпа есть опция, так что всё ок.
            USERS_ARE_LISTENERS — Users with a USER role will be unable to post messages.

            Полный мануал:
            support.skype.com/en/faq/FA10042/what-are-chat-commands-and-roles


        1. monah_tuk
          11.07.2016 13:56

          В групповом чате скайпа лимит на 100 собеседников. По крайней мере был раньше. Хотя… вряд ли в этом направлении что-то сменилось.


      1. Moskus
        08.07.2016 17:53
        +1

        Собственно, вполне официально


        1. and7ey
          08.07.2016 20:20

          Не советую делать ботов для Skype. Мой бот «опубликовали» (т.е., перейдя по ссылке, им теперь может пользоваться неограниченное количество пользователей, у неопубликованных — только 50), а вот разместить в directory отказались, никакой причины не назвали, правил у них никаких нет, ответы от них ждешь по несколько недель.


          1. Moskus
            08.07.2016 22:10

            Я никаких ботов создавать не собираюсь — всего лишь дал ссылку на официальное упоминание такой возможности.


    1. Cawqa
      08.07.2016 09:49

      Мне кажется немного людей пользуются Skype в метро, во всяком случае это моя догадка.


      1. Irenica
        08.07.2016 09:54

        Всетаки кажется skype скорее рабочий мессенджер, чем для личных уведомлений


        1. vandalns
          08.07.2016 12:37

          Телеграм самое то. Скайп неудобен, тем более в смартфоне (энерго и ресурсопотребление знаете ли), у вайбера закрытый код (рассылка, скорее всего, через саму службу).
          Подписался на канал) Спасибо за труд!


  1. ilyaplot
    08.07.2016 10:03
    +1

    Возможно, стоит пообщаться с оператором по поводу предоставления smpp, например? Не знаю, возможно ли это, но стоит предоставить оператору подтверждение того, что абоненты, которым отправляется sms, дали согласие на их получение. И есть же Push


  1. maiketa
    08.07.2016 10:08

    Если вам интересно делать рассылку на большое количество пользователей в короткое время, то обратите внимание на SMPP протокол не требующий ни симок ни телефона.
    Jasmin SMS Gateway например, позволяет отослать 1000 смс за 10 сек.
    SMPP предлагает любой агрегатор и все операторы, цена смс начинается от 0,45р и падает в зависимости от обьемов.


    1. Irenica
      08.07.2016 16:55

      А какой % потерь сообщений?


      1. ilyaplot
        11.07.2016 12:49

        Сервисы обычно отдают ответ на все операции, который можно обработать и узнать % потерь.


    1. dcoder_mm
      09.07.2016 14:42

      Спасибо, посмотрим.


  1. alm
    08.07.2016 10:31
    +1

    Извините за рекламу, но вот ребята сделали уже давно. Отправляешь со своего телефона/телефонов по своим тарифам/пакетам смс. Расширяемость до бесконечности имхо. Можно купить на втором андроиде телефон менее, чем за тысячу и всё.
    И велосипед не нужен ;)


    1. dcoder_mm
      08.07.2016 10:40

      Получится те-же грабли что и у нас при рассылке с андроида, ведь работа с оператором на тех-же условиях


      1. alm
        08.07.2016 10:49

        несколько дешевых телефонов и симок. Сервис перенаправит на «свободные».
        а так да. банят операторы.


    1. Rastishka
      10.07.2016 18:01

      Ох, спасибо за полезный сервис, очень вовремя.
      У вас есть опыт использования этого сервиса в боевом режиме?


  1. c0mrade
    08.07.2016 10:31

    С Метрополитеном не пробовали договориться? Возможно им и самим был бы интересен такой проект. Как вариант поиска инвестора :)


    1. Irenica
      08.07.2016 10:34

      Не пробовали, они на своей волне


  1. al322se
    08.07.2016 10:42
    +1

    А почему просто не запилить приложения для Android,IOS,WinPhone?


    1. ad1Dima
      08.07.2016 10:46

      Сдается мне, что бота для телеграм поддерживать дешевле. По надежности доставки сообщения получается то же самое. Хотя нормальные СМС надежнее.


    1. dcoder_mm
      09.07.2016 14:44

      Приложение поставит меньше людей, чем оставят телефон / подпишутся на бота / etc. Впрочем с приложением открываются гораздо более интересные возможности


  1. idg_chernyshov
    08.07.2016 11:10
    +1

    Интересный проект, но почему не написать простенькое приложение для Android и использовать для рассылки GCM у них на сколько я помню нет ограничения на количество сообщений?


    1. Kondra007
      08.07.2016 11:27
      +1

      И при этом можно гибко настраивать категории получаемых сообщений (аварии, события, новые станции)


    1. Irenica
      08.07.2016 11:35

      Попробуем реализовать


      1. Rastishka
        10.07.2016 18:06
        +1

        В качестве прототипа можно использовать это приложение https://play.google.com/store/apps/details?id=eu.apksoft.android.smsgateway
        В комментах пишут что у него есть проблема с длинными сообщениями, но в плане интерфейса и настроек можно взять за образец.


  1. VLT
    08.07.2016 12:33

    Жму вам руку — задумывал похожий проект — пришел к тому же к чему пришли и вы. И телефон и телеграм все было ) Спасибо за статью было полезно почитать!


    1. dcoder_mm
      09.07.2016 14:44

      А что у вас был за проект, если не секрет?


    1. monah_tuk
      11.07.2016 14:02

      Не только вы :)


      Вот от меня: http://htrd.su/wiki/proekty/sms_notification_system_sns/start


      Правда ссылки убились, не следил. Но где-то локально должно сохраниться. Там трудился Siemens ME45 ;-) с питанием подвешенным на датакабель.


  1. 1win1
    08.07.2016 13:14
    +1

    Давно подписан на рассылки проекта, и хочу поблагодарить авторов (Irenica & dcoder_mm) за их труд! Так как метро — мой основной способ телепортации, всегда очень полезно знать, что происходит в его подземных недрах.
    Очень надеюсь на то, что идея будет развиваться и дальше, а может и найдёт себе инвесторов!


    1. dcoder_mm
      09.07.2016 14:45

      Спасибо! Сначала прочитал не «авторов», а «актеров» и немного удивился)


  1. BarrelRoll
    08.07.2016 15:11
    +1

    Идея отличная! По-хорошему это Яндекс.Метро с пушами и отрисовкой проблем сразу на карте. Также можно сделать учет этих проблем при построении маршрута.


    1. slutsker
      08.07.2016 15:41

      Хорошая идея + можно сделать рекламный баннер и возможность отключить рекламу за 15 рублей. Это позволит получать небольшой доход на рассылку через смс шлюзы.


    1. dcoder_mm
      09.07.2016 14:46

      Да, как -то прицепится к я.метро было бы совсем прекрасно. В принципе у меня в мыслях уже давно есть локализация поломки + отрисовка на карте, но яндекс бы сразу дал много-много аудитории


  1. BarrelRoll
    08.07.2016 19:12

    На картинке вначале статьи во втором сообщении парсер сбился: "… москва движение неисправность поезд поломка".


    1. Irenica
      08.07.2016 19:47

      Это первые версии информера, тогда удаляли с хештегов символ #. Так что не ошибка


  1. and7ey
    08.07.2016 20:16

    У Департамента транспорта Москвы как раз пару дней назад свой бот в Telegram появился — https://telegram.me/DtRoad.
    О проблемах в метро сегодня сообщали, например.

    Интересно сравнить насколько ваш сервис более оперативен/полон :).


  1. Quicksdk
    09.07.2016 00:51
    +1

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