Примерно год назад мы запустили свой маленький проект с оповещениями о поломках Московского метро.
Самой главной проблемой в нем оказалась рассылка смс. Мы не ожидали, что проект понравится и у нас будет 1500+ регистраций. В самом лучшем случае мы расчитывали человек на 300. Этим мы были приятно удивлены.
Проблема с смс в первую очередь была из-за цены. Одна рассылка получалась примерно 3000 рублей. С учетом того, что цена 1 смс 1,5 рубля. Были времена, когда неполадки в движением поездов были каждые 3 дня, т.е. 10 поломок в месяц. 3000*10 = 30 000 рублей. Дороговато для проекта, который не финансируется.
Тут мы начали изобретать велосипед. А именно, искать тарифы с действительно безлимитными смс. В итоге мы его нашли. Стоило что-то около 600 рублей в месяц. Дальше нужно было решить вопрос с отправкой смс. И тут пришло время древней nokia 6610i, которая пылилась в шкафу как память о былой эпохе. Но ее пришлось чуть доработать, а именно подключить по uart к ноуту, чтобы отправлять задания.
Схема
Пара диодов тут нужна чтобы сбросить напряжение с 5V до ~3.4V. Падение на диодах суммарно получается 1.6V при тока 1А. Такой ток нокия потребляет только при активной работе с сетью, а большую часть времени падение на них будет около 1.5V.
Большой и толстый конденсатор нужен чтобы сглаживать потребление телефона в тот момент когда работает передатчик, и он много жрет.
А резисторы — заменяют терморезистор и пин идентификации батарейки (BSI), по которому nokia понимает что к ней подключен аккумулятор.
У нас подходящих номиналов резисторов не нашлось, поэтому собрали из того что было.
Для отправки использовалась программа 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)
roboter
08.07.2016 08:32+1есть модули GSM которые, стоят дёшево, те же RX TX, и AT команды,
sim800l например https://www.youtube.com/watch?v=Hm41vcG_hkA
старые телефоны это хорошо, но нужна и повторяемость
модулей же можно взять 10 штук и распаралелитьIrenica
08.07.2016 09:02+2Проблема не в телефонах. Операторы банят за рассылку, приодится менять симки. Симки так же стоят денег + тариф. Возвращаемся примерно к тем же цифрам от которых отталкивались
Revertis
08.07.2016 09:42А за что они банят? Вы не можете донести до оператора то, что пользователи сами подписываются на эту рассылку, и юридически это уже не спам?
Irenica
08.07.2016 09:45Быстрая отправка походего текса считают как рассылку и более ничего иного услышать от них неудалось. Не спам, но рассылка же
and7ey
08.07.2016 20:12А разве имеют право? Не нарушают ли ваше право на переписку?
Irenica
08.07.2016 20:19Вот тут я не вкурсе, к сожалению
TsarIoann
09.07.2016 00:35+2Какие знакомые проблемы. В своём небольшом проекте тоже используем СМС и рассылаем с Android-аппарата (Xperia Ray старая была под рукой). К счастью, нужно в основном рассылать коды подтверждения регистрации и какие-то личные уведомления пользователям. Когда понадобилась массовая рассылка, то после примерно 1000-но СМС оператор заблокировал отправку СМС. Я написал в поддержку, объяснил им, что я не нарушаю никакой закон: все мои клиенты давали согласие на получение такого рода СМС. У меня уточнили паспортные данные (на кого зарегистрирована симка) и включили отправку. Дали пояснения, что она была заблокирована в автоматическом режиме.
P.S. Оператор — Yota. Там удобно, что безлимитные СМС. И поддержка отвечает быстро.
dcoder_mm
09.07.2016 14:39ТП говорила что блокирует служба безопастности пчелайна. Скорее всего там что-нибудь автоматическое стоит. Характерно, что когда мы меняли текст и рассылали 10 похожих вариантов одного и того-же сообщения, жило несколько дольше.
pengyou
08.07.2016 08:41+1Мы тоже, в своё время, столкнулись с проблемой каштомного рассылателя СМС, для которого использовали легендарный Huawei E1550. Всё таки канал связи выделяемый для одного абонента не подходит для массовой рассылки.
Для production конечно лучше использовать непосредственно интернет-шлюз СМС от какого-нибудь оператора или же один из многочисленных сервисов по массовой рассылке смс, которые предлагают гибкие тарифы, причём прогрессивные, чем больше СМС отправляете, тем дешевле каждое.
cry_san
08.07.2016 08:44-3Помню раньше были сервисы для бесплатной отправки СМС. Причем даже на официальных сайтах МТС и Билайна.
Если они еще остались, то проблем с отправкой бесплатной смс вообще не вижу.Irenica
08.07.2016 09:00Их очень сильно обрезали — чутьли не флешевая капча, подтверждение по смс на номер с таким же оператом с которого отправляешь. Совсем не вариант
Alexashka
08.07.2016 09:03Там был приличный временной интервал между сообщениями и ограничение на число сообщений.
bopoh13
08.07.2016 11:00В ЛК МТС можно заблокировать рассылку с сайта. У меня давно функция включена.
Может поискать какого-нибудь виртуального оператора?
dkv
08.07.2016 13:17Десять лет назад почти во всех регионах у операторов были email-шлюзы, позволяющие отправлять смски через отправку простого письма электронной почтой либо легковесные формы на сайтах без каптч для тех же целей. Даже приложение под j2me соответствующее писал (SMS Send), упрощающее этот процесс для обычных юзеров на их мобилках. Последнее живое подтверждение работоспособности приложения, найденное в сети, датируется 2012-м годом. А по факту с 2008-го года начались отключения шлюзов. Думаю, сейчас проще всё пушами юзерам отправлять и не вспоминать вообще об смс.
gensbest
08.07.2016 09:05+2Обычный GSM USB модем прекрасно рассылает СМС.
dcoder_mm
08.07.2016 09:06Модема не было, зато были нокии. А если нет разницы… :)
nevzorofff
08.07.2016 09:15Модемы на авито чуть ли не по 100рублей, а время, потраченное на подключение нокии по юарту да пайку ей источника питания тоже стоит денег.
Cawqa
08.07.2016 09:47-4Почему все последнее время считают деньги? Почему не сделать это все Just for fun или же из любопытства ради?
Irenica
08.07.2016 09:48+5Оно так и было изначально just for fun — нас было человек 20 на смс рассылке. А потом появились люди, которые тоже хотят получать наши уведомления. Вот и упирается весь fun в стоимость
marsianin
08.07.2016 09:40А Viber или Skype не планируется?
Irenica
08.07.2016 09:44У Viber закрытое API, поэтому с ним не получается. Вот как спам там рассылают мы еще не осознали. Со скайпом все гораздо проще, но вопрос есть ли у skype что-то наподобии канала и не банят ли за рассылки. Мне к примеру, никогда не приходил спам с неавторизов
marsianin
08.07.2016 09:48У скайпа есть групповые чаты. Я не уверен, что это то, что нужно, но, возможно, стоит посмотреть на них.
Irenica
08.07.2016 09:50Там может писать каждый и это уже не совсем тот формат, что нужно. Может быть информативнее, но из-за количества сообщений от участников что-то увидеть вовремя будет сложно
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
monah_tuk
11.07.2016 13:56В групповом чате скайпа лимит на 100 собеседников. По крайней мере был раньше. Хотя… вряд ли в этом направлении что-то сменилось.
Moskus
08.07.2016 17:53+1Собственно, вполне официально
and7ey
08.07.2016 20:20Не советую делать ботов для Skype. Мой бот «опубликовали» (т.е., перейдя по ссылке, им теперь может пользоваться неограниченное количество пользователей, у неопубликованных — только 50), а вот разместить в directory отказались, никакой причины не назвали, правил у них никаких нет, ответы от них ждешь по несколько недель.
Moskus
08.07.2016 22:10Я никаких ботов создавать не собираюсь — всего лишь дал ссылку на официальное упоминание такой возможности.
Cawqa
08.07.2016 09:49Мне кажется немного людей пользуются Skype в метро, во всяком случае это моя догадка.
Irenica
08.07.2016 09:54Всетаки кажется skype скорее рабочий мессенджер, чем для личных уведомлений
vandalns
08.07.2016 12:37Телеграм самое то. Скайп неудобен, тем более в смартфоне (энерго и ресурсопотребление знаете ли), у вайбера закрытый код (рассылка, скорее всего, через саму службу).
Подписался на канал) Спасибо за труд!
ilyaplot
08.07.2016 10:03+1Возможно, стоит пообщаться с оператором по поводу предоставления smpp, например? Не знаю, возможно ли это, но стоит предоставить оператору подтверждение того, что абоненты, которым отправляется sms, дали согласие на их получение. И есть же Push
maiketa
08.07.2016 10:08Если вам интересно делать рассылку на большое количество пользователей в короткое время, то обратите внимание на SMPP протокол не требующий ни симок ни телефона.
Jasmin SMS Gateway например, позволяет отослать 1000 смс за 10 сек.
SMPP предлагает любой агрегатор и все операторы, цена смс начинается от 0,45р и падает в зависимости от обьемов.
alm
08.07.2016 10:31+1Извините за рекламу, но вот ребята сделали уже давно. Отправляешь со своего телефона/телефонов по своим тарифам/пакетам смс. Расширяемость до бесконечности имхо. Можно купить на втором андроиде телефон менее, чем за тысячу и всё.
И велосипед не нужен ;)Rastishka
10.07.2016 18:01Ох, спасибо за полезный сервис, очень вовремя.
У вас есть опыт использования этого сервиса в боевом режиме?
al322se
08.07.2016 10:42+1А почему просто не запилить приложения для Android,IOS,WinPhone?
ad1Dima
08.07.2016 10:46Сдается мне, что бота для телеграм поддерживать дешевле. По надежности доставки сообщения получается то же самое. Хотя нормальные СМС надежнее.
dcoder_mm
09.07.2016 14:44Приложение поставит меньше людей, чем оставят телефон / подпишутся на бота / etc. Впрочем с приложением открываются гораздо более интересные возможности
idg_chernyshov
08.07.2016 11:10+1Интересный проект, но почему не написать простенькое приложение для Android и использовать для рассылки GCM у них на сколько я помню нет ограничения на количество сообщений?
Kondra007
08.07.2016 11:27+1И при этом можно гибко настраивать категории получаемых сообщений (аварии, события, новые станции)
Irenica
08.07.2016 11:35Попробуем реализовать
Rastishka
10.07.2016 18:06+1В качестве прототипа можно использовать это приложение https://play.google.com/store/apps/details?id=eu.apksoft.android.smsgateway
В комментах пишут что у него есть проблема с длинными сообщениями, но в плане интерфейса и настроек можно взять за образец.
VLT
08.07.2016 12:33Жму вам руку — задумывал похожий проект — пришел к тому же к чему пришли и вы. И телефон и телеграм все было ) Спасибо за статью было полезно почитать!
monah_tuk
11.07.2016 14:02Не только вы :)
Вот от меня: http://htrd.su/wiki/proekty/sms_notification_system_sns/start
Правда ссылки убились, не следил. Но где-то локально должно сохраниться. Там трудился Siemens ME45 ;-) с питанием подвешенным на датакабель.
1win1
08.07.2016 13:14+1Давно подписан на рассылки проекта, и хочу поблагодарить авторов (Irenica & dcoder_mm) за их труд! Так как метро — мой основной способ телепортации, всегда очень полезно знать, что происходит в его подземных недрах.
Очень надеюсь на то, что идея будет развиваться и дальше, а может и найдёт себе инвесторов!
BarrelRoll
08.07.2016 15:11+1Идея отличная! По-хорошему это Яндекс.Метро с пушами и отрисовкой проблем сразу на карте. Также можно сделать учет этих проблем при построении маршрута.
slutsker
08.07.2016 15:41Хорошая идея + можно сделать рекламный баннер и возможность отключить рекламу за 15 рублей. Это позволит получать небольшой доход на рассылку через смс шлюзы.
dcoder_mm
09.07.2016 14:46Да, как -то прицепится к я.метро было бы совсем прекрасно. В принципе у меня в мыслях уже давно есть локализация поломки + отрисовка на карте, но яндекс бы сразу дал много-много аудитории
BarrelRoll
08.07.2016 19:12На картинке вначале статьи во втором сообщении парсер сбился: "… москва движение неисправность поезд поломка".
Irenica
08.07.2016 19:47Это первые версии информера, тогда удаляли с хештегов символ #. Так что не ошибка
and7ey
08.07.2016 20:16У Департамента транспорта Москвы как раз пару дней назад свой бот в Telegram появился — https://telegram.me/DtRoad.
О проблемах в метро сегодня сообщали, например.
Интересно сравнить насколько ваш сервис более оперативен/полон :).
Quicksdk
09.07.2016 00:51+1Вообще говоря, есть очень бюджетный вариант, это push уведомления напрямую на браузеры телефонов-ваших подписчиков (Chrome, Safari). Да и тот же бот телеграм так же снимает нагрузку на SMS-рассылку.
x88
Почему бы не использовать сервис по рассылке?
nevzorofff
Потому что одна смс 1,5 рубля, о чём было написано.
Xalium
и сколько по цене обойдется в месяц рассылка ~20,000 смс? Точно намного больше 1000 руб.