Возникла немного нетипичная задачка - устроить людям вещание в интернете. Для этого можно использовать много средств, но мы будем использовать Flussonic - в бесплатной версии он умеет все, что нам надо. Запись - это дело десятое.
После долгих мучений и репозиториев был выбран дистрибутив Ubuntu Server 12.04.2 LTS.
Устанавливается крайне просто:
echo "deb http://binaries.erlang-solutions.com/debian precise contrib" >> /etc/apt/sources.list
echo "deb http://debian.erlyvideo.org binary/" >> /etc/apt/sources.list
wget -O - http://binaries.erlang-solutions.com/debian/erlang_solutions.asc | sudo apt-key add -
wget -q -O - http://debian.erlyvideo.org/binary/gpg.key | apt-key add -
apt-get update
apt-get -y install esl-erlang flussonic
Итак, источников вещания у нас 2.
1. IP-камера Axis 210 (Такое себе старье без H.264).
Будем вещать через RTSP. Ее надо перекодировать. Для этого будем использовать VLC
apt-get install vlc x264
VLC выкладывает http поток на свой порт 9090, оттуда его забирает Flussonic и отдает JwPlayer'у RTSP поток.
файл startvlc.sh
#!/bin/sh
TR='transcode{venc=x264{cabac=yes,bframes=0,keyint=125,qpmin=20,qpmax=50,ref=5,merange=24,mixed-refs=yes,direct=auto,me=umh,subme=7,trellis=2,weightb=yes,partitions=all,vbv-maxrate=920,vbv-bufsize=9000,ratetol=100.0,scenecut=60},vb=820,,width=720,height=576,hurry-up,audio-sync,deinterlace=yes,acodec=aac,aenc=avcodec{strict=-2},ab=64,channels=2,samplerate=48000}'
OUT="std{access=http,mux=ts{use-key-frames=1},dst=:9090}"
cvlc -vvvv rtsp://root:passw@CAMERA-IP/mpeg4/media.amp --intf dummy --sout '#'${TR}:${OUT}
echo "{stream, "vlc.ts", "tshttp://VLC-IP:9090/"}." >> /etc/flussonic/flussonic.conf
/etc/init.d/flussonic start
После этого в панели по адресу FLUSSONIC-IP:8080 убедимся, что поток виден и его можно посмотреть.
Примерный код для index.html
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js">
</script>
<script type="text/javascript">
var flashvars = {
file : "vlc.ts",
streamer:'rtmp://FLUSSONIC-IP:1935',
'rtmp.tunneling':false,
autostart: true
};
var paramObj = {allowScriptAccess : "always", allowFullScreen : "true", allowNetworking : "all"};
swfobject.embedSWF("http://FLUSSONIC-IP:8080/flu/jwplayer.swf", "video", 720, 576,
"10.3", "/flu/expressInstall.swf",
flashvars, paramObj, {name: "jwplayer"});
</script>
2. Adobe FLME.
Будем забирать по HDS (что бы это ни значило :) )
Тут немного проще, указываем FMLE в адресе сервера наш flussonic в виде
Адрес: rtmp://FLUSSONIC-IP/live
Поток: livestream
AFLME выкладывает RTMP поток на Flussonic, оттуда он рестримит по HDS плееру.
В панели по адресу FLUSSONIC-IP:8080 убедимся, что поток виден и его можно посмотреть.
Примерный код для index.html
<div id="video"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js">
</script>
<script type="text/javascript">
var flashvars = {
src : "http://FLUSSONIC-IP:8080/live/livestream/manifest.f4m",
autoPlay: true
};
var paramObj = {allowScriptAccess : "always", allowFullScreen : "true", allowNetworking : "all"};
swfobject.embedSWF("http://FLUSSONIC-IP:8080/flu/StrobeMediaPlayback.swf", "video", 720, 576,
"10.3", "/flu/expressInstall.swf",
flashvars, paramObj, {name: "StrobeMediaPlayback"});
</script>
Вообще, советую приобщиться к инструкциям на сервере проекта :) Для знающих людей они будут полезнее моих :)
Thursday, February 21, 2013
Wednesday, February 20, 2013
Экзотика с кодеками или silk+amrnb в Asterisk
Возникла задачка гонять голос по 3G сетям. После долгих и не особенно продуктивных мучений были выбраны кодеки speex и g729, как кандидаты на релиз. amr-nb патч существовал для версии 1.8, у меня же по разным причинам используется 10ка.
Но выбравшись из консоли и взглянув на мир, выяснилось, что для 10ки можно использовать кодек silk, он же используется для Skype и с недавнего времени стал open-source. Плюс, добрый человек в Одессе сделал патч для поддержки amrnb в 10й версии Астериска.
Все собиралось и тестировалось на Asterisk 10.12.1, Debian 6.0 x64 (OpenVZ)
1. SILK
Собирался по мотивам https://github.com/mordak/codec_silk
К стандартному набору для компилирования необходимо добавить curl. Это для работы скрипта, но никто не мешает скачать все руками.
Из отличий - в install_silk.sh заменил
ln -sf "SILK_SDK_SRC_FIX_v$SKYPE_SILK_VER" silk
на ln -sf "SILK_SDK_SRC_FLP_v$SKYPE_SILK_VER" silk Почему-то версия с фиксированной точкой у меня собираться отказывалась.
Также в astdir/codecs/silk/Makefile заменить
CFLAGS += -Wall -enable-threads -O3
на
CFLAGS += -Wall -enable-threads -O3 -fPIC
После этого все как обычно собирается.
После инсталляции в файл /etc/asterisk/codecs.conf добавить
[silk8]
type=silk
samprate=8000
fec=true
packetloss_percentage=10
maxbitrate=20000
dtx=false
[silk12]
type=silk
samprate=12000
fec=true
packetloss_percentage=10
maxbitrate=25000
dtx=false
[silk16]
type=silk
samprate=16000
fec=true
packetloss_percentage=10
maxbitrate=30000
dtx=false
[silk24]
type=silk
samprate=24000
fec=true
packetloss_percentage=10
maxbitrate=40000
dtx=false
Ну и в консоли.: asterisk -rx "core restart now"
И да, я знаю o бинарниках от Digium, но это не путь истинного джедая. Плюс, тот же добрый человек из Одессы упрекает их в глючности и не верить ему у меня оснований нет.
2. AMR-NB
Качаем патч с этой странички. Единственное что, если silk не компилируется вручную, то падает 2й hunk при патче. Просто в /codecs/Makefile необходимо добавить строчку
$(if $(filter codec_amr,$(EMBEDDED_MODS)),modules.link,codec_amr.so): $(LIBAMR)
После этого разархивируем в папку /codecs/amr содержимое следующего архива.
Переходим в папку /codecs/amr
./configure CFLAGS = "-g -O2 -fPIC"
make
После этого все как обычно собирается.
После инсталляции в файл /etc/asterisk/codecs.conf добавить
[amr]
octet-aligned=0
;codec_amr: Must be one of MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122
mode = MR475
dtx=0
cng = 1
vad = 0
octet-aligned=0 - Это следствие того, что CSipSimple (точнее, pjsip) умеет AMR только в Bandwidth-Efficient режиме. Что это такое, можно почитать в RFC.
Ну и в консоли.: asterisk -rx "core restart now"
Теперь по core show translation можно увидеть, что у нас появился целый набор silk'ов и amr.
Но выбравшись из консоли и взглянув на мир, выяснилось, что для 10ки можно использовать кодек silk, он же используется для Skype и с недавнего времени стал open-source. Плюс, добрый человек в Одессе сделал патч для поддержки amrnb в 10й версии Астериска.
Все собиралось и тестировалось на Asterisk 10.12.1, Debian 6.0 x64 (OpenVZ)
1. SILK
Собирался по мотивам https://github.com/mordak/codec_silk
К стандартному набору для компилирования необходимо добавить curl. Это для работы скрипта, но никто не мешает скачать все руками.
Из отличий - в install_silk.sh заменил
ln -sf "SILK_SDK_SRC_FIX_v$SKYPE_SILK_VER" silk
на ln -sf "SILK_SDK_SRC_FLP_v$SKYPE_SILK_VER" silk Почему-то версия с фиксированной точкой у меня собираться отказывалась.
Также в astdir/codecs/silk/Makefile заменить
CFLAGS += -Wall -enable-threads -O3
на
CFLAGS += -Wall -enable-threads -O3 -fPIC
После этого все как обычно собирается.
После инсталляции в файл /etc/asterisk/codecs.conf добавить
[silk8]
type=silk
samprate=8000
fec=true
packetloss_percentage=10
maxbitrate=20000
dtx=false
[silk12]
type=silk
samprate=12000
fec=true
packetloss_percentage=10
maxbitrate=25000
dtx=false
[silk16]
type=silk
samprate=16000
fec=true
packetloss_percentage=10
maxbitrate=30000
dtx=false
[silk24]
type=silk
samprate=24000
fec=true
packetloss_percentage=10
maxbitrate=40000
dtx=false
Ну и в консоли.: asterisk -rx "core restart now"
И да, я знаю o бинарниках от Digium, но это не путь истинного джедая. Плюс, тот же добрый человек из Одессы упрекает их в глючности и не верить ему у меня оснований нет.
2. AMR-NB
Качаем патч с этой странички. Единственное что, если silk не компилируется вручную, то падает 2й hunk при патче. Просто в /codecs/Makefile необходимо добавить строчку
$(if $(filter codec_amr,$(EMBEDDED_MODS)),modules.link,codec_amr.so): $(LIBAMR)
После этого разархивируем в папку /codecs/amr содержимое следующего архива.
Переходим в папку /codecs/amr
./configure CFLAGS = "-g -O2 -fPIC"
make
После этого все как обычно собирается.
После инсталляции в файл /etc/asterisk/codecs.conf добавить
[amr]
octet-aligned=0
;codec_amr: Must be one of MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122
mode = MR475
dtx=0
cng = 1
vad = 0
octet-aligned=0 - Это следствие того, что CSipSimple (точнее, pjsip) умеет AMR только в Bandwidth-Efficient режиме. Что это такое, можно почитать в RFC.
Ну и в консоли.: asterisk -rx "core restart now"
Теперь по core show translation можно увидеть, что у нас появился целый набор silk'ов и amr.
Friday, December 14, 2012
A2Billing. Хочу быть провайдером.
Итак... Захотелось мне стать провайдером, благо дешевую международку я нашел. Теперь с каждой станцией буду давать немного трафика покупателям! И мне несложно, и плюшка приятная. Используется версия 2.0.1
1. LAMP! (+php-gd)
2. Ставим Asterisk с поддержкой realtime (для этого поставить дополнительно mysclclient-dev)
3. Качаем A2Billing и внимательно читаем файл INSTALL.rst и выполняем инструкции (только думая, некоторые пути имеет смысл заменить). Также обратите внимание, в скрипте установки баз MySQL могут быть неправильно прописаны пути для Debian 6. Пароли тоже не стоит ставить дефолтные :)
4. vi /etc/asterisk/res_config_mysql.conf
[general]
dbhost = 127.0.0.1
dbname = mya2billing
dbuser = a2billinguser
dbpass =
dbport = 3306
5. vi /etc/asterisk/extconfig.conf
[settings]
iaxusers => mysql,general,cc_iax_buddies
iaxpeers => mysql,general,cc_iax_buddies
sipusers => mysql,general,cc_sip_buddies
sippeers => mysql,general,cc_sip_buddies
6. Настраиваем провайдеров в /etc/asterisk/sip.conf
[MainProvider](!)
context=NoContext ; DID пока не настраивал
disallow=all
allow=alaw
dtmf=rfc2833
type=peer
canreinvite=no
[Trunk1](MainProvider)
host=XXXXX
[Trunk2](MainProvider)
host=XXXXXX
[Trunk3](MainProvider)
host=XXXXXX
7. Настраиваем A2Billing (По мотивам http://sysadminman.net/documentation.html)
7.1 Настраиваем Провайдера (PROVIDERS)
7.2 Настраиваем Транки
7.3 Создаем Rate Card (RATES)
7.4 Создаем/Импортируем Rates, привязывая его к Rate Card
7.5 Создаем Сall Plan, привязывая его к Rate Card (Делается при повторном выборе Call Plan) (Тут можно вырезать префикс международки)
7.5 Создаем покупателя, приписываем ему Call Plan (CUSTOMERS)
7.6 Создаем VoIP Profile для пользователя, можно автоматом, только необходимо потом проставить CallerID. Оттуда же делаем Asterisk reload
Работает так:
Покупатель аутентифицируется на нашей платформе. Потом просто звонит на необходимый ему номер. Профит!
Несколько параметров, на которые стоит обратить внимание:
global-base_currency (базовая валюта), после ее смены надо в разделе Billing-Currency List сделать update
agi-conf1-asterisk_version
global-asterisk_version
agi-conf1-answer_call
agi-conf1-play_audio
agi-conf1-say_rateinitial
agi-conf1-say_timetocall
agi-conf1-use_dnid Если YES, то система не будет просить ввести номер, на который звонить, будет использовать присланный.
1. LAMP! (+php-gd)
2. Ставим Asterisk с поддержкой realtime (для этого поставить дополнительно mysclclient-dev)
3. Качаем A2Billing и внимательно читаем файл INSTALL.rst и выполняем инструкции (только думая, некоторые пути имеет смысл заменить). Также обратите внимание, в скрипте установки баз MySQL могут быть неправильно прописаны пути для Debian 6. Пароли тоже не стоит ставить дефолтные :)
4. vi /etc/asterisk/res_config_mysql.conf
[general]
dbhost = 127.0.0.1
dbname = mya2billing
dbuser = a2billinguser
dbpass =
dbport = 3306
5. vi /etc/asterisk/extconfig.conf
[settings]
iaxusers => mysql,general,cc_iax_buddies
iaxpeers => mysql,general,cc_iax_buddies
sipusers => mysql,general,cc_sip_buddies
sippeers => mysql,general,cc_sip_buddies
6. Настраиваем провайдеров в /etc/asterisk/sip.conf
[MainProvider](!)
context=NoContext ; DID пока не настраивал
disallow=all
allow=alaw
dtmf=rfc2833
type=peer
canreinvite=no
[Trunk1](MainProvider)
host=XXXXX
[Trunk2](MainProvider)
host=XXXXXX
[Trunk3](MainProvider)
host=XXXXXX
7. Настраиваем A2Billing (По мотивам http://sysadminman.net/documentation.html)
7.1 Настраиваем Провайдера (PROVIDERS)
7.2 Настраиваем Транки
7.3 Создаем Rate Card (RATES)
7.4 Создаем/Импортируем Rates, привязывая его к Rate Card
7.5 Создаем Сall Plan, привязывая его к Rate Card (Делается при повторном выборе Call Plan) (Тут можно вырезать префикс международки)
7.5 Создаем покупателя, приписываем ему Call Plan (CUSTOMERS)
7.6 Создаем VoIP Profile для пользователя, можно автоматом, только необходимо потом проставить CallerID. Оттуда же делаем Asterisk reload
Работает так:
Покупатель аутентифицируется на нашей платформе. Потом просто звонит на необходимый ему номер. Профит!
Несколько параметров, на которые стоит обратить внимание:
global-base_currency (базовая валюта), после ее смены надо в разделе Billing-Currency List сделать update
agi-conf1-asterisk_version
global-asterisk_version
agi-conf1-answer_call
agi-conf1-play_audio
agi-conf1-say_rateinitial
agi-conf1-say_timetocall
agi-conf1-use_dnid Если YES, то система не будет просить ввести номер, на который звонить, будет использовать присланный.
Monday, October 29, 2012
GnuGk, как замена VBP-E и частично VBP-ST
Итак, зачем покупать VBP, если есть замечательный продукт GnuGk, который умеет все, что серия E и также H.480, что умеет ST-серия.
Далее немного подчищенной копипасты с сорцфорджа.
Собирается с поддержкой H.480.18/.19
Запускается все командой вида
/usr/src/openh323gk/obj_linux_x86_64_s/gnugk -c gatekeeper.ini -o /tmp/gnugk.log -tt &
Telnet на 7000 порту обеспечит просмотр статуса.
Небольшое дополнение:
В целях облегчения жизни себе и прочим поднял данный вариант на 92.249.69.203. Так что можете смело регистрироваться. Абсолютно бесплатно :)
Далее немного подчищенной копипасты с сорцфорджа.
Собирается с поддержкой H.480.18/.19
======================================================= Final Method - Installing GNUGK v3.1+ on Debian Squeeze ======================================================= cd /usr/src apt-get update apt-get install flex bison build-essential pkg-config automake libmysqlclient-dev libmysql++-dev
libsnmp-base libsnmp-dev libssl-dev wget http://backports.debian.org/debian-backports/pool/main/libs/libssh/libssh-4_0.5.2-1~bpo60+1_i386.deb dpkg -i libssh-4_0.5.2-1~bpo60+1_i386.deb wget http://backports.debian.org/debian-backports/pool/main/libs/libssh/libssh-dev_0.5.2-1~bpo60+1_i386.deb dpkg -i libssh-dev_0.5.2-1~bpo60+1_i386.deb
(Тут естественно, выбрать свою архитектуру)
# Get static version download - do not use SVN: wget http://sourceforge.net/projects/opalvoip/files/v3.10%20Luyten/Stable%207/ptlib-2.10.7.tar.bz2 tar -jxf ptlib-2.10.7.tar.bz2 mv ptlib-2.10.7 ptlib export PTLIBDIR=/usr/src/ptlib cd /usr/src/ptlib cat version.h ======= #define MAJOR_VERSION 2 #define MINOR_VERSION 10 #define BUILD_TYPE ReleaseCode #define BUILD_NUMBER 7 ======= ./configure make optnoshared cd /usr/src # Get from CVS Web Snapshot download: wget http://h323plus.cvs.sourceforge.net/viewvc/h323plus/h323plus/?view=tar -O h323plus.tar.gz export OPENH323DIR=/usr/src/h323plus cd h323plus cat version.h ==== #define MAJOR_VERSION 1 #define MINOR_VERSION 24 #define BUILD_TYPE ReleaseCode #define BUILD_NUMBER 1 ==== ./configure make optnoshared cd /usr/src # Get from CVS Web Snapshot download: wget http://openh323gk.cvs.sourceforge.net/viewvc/openh323gk/openh323gk/?view=tar -O gnugk.tar.gz tar -xzf gnugk.tar.gz cd openh323gk cat version.h === # define GNUGK_MAJOR_VERSION 3 # define GNUGK_MINOR_VERSION 2 # define GNUGK_BUILD_TYPE ReleaseCode # define GNUGK_BUILD_NUMBER 0 === ./configure --enable-h46018 --with-large-fdset=8192 make optnoshared
Далее пример моего конфига gatekeeper.ini
[Gatekeeper::Main] Fortytwo=42 Name=GnuGk TimeToLive=600 StatusPort=7000 StatusTraceLevel=2 UseBroadcastListener=0
[RoutedMode] GKRouted=1 H245Routed=1 RemoveH245AddressOnTunneling=0 AcceptNeighborsCalls=1 AcceptUnregisteredCalls=1 SupportNATedEndpoints=1 DropCallsByReleaseComplete=1 CallSignalPort=1720
EnableH46018=1 EnableH46017=1 Enable46018=1
[Proxy] Enable=1 InternalNetwork=10.10.0.0/255.255.0.0,127.0.0.0/8 T120PortRange=40000-40999 RTPPortRange=50000-59999 ProxyForNAT=1
[RasSrv::RRQFeatures]
AliasTypeFilter=terminal;dialeddigits AliasTypeFilter=gateway;h323id ; Это для того, чтобы могли регистрироваться Поликомы
[RasSrv::ARQFeatures] ArjReasonRouteCallToGatekeeper=1 ;; RemoveTrailingChar=# RoundRobinGateways=1
[RoutingPolicy] default=explicit,internal,catchall [Routing::CatchAll]
CatchAllAlias=inbound ; Сюда будут попадать все звонки напрямую на IP гейткипера.
;Другой вариант прописывания дефолтного маршрута:
;[RoutingPolicy] ;default=explicit,internal ;[Routing::Explicit] ;внутренний IP адрес=адрес перенаправления ;внешний IP адрес = адрес перенаправления
;тут вообще можно менять звонимые IP на все, что угодно
[Gatekeeper::Auth]
default=allow
[RasSrv::RRQAuth]
default=confirm
[GkStatus::Auth] rule=password
username=some_hash; Тут используется утилита addpasswd. В примере она не собирается,
но можно использовать версию из репозитория
Запускается все командой вида
/usr/src/openh323gk/obj_linux_x86_64_s/gnugk -c gatekeeper.ini -o /tmp/gnugk.log -tt &
Telnet на 7000 порту обеспечит просмотр статуса.
Небольшое дополнение:
В целях облегчения жизни себе и прочим поднял данный вариант на 92.249.69.203. Так что можете смело регистрироваться. Абсолютно бесплатно :)
Monday, September 17, 2012
Предача Clid при переводе звонка
Так получилось, что необходимость это сделать переросла из "было бы неплохо" до "надо сделать".
Начальные условия: телефоны делают transfer не средствами станции, а своими. Тот, кому звонят должен как-то увидеть, что звонок переводится.
Сделано для варианта вызова простым Dial, но с очередью проблем быть не должно, просто другая переменная.
Смысл такой: при ответе вызывается макрос, которые заносит номера пары звонящий/ответивший в базу. При завершении разговора эта запись стирается. При вызове ответившего по второй линии (что и делается при переводе) его номер заменяется на номер звонящего (можно с модификациями, типа Перевожу ХХХ).
При использовании очередей также можно использовать этот метод, но надо доработать macro-StoreCLID на предмет анализа не DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа
...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})
...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...
exten => _X,1,Set(TransferredCLID=${DB_DELETE(CLIDT/${CALLERID(num)})})
exten => _X,n,GotoIf($[ "x${TransferredCLID}" = "x"]?ClearCall)
exten => _X,n,Set(CALLERID(num)=${TransferredCLID})
exten => _X,n(ClearCall),.....
При использовании очередей также можно использовать этот метод, но надо доработать macro-StoreCLID на предмет анализа не только DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа
...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})
...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...
Вообще таким образом можно получить номер ответившего пира в экстеншене h, что позволяет более правильно организовать записи.
Начальные условия: телефоны делают transfer не средствами станции, а своими. Тот, кому звонят должен как-то увидеть, что звонок переводится.
Сделано для варианта вызова простым Dial, но с очередью проблем быть не должно, просто другая переменная.
Смысл такой: при ответе вызывается макрос, которые заносит номера пары звонящий/ответивший в базу. При завершении разговора эта запись стирается. При вызове ответившего по второй линии (что и делается при переводе) его номер заменяется на номер звонящего (можно с модификациями, типа Перевожу ХХХ).
При использовании очередей также можно использовать этот метод, но надо доработать macro-StoreCLID на предмет анализа не DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа
...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})
...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...
[macro-StoreCLID]
exten => s,1,NoOp(Answered is = ${DIALEDPEERNUMBER})
exten => s,n,Set(DB(CLIDT/${DIALEDPEERNUMBER})=${ExternalCLID})
exten => s,1,NoOp(Answered is = ${DIALEDPEERNUMBER})
exten => s,n,Set(DB(CLIDT/${DIALEDPEERNUMBER})=${ExternalCLID})
[IncomingCallContext]
...
exten => s,n,Set(__ExternalCLID=${CALLERID(num)})
exten => s,n,Dial(${ALLOP},20,M(StoreCLID))
...
exten => h,1,NoOp(${DB_DELETE(CLIDT/${DIALEDPEERNUMBER})})
[InternalCallsContext]
exten => _X,n,GotoIf($[ "x${TransferredCLID}" = "x"]?ClearCall)
exten => _X,n,Set(CALLERID(num)=${TransferredCLID})
exten => _X,n(ClearCall),.....
При использовании очередей также можно использовать этот метод, но надо доработать macro-StoreCLID на предмет анализа не только DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа
...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})
...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...
Вообще таким образом можно получить номер ответившего пира в экстеншене h, что позволяет более правильно организовать записи.
Wednesday, August 22, 2012
VmWare vCenter Converter + info.owner ошибка
Начал переносить машины на новую виртуалку. Причем версия ESXi перешла с 3.5 на 5.0
При использовании VmWare vCenter Converter регулярно на последнем этапе получаю информацию про некорректный info.owner
Машина: WinXPPro SP3, не в домене
Как решать:
1. Установить Converter в режиме Client-Server
2. Завести отдельного пользователя с админскими правами
3. При запуске подключаться не к local server, а по ip + login/password, соответственно localhost, а логин и пароль - новосозданного пользователя.
При использовании VmWare vCenter Converter регулярно на последнем этапе получаю информацию про некорректный info.owner
Машина: WinXPPro SP3, не в домене
Как решать:
1. Установить Converter в режиме Client-Server
2. Завести отдельного пользователя с админскими правами
3. При запуске подключаться не к local server, а по ip + login/password, соответственно localhost, а логин и пароль - новосозданного пользователя.
Friday, April 27, 2012
Учим PHP + Asterisk = Автообзвон
Ввиду некоего стопора в изучении Астериска приходится копать исключительно вглубь. На этот раз мои кривые руки дошли до php.
А так как не раз спрашивали функцию, и вообще это еще тот холивар, то я решил написать систему автозвонилки да так, чтобы из браузера можно было юзать.
Скажу сразу, это первый проект на php, который я пишу. Поэтому говнокод неизбежен.
Также скажу, что использовать его в продакшене - убийство. Ибо код не факт, что отлажен, так еще и звонит пока только по очереди, никакой мультилинейности. Может, будет потом.
Также небольшой дисклеймер:
Делалось для себя, как учебный проект, поэтому с документацией и комментами плохо. Спамерство - зло, поэтому особо расписывать принципы не буду, в коде все понятно.
Говнокод
upd: Версия 0.02 Добавил мультилинейность. Теперь можно спамить в 30 потоков.
А так как не раз спрашивали функцию, и вообще это еще тот холивар, то я решил написать систему автозвонилки да так, чтобы из браузера можно было юзать.
Скажу сразу, это первый проект на php, который я пишу. Поэтому говнокод неизбежен.
Также скажу, что использовать его в продакшене - убийство. Ибо код не факт, что отлажен, так еще и звонит пока только по очереди, никакой мультилинейности. Может, будет потом.
Также небольшой дисклеймер:
Делалось для себя, как учебный проект, поэтому с документацией и комментами плохо. Спамерство - зло, поэтому особо расписывать принципы не буду, в коде все понятно.
Говнокод
upd: Версия 0.02 Добавил мультилинейность. Теперь можно спамить в 30 потоков.
Subscribe to:
Posts (Atom)