ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Метки статьи: ‘SIP’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Появилась задача, организовать конференции в Asterisk.

Все кажется просто, поправить два конфига и вуаля, но на деле все оказалось не просто.

Читаем инструкцию Asterisk cmd MeetMe. Пробуем, получаем облом. Не работает. Почему ? Расскажу как было у меня:

посмотрим, что у нас в подгруженных в Asterisk модулях, для этого зайдем в его CLI:

/usr/local/sbin/asterisk -r

и выполним команду show modules:

Asterisk 1.4.23.1, Copyright (C) 1999 — 2008 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type ‘core show warranty’ for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type ‘core show license’ for details.
=========================================================================
Connected to Asterisk 1.4.23.1 currently running on core (pid = 13061)

aster*CLI> show modules

у себя я обнаружил, что модуля app_meetme.so в списке нету….

можно выполнить и более предметную команду:

aster*CLI> module show like app_meetme

а в логах честно об этом написано:

pbx_extension_helper: No application ‘MeetMe’

Начинаем гуглить и копать. Выясняется, что для того, чтобы был этот модуль нужно собрать zaptel

Ну чтож… идем в порт asterisk`а, делаем:

  1. cd /usr/ports/net/asterisk
  2. make rmconfig
  3. make

выбираем в списке zaptel и после мейка делаем:

make install

в /usr/local/etc/rc.d появляется файл zaptel:

/usr/local/etc/rc.d/zaptel

дописываем в /etc/rc.conf:

zaptel_enable=»YES»

запускаем:

/usr/local/etc/rc.d/zaptel start

после этого проверяем наличие загруженных модулей zaptel.ko и ztdummy.ko:

/sbin/kldstat

Id Refs Address Size Name
………………
3    5 0xc4fb9000 32000    zaptel.ko
…………………
14 1 0xc62a2000 2000 ztdummy.ko

если не подгрузилось, то они лежат тут: /usr/local/lib/zaptel, подгрузите их руками.

проверяем, что в /usr/local/lib/asterisk/modules появился app_meetme.so.

открываем файл /usr/local/etc/asterisk/modules.conf и добавляем:

load => app_meetme.so

открываем /usr/local/etc/asterisk/meetme.conf и добавляем конференцию:

conf => 501

открываем /usr/local/etc/asterisk/extensions.conf и добавляем экстенш для того, что бы попадать в эту конференцию:

exten => 501,1,MeetMe(501)

т.е. при звонке на внутренний номер 501 мы должны попадать в конференцию с номером 501.

да, замечу, что номер exten и номер конференции могут не совпадать.

Ну чтож, вроде все хорошо и здорово, перезапускаем asterisk:

/usr/local/etc/rc.d/asterisk restart

звоним на номер 501 и слышим: «В настоящий момент вы единственный в этой конференции» и трубка вешается (происходит Hangup)

как говориться «приехали»…..

смотрим в логи и видим:

app_meetme.c:800 build_conf: Unable to open pseudo device

начинаем гуглить и толком ничего не находим. Кто-то так и не смог решить проблему, кто-то ремил куски кода в исходках.

Что бы мы не делали, тока менялись ошибки:

app_meetme.c:1022 conf_run: Unable to set flags: Inappropriate ioctl for device

или

app_meetme.c:1756 conf_run: Unable to set buffering information: Bad file descriptor

или

app_meetme.c:1777 conf_run: Error getting conference

или

app_meetme.c: Unable to set flags: Inappropriate ioctl for device

Вот последнее что удалось добиться:

WARNING[4670] app_meetme.c: Unable to set flags: Inappropriate ioctl for device
WARNING[4670] app_meetme.c: Unable to set buffering information: Bad file descriptor
WARNING[4670] app_meetme.c: Unable to set linear mode: Bad file descriptor
WARNING[4670] app_meetme.c: Error getting conference
WARNING[4670] app_meetme.c: Error setting conference
WARNING[4670] app_meetme.c: Error flushing channel
WARNING[4670] app_meetme.c: Failed to read frame: Bad file descriptor

конференция так и не заработала…

Изрядно подустав от этого дела, мы обнаружили что существует альтернатива для app_meetme.so и это app_conference.so.

Читаем Asterisk cmd Conference

Приступаем к инсталлу:

  1. cd /usr/ports/net/asterisk
  2. make extract
  3. cd work/asterisk-1.4.23.1
  4. fetch http://dfn.dl.sourceforge.net/sourceforge/appconference/appconference-2.0.1.tar.gz
  5. tar -zxf appconference-2.0.1.tar.gz
  6. cd appconference-2.0.1
  7. Правим файл Makefile, вот diff:
    --- Makefile    2008-02-26 19:05:57.000000000 +0300
    +++ Makefile.new        2009-02-10 21:03:09.000000000 +0300
    @@ -18,9 +18,9 @@
    #
    
    INSTALL_PREFIX :=
    -INSTALL_MODULES_DIR := $(INSTALL_PREFIX)/usr/lib/asterisk/modules
    +INSTALL_MODULES_DIR := $(INSTALL_PREFIX)/usr/local/lib/asterisk/modules
    
    -ASTERISK_INCLUDE_DIR ?= ../asterisk/include
    +ASTERISK_INCLUDE_DIR ?= /usr/local/include
    
    REVISION = $(shell svnversion -n .)
  8. gmake
  9. gmake install

убеждаемся что файл app_conference.so появился в /usr/local/lib/asterisk/modules/

открываем файл /usr/local/etc/asterisk/modules.conf и добавляем:

load => app_conference

открываем /usr/local/etc/asterisk/extensions.conf и добавляем экстенш для того, что бы попадать в конференцию:

exten => 502,1,Conference(502)

перегружаем asterisk и убеждаемся что модуль подгружен:

aster*CLI> module show like app_conference

Module                         Description                              Use Count
app_conference.so              Channel Independent Conference Applicati 0
1 modules loaded

Основное отличие app_meetme.so и это app_conference.so в том что app_conference.so создает конференцию налету (on the fly) и не требует наличия zaptel.

Экстеншеном 502 мы попадаем в автоматом созданную конференцию 502.

И все РАБОТАЕТ !

Но app_conference.so не полный аналог app_meetme.so. Например не поставить PIN на вход или так же просто записать разговор в конференции. Эти вопросы можно решить с помощью самого asterisk 😉

о PIN: Asterisk cmd Conference в разделе » Setting up conferences».

запись разговора в конференции: Asterisk cmd Monitor

пример записи конференции, extensions.conf :

exten => 502,1,Answer
exten => 502,2,Wait(1)
exten => 502,3,Monitor(wav,myfilename)
exten => 502,4,Conference(502,ps)

Записанные файлы myfilename-in.wav и myfilename-out.wav будут лежать в /var/spool/asterisk/monitor/

Удачных вам конференций !

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 6, среднее: 4,50 из 5)
Загрузка...
Отправить на почту Отправить на почту

В качестве примера возьмем вариант с приветствием, 2-мя подменю (отдел продаж и тех. поддержки) и 3-мя попытками выбора.

При входящем звонке из города:

  1. Поднимаем трубку
  2. говорим приветствие
  3. нажмите 4-ре — отдел продаж
  4. нажмите 5 — отдел тех.поддержки

Выдержка из файла /usr/local/etc/asterisk/extensions.conf

[fromcity]
exten => s,1,Answer() ;Поднимаем трубку
exten => s,n,Background(hello) ;Запускаем приветствие
exten => s,n,Set(numTries=0) ;Выставляем кол-во попыток
exten => s,n(naberite),Background(naberite) ;Рассказываем о возможности набрать цифры 4 и 5
exten => s,n,WaitExten() ;Ждем ввода от пользователя
exten => 4,1,Goto(otdel-prodaj,s,1) ; Нажали 4-ре переходим на голосовое меню отдела продаж
exten => 5,1,Goto(supports,s,1) ;Нажали 5-ть — переходим на голосовое меню тех.подов
exten => i,1,Playback(pbx-invalid) ;Нажали не 4-ре и не 5-ть — говорим что ввод не верный
exten => i,n,Goto(s,naberite) ; Возвращаемся и повторяем сообщение о том какие кнопки можно нажимать
exten => t,1,Set(numTries=$[${numTries} + 1]) ; Увеличивает кол-во попыток на 1-цу при таймауте набора
exten => t,n,GotoIf($[«${numTries}» < «3»]?s|naberite) ;Пока кол-во потыток меньше 3-х повторяем сообщение о том какие кнопки можно нажимать
exten => t,n,Playback(bay) ;Кол-во попыток на таймаут израсходовано, прощаемся
exten => t,n,Hangup() ; Вешаем трубку

[otdel-prodaj]
exten => s,1,Playback(vi_nahodites_v_menu)
exten => s,n,Playback(otdela_prodag)
exten => s,n,Background(glavnoe_menu_nazmite_zvezdochka)
exten => s,n,Background(dlya_zaversheniya_nazmite_reshetka)
exten => s,n,WaitExten()
exten => *,1,Goto(fromcity,s,naberite)
;Нажали звездочку, выходим в главное меню
exten => #,1,Hangup() ;Нажали решетку — вешаем трубку
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(s,1)
exten => t,1,Playback(bay)
exten => t,n,Hangup()

[supports]
exten => s,1,Playback(vi_nahodites_v_menu)
exten => s,n,Playback(otdela_supportov)
exten => s,n,Background(glavnoe_menu_nazmite_zvezdochka)
exten => s,n,Background(dlya_zaversheniya_nazmite_reshetka)
exten => s,n,WaitExten()
exten => *,1,Goto(fromcity,s,naberite)
exten => #,1,Hangup()
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(s,1)
exten => t,1,Playback(bay)
exten => t,n,Hangup()

Вот так это работает. Вы можете создать ещё саб-менюхи.
В саб-менюхах (в примере это otdel-prodaj и supports) вы можете описывать новые саб-меню по нажаитию кнопок и т.д.

Главное чтобы саб-меню выступали как отдельные экстеншены.

Немаловажно помнить о том, что при проигрывании сообщения с помощью функции Playback нажатие каких либо клавиш игнорируются, «прослушка» нажатия клавиши от пользователя ТОЛЬКО при использовании функции Background.

Как записать сами голосовые файлы ?

Вариантов как минимум два:

  1. С помощью самого сервера Asterisk c помощью функции Record, сделать экстеншн (exten) под это дело.
    Пример:

    exten => 1111,1,Set(TIME="${STRFTIME(${EPOCH},,%C%y-%m-%d_%H-%M-%S)}")
    exten => 1111,n,Playback(beep)
    exten => 1111,n,Record(/usr/local/share/asterisk/sounds/record%d_${TIME}.gsm)
    exten => 1111,n,Playback(${RECORDED_FILE})
    exten => 1111,n,Hangup()

    записанный файл будет сохранен в директории /usr/local/share/asterisk/sounds/ и иметь название формата record_НОМЕР_ВРЕМЯ.gsm
    (или ещё вариант: такая возможность реализована в веб-интерфейсе asterisk-gui -> в FreeBSD /usr/ports/www/asterisk-gui -> сайт http://www.asterisknow.org/)

  2. Записать с помощью Windows recorder («Пуск»-«Программы»-«Стандартные» — «Развлечения и звукозапись»), выбираем параметры записи: Формат PCM, Mono, 8bit

Если вы записали файлы вторым способом, то для того чтобы Asterisk «понял» их необходимо перекодировать в формат gsm.

Это можно сделать утилитой sox (в FreeBSD /usr/ports/audio/sox)

sox input.wav -r 8000 -c 1 output.gsm resample -ql

если версия sox 14.3.0:

sox input.wav -r 8k -c 1 -e gsm output.gsm

где input.wav — записанный вами в Windows файл

output.gsm — файл для Asterisk на выходе, его потом нужно разместить в /usr/local/share/asterisk/sounds/

«Нарезать» wav файлы удобно с помощью программы Audacity

При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 12, среднее: 4,67 из 5)
Загрузка...
Отправить на почту Отправить на почту

ether0.0 — Интерфейс Addpac смотрящий в ethernet сеть

192.168.1.77 — Шлюз и сервер Asterisk

192.168.1.10 — IP-адрес Addpac

7777 — внутренний номер для телефонного аппарата за Addpac

access-list 30 — Аксесс лист для ограниченя доступа к Addpac

Вот как будет выглядеть show run в минимальной конфигурации для совершения звонков и их принятия:

!
version 8.23H
!
hostname addpac-test
!
!
no bridge spanning-tree
!
access-list 30 permit ip host 192.168.1.77 host 192.168.1.10
!
!
ip-share enable
ip-share interface net-side ether0.0
ip-share interface local-side ether1.0
!
interface ether0.0
ip address 192.168.1.10 255.255.255.0
ip access-group 30 in
!
interface ether1.0
no ip address
shutdown
!
snmp name AP200B
!
no arp reset
!
route 0.0.0.0 0.0.0.0 192.168.1.77
!
no service ftpd
no service httpd
!
!
!
!
!
! VoIP configuration.
!
!
! Voice service voip configuration.
!
voice service voip
fax protocol t38 redundancy 0
fax rate 9600
h323 call start fast
h323 call tunnel enable
timeout tidt 5
busyout monitor gatekeeper
no busyout monitor callagent
busyout monitor voip-interface
!
!
! Voice port configuration.
!
! FXS
voice-port 0/0
description 2_Telephone-(AOH-7777)
!
!
! FXS
voice-port 0/1
!
!
!
!
! Pots peer configuration.
!
dial-peer voice 3 pots
destination-pattern 7777
port 0/0
!
!
!
! Voip peer configuration.
!
dial-peer voice 2 voip
destination-pattern .T
session target 192.168.1.77
session protocol sip
codec g711alaw
dtmf-relay rtp-2833
no vad
description 2_Asterisk_server
!
!
!
!
!
!
! Gateway configuration.
!
gateway
h323-id voip.192.168.1.10
no ignore-msg-from-other-gk
!
!
! SIP UA configuration.
!
sip-ua
!
!
! MGCP configuration.
!
mgcp
codec g711ulaw
!
!
! Tones
!
!
!
!

Asterisk

sip.conf:

[adpak]
context=default
type=peer
host=192.168.1.10
port=5060
canreinvite=yes
reinvite=yes
disallow=all
allow = alaw
deny=0.0.0.0/0
permit=192.168.1.10/32
insecure=invite

[7777]
#Для исходящих звонков
callerid=Office phone
type=friend
call-limit=1
context=default
host=192.168.1.10
reinvite=no
canreinvite=no
disallow=all
allow = alaw

extensions.conf:

[default]
exten => 7777,1,Dial(SIP/7777@adpak,60,r)

Ссылки:

При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы:
Панфилов Алексей (lehis (at) subnets.ru)
Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (Еще не голосовали)
Загрузка...
Отправить на почту Отправить на почту