Александр Мутовин
23.07.2019
4909

Отправка смс визитки по сервисному коду в момент разговора и в режиме ожидания звонка.

В этой статье мы рассмотрим отправку смс визиток с телефонной станции Asterisk по средством сервисных кодов. Задача состоит из нескольких пунктов: Отправка смс визитки с личными данными сотрудника в момент разговора на номер собеседника. Отправка смс визитки компании в момент разговора на номер собеседника. Отправка смс визитки с личными данными во время ожидания вызова на […]

В этой статье мы рассмотрим отправку смс визиток с телефонной станции Asterisk по средством сервисных кодов. Задача состоит из нескольких пунктов:

  1. Отправка смс визитки с личными данными сотрудника в момент разговора на номер собеседника.
  2. Отправка смс визитки компании в момент разговора на номер собеседника.
  3. Отправка смс визитки с личными данными во время ожидания вызова на произвольный мобильный номер.
  4. Отправка смс визитки компании во время ожидания вызова на произвольный номер компании.
Все действия будут выполняться на операционной системе Centos6, установленным Asterisk 13  и Freepbx 13 версии

Для отправки смс сообщений будем использовать смс сервис smsc.ru.

Т.К. операторы разные, соответственно текст сообщений у нас будет разный. Для хранения текста смс сообщения будем использовать базу данных MySQL.

Первый тип сообщений будет такого характера: <ФИО сотрудника> — <Должность сотрудника>, <Мобильный номер телефона сотрудника>. <Email сотрудника>. <Добавочный номер>

Пример:

Мутовин Александр – Заместитель директора фирмы «рога и копыта». Телефон +7-980-332-7580. Email [email protected]

Второй тип сообщений следующий:

ООО «Рога и копыта». Сайт roga-kopita.ru. Телефон 7 (495)-777-77-77. Почта [email protected]

Для хранения личных данных об операторе создадим таблицу Mysql в базе данных asteriskcdrdb со следующими полями:

Базу данных asteriskcdrdb будем использовать потому, что подключение к ней уже реализовано в Asterisk.
  1. exten varchar(7) – внутренний номер сотрудника
  2. email varchar(40) – email адрес сотрудника
  3. did varchar(15) – Внешний номер коспании или личный мобильный сотрудника
  4. name varchar(40) – ФИО сотрудника
  5. position varchar(150) – Должность сотрудника.
Varchar(n) – символьный тип данных, где n – количество символов плюс 1.

Приступим к созданию таблицы.

Если у вас установлен Freepbx, то можно данные подключения к MySQL вывести следующей командой:

# cat /etc/freepbx.conf
Данные для подключения к базе данных MySQL

Где:

 «AMPDBUSER» — логин

«AMPDBPASS» — пароль от пользователя.

Подключаемся к базе данных:

# mysql -u freepbxuser -p08a29b0a983e13b44af92bec814a7a8f

Далее переходим в базу данных asteriskcdrdb:

# use asteriskcdrdb;

После чего мы попадем в нашу базу данных.

Подключение к базе данных asteriskcdrdb

Следующим шагом необходимо создать таблицу:

# CREATE TABLE send_sms (exten varchar(7), email varchar(40), did varchar(15), name varchar(40),position varchar(150));
Создание таблицы в базе данных

Как видно из скриншота, таблица была создана успешно.

На следующем шаге необходимо заполнить базу данных данными. Можно занести все данные вручную через консоль, но это будет долго и не удобно.  Мы сформируем данные в текстовом редакторе notepad++ и после чего сделаем импорт данных в таблицу.

Сформированная база сотрудников
Данные должны быть в той последовательности, в которой указаны поля в базе данных

Далее сохраняем файл и закачиваем его на сервер по пути:

# /var/lib/mysql/asteriskcdrdb

После чего делаем импорт данных из консоли MySQL.

# LOAD DATA INFILE 'data1.txt' INTO TABLE send_sms  FIELDS TERMINATED BY ',';
Загрузка данных в таблицу
FIELDS TERMINATED BY ‘,’ – означает разделитель между значениями полея запятая.

Посмотрим что получилось:

# select * from send_sms;
Проверка заполнения таблицы

Для отправки смс сообщения в момент разговора необходимо настроить фьючер коды. Они прописываются в файле /etc/asterisk/features_applicationmap_custom.conf.

Пропишем туда следующие строки:

sendsms => *68,self,Gosub(send_sms_features,s,1)
sendsms2 => *69,self,Gosub(send_sms_features2,s,1)

Где sendsms и sendsms2 – название фьючеркода

*68 и *69 – сам сервисный код, который набирается на телефоне для отправки смс сообщения.

Self – выполнить приложение в канале активировавшем функцию.

Gosub(send_sms_features,s,1) выполнить диалплан send_sms_features,s,1, после чего вернуться обратно  в исходный контекст.

Далее для активации этих сервисных кнопок необходимо объявить их в глобальной переменной в файле /etc/asterisk/globals.conf

[send_sms_features]
exten => s,1,DumpChan()
same => n,GotoIf($[ ${LEN(${DYNAMIC_WHO_ACTIVATED})} > 18]?end)
same => n,NoOp(${DYNAMIC_WHO_ACTIVATED}==================!!!!!!!!!!!!!!!!!!!)
same => n,GotoIf($[${EXISTS(${REALCALLERIDNUM})}]]?next:trunk)
same => n(next),NoOp(${LEN(${DYNAMIC_WHO_ACTIVATED})}==================!!!!!!!!!!!!!!!!!!!)
same => n,Set(NUMBER=7${DIAL_NUMBER:-10})
same => n,Gotoif($[ ${NUMBER:1:-9} = 9])?send:end)
same => n(send),SET(email=${ODBC_sms_email(${FROMEXTEN})})
same => n,SET(did=${ODBC_sms_did(${FROMEXTEN})})
same => n,SET(name=${ODBC_sms_name(${FROMEXTEN})})
same => n,SET(position=${ODBC_sms_position(${FROMEXTEN})})
same => n,NoOp(${did})
same => n,GotoIf($["${did}" = ""])?end)
same => n,Noop("Сообщение отправлено")
same  => n,Set(res=${SHELL(curl -d "mes=${name} - ${position}. Телефон  %2B${did}. Email ${email}. Добавочный ${FROMEXTEN}"  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${NUMBER})})
same  =>n,NoOp(${res})
same => n,Goto(end)
same => n(trunk),Noop(${LEN(${DYNAMIC_WHO_ACTIVATED})}==================!!!!!!!!!!!!!!trunkkkk!!!!!)
same => n,NoOp(${CALLERID(num)})
same => n,SET(email=${ODBC_sms_email(${CALLERID(num)})})
same => n,SET(did=${ODBC_sms_did(${CALLERID(num)})})
same => n,SET(name=${ODBC_sms_name(${CALLERID(num)})})
same => n,SET(position=${ODBC_sms_position(${CALLERID(num)})})
same => n,NoOp(${name})
same => n,Noop(${email})
same => n,GotoIf($["${did}" = ""])?end)
same => n,Set(NUMBERTO=7${CONNECTEDLINE(number):-10})
same => n,Noop(${NUMBERTO:1:-9})
same => n,Gotoif($[ ${NUMBERTO:1:-9} = 9])?send-trunk:end)
same => n(send-trunk),Noop("Сообщение отправлено")
same  => n,Set(res=${SHELL(curl -d "mes=${name} - ${position}. Телефон  %2B${did}. Email ${email}. Добавочный ${CALLERID(num)}"  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${NUMBERTO})})
same => n(end),Return()
диалплан отправки первого типа сообщения.

Рассмотрим его более подробно:

  1. exten => s,1,DumpChan() – выводим переменные канала, необходимо для отладки
  2. same => n,GotoIf($[ ${LEN(${DYNAMIC_WHO_ACTIVATED})} > 18]?end) – проверяем кто активировал функцию, если активировал удаленный клиент, то ничего не делаем. Необходимо для защиты от несанкционированных рассылок сообщений.
  3. same => n,NoOp(${DYNAMIC_WHO_ACTIVATED}==================!!!!!!!!!!!!!!!!!!!) Выводим в консоль для отладки
  4. same => n,GotoIf($[${EXISTS(${REALCALLERIDNUM})}]]?next:trunk) Тут мы определяем был это входящий звонок или исходящий. От этого зависит какую переменную в дальнейшем использовать.
  5. same => n,Set(NUMBER=7${DIAL_NUMBER:-10}) – тут мы берем последние 10 цифр номера и прибавляем к ним 7. Необходимо для преобразования номера к общему одному виду.
  6. same => n,Gotoif($[ ${NUMBER:1:-9} = 9])?send:end) – проверяем, если вторая цифра начинается на 9, вероятнее всего номер является мобильным, соответственно отправка смс возможна, в противном случае завершаем выполнение диалплана.
  7. same => n(send),SET(email=${ODBC_sms_email(${FROMEXTEN})}) – извлекаем из базы данных email адрес сотрудника.
  8. same => n,SET(did=${ODBC_sms_did(${FROMEXTEN})}) – извлекаем из базы номер сотрудника.
  9. same => n,SET(name=${ODBC_sms_name(${FROMEXTEN})}) извлекаем из бызы имя сотрудника.
  10. same => n,SET(position=${ODBC_sms_position(${FROMEXTEN})}) – извлекаем из базы должность сотрудника
  11. same => n,NoOp(${did}) выводим в консольноме сотрудника
  12. same => n,GotoIf($[«${did}» = «»])?end) – если номера нет, то завершаем выполнение диалплана без отправки сообщения.
  13. same => n,Noop(«Сообщение отправлено») – выводим в консоль «Сообщение отправлено»
  14. same  => n,Set(res=${SHELL(curl -d «mes=${name} — ${position}. Телефон  %2B${did}. Email ${email}. Добавочный ${FROMEXTEN}»  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${NUMBER})}) – выполняем запрос на отправку сообщения и сохраняем результат выполнения в переменной.
  15. same  =>n,NoOp(${res}) – выводим результат отправки сообщения.
  16. same => n,Goto(end) завершаем диалплан.

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

Для того, чтобы выборка из базы данных работала необходимо добавить в файл /etc/asterisk/func_odbc.conf следующие параметры:

[sms_email]
dsn=asteriskcdrdb
readsql=select email from send_sms where exten=${ARG1}
[sms_did]
dsn=asteriskcdrdb
readsql=select did from send_sms where exten=${ARG1}
[sms_name]
dsn=asteriskcdrdb
readsql=select name from send_sms where exten=${ARG1}
[sms_position]
dsn=asteriskcdrdb
readsql=select position from send_sms where exten=${ARG1}
Настройка запросов выборки данных из MySQL

Где dsn=asteriskcdrdb — название базы данных.

Readsql – строка запроса, в которой переменная ${ARG1} содержит параметр поиска передаваемый из диалплана.

По аналогии добавим диалплан для отправки смс сообщения второго вида:

[send_sms_features2]
exten => s,1,DumpChan()
same => n,GotoIf($[ ${LEN(${DYNAMIC_WHO_ACTIVATED})} > 18]?end)
same => n,NoOp(${DYNAMIC_WHO_ACTIVATED}==================!!!!!!!!!!!!!!!!!!!)
same => n,GotoIf($[${EXISTS(${REALCALLERIDNUM})}]]?next:trunk)
same => n(next),NoOp(${LEN(${DYNAMIC_WHO_ACTIVATED})}==================!!!!!!!!!!!!!!!!!!!)
same => n,Set(NUMBER=7${DIAL_NUMBER:-10})
same => n,Gotoif($[ ${NUMBER:1:-9} = 9])?send:end)
same => n(send),Noop("Сообщение отправлено")
same  => n,Set(res=${SHELL(curl -d "mes=Рога и копыта. Сайт volxink.ru. Телефон – 8 495 258 17 91. Почта [email protected]"  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${NUMBER})})
same  =>n,NoOp(${res})
same => n,Goto(end)
same => n(trunk),Noop(${LEN(${DYNAMIC_WHO_ACTIVATED})}==================!!!!!!!!!!!!!!trunkkkk!!!!!)
same => n,Set(NUMBERTO=7${CONNECTEDLINE(number):-10})
same => n,Noop(${NUMBERTO:1:-9})
same => n,Gotoif($[ ${NUMBERTO:1:-9} = 9])?send-trunk:end)
same => n(send-trunk),Noop("Сообщение отправлено")
same  => n,Set(res=${SHELL(curl -d "mes=Рога и копыта. Сайт voxlink.ru. Телефон – 8 495 258 17 91. Почта - [email protected]"  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${NUMBERTO})})
same => n(end),Return()
Второй диалплан для отправки смс

При реализации этой части задачи в момент разговора с собеседником есть возможность отправить ему смс, при условии, что он звонит с мобильного телефона.

Далее необходимо сделать диалплан для отправки смс в режиме ожидания. Для этого в файле /etc/asterisk/extensions_custom.conf в разделе «[from-internal-custom]» пропишем следующий диалплан:

exten => _*20089XXXXXXXXX,1,Answer()
same  => n,Set(COUNT=1)
same  => n,Set(client=7${EXTEN:-10})
same  => n,Noop(${client})
same  => n,NoOp(${client:1:-9})
same => n,Wait(1)
same => n,GotoIf($[ ${client:1:-9} = 9])?send:end)
same => n(send),SET(email=${ODBC_sms_email(${CALLERID(num)})})
same => n,SET(did=${ODBC_sms_did(${CALLERID(num)})})
same => n,SET(name=${ODBC_sms_name(${CALLERID(num)})})
same => n,SET(position=${ODBC_sms_position(${CALLERID(num)})})
same => n,NoOp(${name})
same => n,NoOp(${position})
same  => n,Set(res=${SHELL(curl -d "mes=${name} - ${position}. Телефон %2B${did}. Email ${email}. Добавочный ${CALLERID(num)}"  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${client})})
same  => n,NoOp("Собщение отправлено")
same  => n,Noop(${res})
same  => n,Set(COUNT=$[${COUNT} + 1])
same  => n,PlayBack(custom/sms)
same  => n,GotoIf($["${COUNT}" > "1"]?end)
same  => n(end),Goto(macro-hangupcall,s,1);


exten => _*20189XXXXXXXXX,1,Answer()
same  => n,Set(COUNT=1)
same  => n,Set(client=7${EXTEN:-10})
same  => n,Noop(${client})
same  => n,NoOp(${client:1:-9})
same => n,Wait(1)
same => n,GotoIf($[ ${client:1:-9} = 9])?send:end)
same  => n(send),Set(res=${SHELL(curl -d "mes=Рога и копыта. Сайт voxlink.ru. Телефон – 8 495 258 17 22. Почта [email protected]"  https://smsc.ru/sys/send.php\?charset=utf-8\&login=voxlink\&psw=voxlink\&phones=${client})})
same  => n,NoOp("Собщение отправлено")
same  => n,Noop(${res})
same  => n,Set(COUNT=$[${COUNT} + 1])
same  => n,PlayBack(custom/sms)
same  => n,GotoIf($["${COUNT}" > "1"]?end)
same  => n(end),Goto(macro-hangupcall,s,1);
Отправка сообщения в режиме ожидания.

Для отправки смс визитки со своими личными данными сотрудник должен набрать на телефоне *200 далее мобильный номер на который будет отправлено сообщение. Диалплан проверит, если это номер мобильный, то сообщение будет отправлено. Если не мобильный телефон, то завершиться выполнение диалплана без отправки сообщения.

Также и с отправкой смс визитки компании. Сервисный номер для этого *201 далее номер мобильного телефона.

При отправки смс сообщения в консоли астериска увидим следующую информацию:

Set("SIP/10855-00001edb", "res=OK - 2 SMS, ID - 78824") in new stack
Лог в консоли астериска.

Следовательно сообщение отправлено удачно.

Таким образом мы можем интегрировать смс уведомления в телефонную станцию Asterisk.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

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

Безопасен в использовании.

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

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

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