<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mysyslog.ru &#187; asterisk</title>
	<atom:link href="http://mysyslog.ru/posts/tag/asterisk/feed" rel="self" type="application/rss+xml" />
	<link>http://mysyslog.ru</link>
	<description>Всякая IT всячина</description>
	<lastBuildDate>Thu, 08 Jul 2010 13:51:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP + Asterisk AMI</title>
		<link>http://mysyslog.ru/posts/258</link>
		<comments>http://mysyslog.ru/posts/258#comments</comments>
		<pubDate>Thu, 22 Oct 2009 11:52:20 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[asterisk]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=258</guid>
		<description><![CDATA[Asterisk Manager Interface (AMI) &#8211; интерфейс, позволяющей клиентам подключаться к работающему asterisk, и через набор заданных функций получать данные о его работе или менять его настройки. Звучит хорошо?

На практике все несколько тяжелее. Для включения AMI нужно настроить asterisk/manager.conf

[general]
 displaysystemname = no
 enabled = yes
 port = 5038
 bindaddr = 127.0.0.1
 [admin]
 secret = secret5
 deny [...]]]></description>
			<content:encoded><![CDATA[<p>Asterisk Manager Interface (AMI) &#8211; интерфейс, позволяющей клиентам подключаться к работающему asterisk, и через набор заданных функций получать данные о его работе или менять его настройки. Звучит хорошо?<br />
<span id="more-258"></span><br />
На практике все несколько тяжелее. Для включения AMI нужно настроить asterisk/manager.conf</p>
<pre class="brush: plain;">
[general]
 displaysystemname = no
 enabled = yes
 port = 5038
 bindaddr = 127.0.0.1
 [admin]
 secret = secret5
 deny = 0.0.0.0/0.0.0.0
 permit = 127.0.0.1/255.255.255.255
 read = all,system,call,log,verbose,command,agent,user,config
 write = all,system,call,log,verbose,command,agent,user,config
</pre>
<p>После чего можно сделать вот так</p>
<pre class="brush: plain;">
$ telnet 127.0.0.1 5038
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Asterisk Call Manager/1.0
</pre>
<p>вводим команды и после несколько раз нажимаем enter</p>
<pre class="brush: plain;">
Action: Login
ActionID: 1
Username: admin
Secret: secret5
</pre>
<p>получаем ответ</p>
<pre class="brush: plain;">
Response: Success
ActionID: 1
Message: Authentication accepted
</pre>
<p>дальше можно сделать вот так</p>
<pre class="brush: plain;">
Action: Queues
ActionID: 2
</pre>
<p>и получить ответ</p>
<pre class="brush: plain;">
supports has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:0, SL:0.0% within 0s
   Members:
      SIP/100 (Unavailable) has taken no calls yet
      SIP/101 (Unavailable) has taken no calls yet
      SIP/102 (Not in use) has taken no calls yet
      SIP/103 (Unavailable) has taken no calls yet
      SIP/104 (Not in use) has taken no calls yet
   No Callers
</pre>
<p>Если <a href="http://www.voip-info.org/wiki/view/Asterisk+manager+API">посмотреть</a> список доступных функций, то открывается массу возможностей по управлению asterisk в реальном времени без редактирования конфигов. Дело за малым &#8211; найти библиотеку для работы с AMI, чтобы самому не писать обвязку для работы с TCP сокетами и т.п. Библиотек много, кажется есть почти для каждого популярного языка программирования. Я выбрал для PHP asterisk-php-api, можно скачать с <a href="http://code.google.com/p/asterisk-php-api/"> google code</a>. Напишем пример для статистики по очередям </p>
<pre class="brush: php;">
&lt;?php
require &quot;AsteriskManager.php&quot;;
$params = array('server' =&gt; '127.0.0.1', 'port' =&gt; '5038');
$ast = new Net_AsteriskManager($params);
try {
    $ast-&gt;connect();
} catch (PEAR_Exception $e) {
    echo $e;
}
try {
    $ast-&gt;login('admin', 'secret5');
} catch(PEAR_Exception $e) {
    echo $e;
}
try {
    $queuestatus = $ast-&gt;getQueues();
} catch(PEAR_Exception $e) {
    echo $e;
}

echo $queuestatus;
?&gt;
</pre>
<p>Вид конечно не очень, но все понятно, можно сделать страницу с авторефрешем и присматривать за работой очередей asterisk.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/258/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SIP / AGENT, is still &#8216;Not in Use&#8217; when it probably should not be!</title>
		<link>http://mysyslog.ru/posts/251</link>
		<comments>http://mysyslog.ru/posts/251#comments</comments>
		<pubDate>Thu, 22 Oct 2009 07:46:03 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[asterisk]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=251</guid>
		<description><![CDATA[WARNING[18373]: app_queue.c:2705 try_calling: The device state of this queue member, SIP/612, is still &#8216;Not in Use&#8217; when it probably should not be!
Please check UPGRADE.txt for correct configuration settings.
Какое-то время наблюдал вот такое сообщение в логах и не мог понять почему не меняется статус для очередей когда смотришь queue show queuename.

Решить проблему все время как-то руки [...]]]></description>
			<content:encoded><![CDATA[<p>WARNING[18373]: app_queue.c:2705 try_calling: The device state of this queue member, SIP/612, is still &#8216;Not in Use&#8217; when it probably should not be!<br />
Please check UPGRADE.txt for correct configuration settings.<br />
Какое-то время наблюдал вот такое сообщение в логах и не мог понять почему не меняется статус для очередей когда смотришь queue show queuename.<br />
<span id="more-251"></span><br />
Решить проблему все время как-то руки не доходили, да и <strong>locate UPGRADE.txt</strong> на gentoo сервере ничего не показывал. Вчера решил побороть проблему, оказалось все просто, если прочитать UPGRADE.txt (взял из исходников с сайта asterisk)</p>
<pre class="brush: plain;">
* Queues depend on the channel driver reporting the proper state
  for each member of the queue. To get proper signalling on
  queue members that use the SIP channel driver, you need to
  enable a call limit (could be set to a high value so it
  is not put into action) and also make sure that both inbound
  and outbound calls are accounted for.

  Example:
       [general]
       limitonpeer = yes
       [peername]
       type=friend
       call-limit=10
</pre>
<p>Т.е. это как раз то, что и нужно было сделать, после этого статусы выставляются корректно.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/251/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Приоритет в очередях звонков Asterisk</title>
		<link>http://mysyslog.ru/posts/196</link>
		<comments>http://mysyslog.ru/posts/196#comments</comments>
		<pubDate>Sun, 24 May 2009 11:22:31 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[asterisk]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=196</guid>
		<description><![CDATA[Asterisk обрабатывает звонки в очередях по принципу FIFO, т.е. звонки будут обрабатываться один за одним по мере их поступления в очередь. Но если вы хотите каким-то клиентам предоставить приоритетное обслуживание? Для таких целей приложение Queue имеет опцию приоритета при постановке звонка в очередь.

Теперь разобьем общую задачу на более мелкие:
1) Первым делом нужно определить, нужно ли [...]]]></description>
			<content:encoded><![CDATA[<p>Asterisk обрабатывает звонки в очередях по принципу FIFO, т.е. звонки будут обрабатываться один за одним по мере их поступления в очередь. Но если вы хотите каким-то клиентам предоставить приоритетное обслуживание? Для таких целей приложение Queue имеет опцию приоритета при постановке звонка в очередь.</p>
<p><span id="more-196"></span></p>
<p>Теперь разобьем общую задачу на более мелкие:<br />
1) Первым делом нужно определить, нужно ли звонку выставить более высокий приоритет<br />
2) Выставить приоритет<br />
3) Поставить звонок в очередь</p>
<p>Все эти задачи реализованы в контексте:</p>
<pre lang="asterisk">[queue]
exten =&gt; s,1,GotoIf(${DB_EXISTS(vipclients/${CALLERID(num)})}?setprior)
exten =&gt; s,n,Set(QUEUE_PRIO=5)
exten =&gt; s,n(gotoqueue),Queue(manager-queue)
exten =&gt; s,n,Hungup()
exten =&gt; s,n(setprior),Set(QUEUE_PRIO=10)
exten =&gt; s,n,Goto(gotoqueue)

exten =&gt; h,1,Hangup()
exten =&gt; i,1,Hangup()</pre>
<p>В первой строчке проверяется база astdb на наличие номера в семействе vipclients (в это семейство будут помещаться номера с повышенным приоритетом). Если номер есть в базе, то звонок перекидывается к метке setprior, где выставляется более высокий приоритет, после чего звонок перекидывается в очередь (gotoqueue).</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/196/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Черный список для Asterisk</title>
		<link>http://mysyslog.ru/posts/175</link>
		<comments>http://mysyslog.ru/posts/175#comments</comments>
		<pubDate>Fri, 15 May 2009 09:32:38 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[voip]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=175</guid>
		<description><![CDATA[Если вам надоели звонки с каких-то номеров, их легко можно заблокировать на вашем asterisk.
Сейчас расскажу как.
Для организации черного списка номеров в asterisk есть специальная функция BLACKLIST, функция появилась в версии 1.4 и заменила собой устаревшую LookupBlaclist().
Посмотреть описание функции можно так.
office-pbx*CLI&#62; core show function BLACKLIST
Теперь напишем нужный dialplan
[incoming]
exten=&#62;7495XXXXXXX,1,Answer()
exten=&#62;7495XXXXXXX,n,GotoIf($[${BLACKLIST()}=1]?blacklist)
exten=&#62;7495XXXXXXX,n,GoTo(call4nums,s,1)
exten=&#62;7495XXXXXXX,n(blacklist),Hangup()
exten=&#62;h,1,Hangup()
exten=&#62;i,1,Hangup()
BLACKLIST() проверяет в базе данных AstDB в семействе blacklist [...]]]></description>
			<content:encoded><![CDATA[<p>Если вам надоели звонки с каких-то номеров, их легко можно заблокировать на вашем asterisk.</p>
<p>Сейчас расскажу как.</p>
<p><span id="more-175"></span>Для организации черного списка номеров в asterisk есть специальная функция BLACKLIST, функция появилась в версии 1.4 и заменила собой устаревшую LookupBlaclist().</p>
<p>Посмотреть описание функции можно так.</p>
<pre lang="asterisk">office-pbx*CLI&gt; core show function BLACKLIST</pre>
<p>Теперь напишем нужный dialplan</p>
<pre lang="asterisk">[incoming]
exten=&gt;7495XXXXXXX,1,Answer()
exten=&gt;7495XXXXXXX,n,GotoIf($[${BLACKLIST()}=1]?blacklist)
exten=&gt;7495XXXXXXX,n,GoTo(call4nums,s,1)
exten=&gt;7495XXXXXXX,n(blacklist),Hangup()
exten=&gt;h,1,Hangup()
exten=&gt;i,1,Hangup()</pre>
<p>BLACKLIST() проверяет в базе данных AstDB в семействе blacklist ключ, равный Caller*ID, со значением 1. Если ключ есть и значение равно единице, то BLACKLIST() возвращает 1. Что проверяется вот этой строчкой:</p>
<pre lang="asterisk">exten=&gt;7495XXXXXXX,n,GotoIf($[${BLACKLIST()}=1]?blacklist)</pre>
<p>Если условие выполняется, то вызывается extension с пометкой  blacklist</p>
<pre lang="asterisk">exten=&gt;7495XXXXXXX,n(blacklist),Hangup()</pre>
<p>Для управления черным списком можно использовать CLI:</p>
<pre lang="asterisk">office-pbx*CLI&gt; database put blacklist 74957007070 1
office-pbx*CLI&gt; database del blacklist 74957007070</pre>
<p>Чтобы упросить себе жизнь, можно написать shell скрипт:</p>
<pre lang="bash">~ # cat /root/bin/astblacklist.sh
#!/bin/bash

function helpfunction {
  echo "astblacklist.sh [show|add|del][CALLERID]"
  echo show - show blacklist AstDB family
  echo add CALLERID - add CALLERID to blacklist
  echo del CALLERID - add CALLERID to blacklist
}

ACTION=$1
CALLERID=$2

if [ ${ACTION} == 'show' ]; then
  asterisk -r -x "database show" | fgrep blacklist
  exit 0
fi

if [ ${ACTION} == 'add' ] || [ ${ACTION} == 'del' ]; then
  if [ -z ${CALLERID} ]; then
    helpfunction
    exit 1
  fi

  if [ ${ACTION} == 'add' ];then
    asterisk -r -x "database put blacklist ${CALLERID} 1"
    exit 0
  fi

  if [ ${ACTION} == 'del' ];then
    asterisk -r -x "database del blacklist ${CALLERID}"
    exit 0
  fi
fi

helpfunction</pre>
<p>Можно изменять базу и при помощи extensions, для этого в asterisk 1.4 есть функция DB и DB_DELETE</p>
<pre lang="asterisk">[add-to-backlist]
exten=&gt;_X.,1,Set(DB(blacklist/${EXTEN})=1)
exten=&gt;_X.,n,background(demo-thanks)
exten=&gt;_X.,n,Wait(1)
exten=&gt;_X.,n,Hangup()

exten=&gt;t,1,Hangup()
exten=&gt;h,1,Hangup()
exten=&gt;i,1,Hungup()

[del-from-backlist]
exten=&gt;_X.,1,NoOp(${DB_DELETE(blacklist/${EXTEN})})
exten=&gt;_X.,n,background(demo-thanks)
exten=&gt;_X.,n,Wait(1)
exten=&gt;_X.,n,Hangup()

exten=&gt;t,1,Hangup()
exten=&gt;h,1,Hangup()
exten=&gt;i,1,Hungup()</pre>
<p>Эти два контекста при помощи функций DB и DB_DELETE добавляют и удаляют из blacklist. Теперь нужно только вызвать их. Для этого в общем плане набора создаем два extension</p>
<pre lang="asterisk">exten =&gt; _*1*X.,1,Goto(add-to-backlist,${EXTEN:3},1)
exten =&gt; _*2*X.,1,Goto(del-from-backlist,${EXTEN:3},1)</pre>
<p>Несколько полезных ссылок:<br />
<a href="http://www.voip-info.org/wiki/view/Asterisk+func+db">Функция DB</a><br />
<a href="http://www.voip-info.org/wiki/view/Asterisk+cmd+DB_DELETE">Функция DB_DELETE</a><br />
<a href="http://www.jackenhack.com/blog/archives/2005/09/26/adding-blacklist-to-an-asteriskhome-pbx-voip-server/">Более продвинутая реализация черного списка</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/175/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
