Карточная IVR система на базе Cisco
Материал из BiTel WiKi
Содержание |
Карточки
У пользователя есть карточка на карточке напечатан номер карточки и пинкод. есть 3 основных сервиса
- dialup
- голос
- пополнение баланса (через веб интерфейс)
Dialup
с диалапом все тривиально и довольно подробно описано в инструкции, ни какх сложностей возникнуть не должно.
В качестве логина пользователь использует номер карточки и в качестве пароля пин-код.
Голос
С голосом все много сложнее, так как обычно карточные платформу авторизуют пользователя только по пинкоду а не по паре логин-пароль. Стандартный сиськовский IVR скрипт http://www.cisco.com/cgi-bin/Software/Tablebuild/doftp.pl?ftpfile=/cisco/access/tclware/app-debitcard-nlp.2.0.1.7.zip разбивает введеный код на 2 части первую отправляет в радиус атрибуте User-Name а вторую в Password. Для работы в БГ это совсем не подходит. Мы вышли из положения поправив скрипт так, что бы он отправлял в поле Password весь набраный пинкод, затем в скрипте предобработки для НАС мы ищем соответствующию карточку и добавляем атрибут User-Name в радиус запрос с номером этой карточки.
import java.sql.*; import java.util.*; if( "".equals(request.getStringAttribute(1)) || request.getStringAttribute(1)==null) { try { PreparedStatement ps = con.prepareStatement("select card_code from card_data_"+setup.getIntValue("card.module.id", 0)+ " where card_pin_code = ? and status > 0 order by date1 desc"); ps.setString(1, request.getStringAttribute(2)); ResultSet rs = ps.executeQuery(); if(rs.next()) { request.setStringAttribute(1, String.valueOf(rs.getInt(1))); } } catch(Exception e) { throw new RuntimeException(e); } }
если поле User-Name (код радиус атрибута = 1) пустое или если атрибута User-Name нет в запросе, то мы ищем все карточки которые в продаже или активированы (status>0) и пинкод совпадает с переданым в поле Password (код радиус атрибута = 2). Если карточек несколько то мы берем карточку с наиболее поздней датой начала действия (order by date1 desc). Так как в продаже и активированых карточек довольно мало то вероятность пересечения пинкодов крайне мала и ее можно полностью устранить при генерации карточек если использовать для нее не BGCardGen.
Конфигурация IVR на Cisco
создаем радиус группу для сервера БГ и говорим использовать ее для bg-card
aaa group server radius BG-VOIP server xx.xx.xx.xx auth-port 1912 acct-port 1913 aaa authorization exec bg-card group BG-VOIP aaa accounting connection bg-card start-stop group BG-VOIP
задаем параметры для h323 (запрещаем nte и типы используемых кодеков)
voice service voip fax protocol t38 ls-redundancy 0 hs-redundancy 0 fallback none h323 h225 timeout tcp call-idle value 5 h225 timeout setup 30 session transport tcp calls-per-connection 1 h245 caps suppress nte voice class codec 3 codec preference 1 g729r8 codec preference 2 g729br8
класс авторизации которым будет пользоватся наши карточки, все идет через bg-card определенный выше
voice class aaa 2 authentication method bg-card authorization method bg-card accounting method bg-card
использовать адрес на интерфейсе Loopback1 для всех радиус запросов, отправлять заданные атрибуты, ключ для радиус сервера, и отправлять VSA атрибуты (Vendor Specific Attributes).
ip radius source-interface Loopback1 radius-server attribute 44 include-in-access-req radius-server attribute 8 include-in-access-req radius-server attribute 55 include-in-acct-req radius-server attribute nas-port format e UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU radius-server host xx.xx.xx.xx auth-port 1912 acct-port 1913 non-standard key XXXX radius-server unique-ident 19 radius-server vsa send accounting radius-server vsa send authentication
создаем наше IVR приложение и задаем ему параметры, длинну пин кода, номер оператора куда перенаправлять звонки, язык, откуда брать звуковые приглашения.
call application voice bg-card2 tftp://xx.xx.xx.xx/ivr/bg-card2.tcl call application voice bg-card2 call-setup-retry-count 3 call application voice bg-card2 local-prefix 73952 call application voice bg-card2 uid-len 6 call application voice bg-card2 pin-len 10 call application voice bg-card2 redirect-number 73952555001 call application voice bg-card2 language 1 ru call application voice bg-card2 set-location ru 0 tftp://xx.xx.xx.xx/ivr/prompts/ call application cache reload time 600
конфигурируем PRI E1
controller E1 1/0 pri-group timeslots 1-31 ! interface Serial1/0:15 no ip address encapsulation hdlc isdn switch-type primary-net5 isdn not-end-to-end 64 isdn incoming-voice modem 64 isdn calling-party-num network-provided isdn T303 6000 isdn T306 40000 isdn T310 55000 isdn send-alerting isdn negotiate-bchan resend-setup cause-code 34 44 47 102 isdn bchan-number-order ascending isdn sending-complete isdn reject data isdn reject v120 isdn reject v110 isdn reject piafs no isdn gtd no keepalive no fair-queue no cdp enable
проавила преобразования номеров из ТФОП в E.164. При входящих звонках нужно преобразовывать АОН при исходящих звонках подставлять АОН из диапазона разрешенных на этом E1 иначе ТФОП не примет вызов. Обычно в России приходит либо телефон без кода города либо 10 цифр (полный номер без 8ки), так как у нас номера 6-ти значные то при звонках из области бывает что приходит 7ми значный номер без кода зоны/города.
voice translation-rule 2 rule 1 /^395\(.*\)/ /7\0/ type any unknown plan any unknown rule 2 /^2....../ /7395\0/ type any unknown plan any unknown rule 3 /^$/ /73952/ type any unknown plan any unknown rule 4 /^..........$/ /7\0/ ! voice translation-rule 3 rule 1 /^.*/ /2555000/ ! voice translation-profile from_pstn translate calling 2 voice translation-profile to_pstn translate calling 3
конфигурим голосовой порт с этими параметрами
voice-port 1/0:D translation-profile incoming from_pstn translation-profile outgoing to_pstn output attenuation 1 voicecap configure echo4 echo-cancel coverage 64 cptone RU timeouts interdigit 7 timeouts call-disconnect 3 timeouts ringing 60 timeouts wait-release 4 music-threshold -49 bearer-cap Speech
диалпир для исходящих звонков
dial-peer voice 1 pots tone ringback alert-no-PI huntstop destination-pattern 73952[2-7,9].....$ progress_ind setup enable 3 progress_ind alert enable 8 progress_ind progress enable 8 progress_ind disconnect enable 8 forward-digits 6 port 1/0:D
диалпир для карточной платформы (срабатывает при звонке на 555000), привязан к радиус класу bg-card
dial-peer voice 2 pots application bg-card2 incoming called-number 555000 voice-class aaa 2
диал пиры для исходящих voip звонков. У нас все звонки идут сначала на MVTS который делает трансляцию из Российского номерного плана в E.164 и скрипт делает звонки согласно Российскому номерному плану, если нужно звонить напрямую то лучше в скрипте преобразовать номер в E.164 и использовать его.
dial-peer voice 8 voip tone ringback alert-no-PI translation-profile outgoing non-local huntstop destination-pattern 8[0,3-9]......... progress_ind setup enable 3 progress_ind alert enable 8 voice-class codec 3 session target dns:voip.provider.net dtmf-relay h245-signal h245-alphanumeric fax-relay ecm disable fax rate 14400 fax nsf 000000 no vad ! dial-peer voice 810 voip tone ringback alert-no-PI translation-profile outgoing non-local huntstop destination-pattern 810T progress_ind setup enable 3 progress_ind alert enable 8 voice-class codec 3 session target dns:voip.provider.net dtmf-relay h245-signal h245-alphanumeric fax-relay ecm disable fax rate 14400 fax nsf 000000 no vad ! dial-peer no-match disconnect-cause 1
Дополнительные функции
базовый TCL скрипт app_debitcard от Cisco умеет только спросить пинкод, номер по кторому хотелось бы позвонить и сделать звонок. Для современной карточной платформы этого не достаточно. Поэтому были реализованы различные дополнительные функции. Для всех для них нужна поддержка на стороне радиус сервера. В БГ это реализовано через скрипт события "RADIUS аутентификация" этот скрипт привязывается ко всем карточным договорам через шаблон договора.
данные передаются между БГ и IVR приложением через VSA аттрибуты h323-ivr-out и h323-ivr-in
информация по карточке
баланс, срок окончания действия, действующий тариф
повтор последнего набраного номера
авторизация по АОНу
позволяет пользователю входить в систему без ввода пинкода
пополнение баланса
позволяет пользователю пополнить баланс другой карточкой