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

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

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

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

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

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

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

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

Пример:

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

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

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

Для хранения личных данных об операторе создадим таблицу 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. Почта info@voxlink.ru"  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. Почта - info@voxlink.ru"  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. Почта info@info.ru"  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.

 
avatar
  Подписаться  
Уведомление о

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

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

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

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

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices