Asterisk | Snussi's home in the web space http://www.snussi.ru/asterisk Настройка Asterisk - личный опыт Простейший биллинг SnuBill <p>UPD. Прекрасный человек по имени Максим адаптировал мой код под FreePBX - его проект вы можете посмотреть по <a href="https://gitman.cf/biodamage/billing">этой ссылке</a>.</p><p>Давненько я не писал ничего про Звездочку, хотя идей подкопилось немало. Надеюсь этой статьей возродить рубрику про Астериск.</p><p>К написанию этой статьи меня подтолкнул вопрос одного иноземного знакомца, который поинтересовался на тему биллинга в Астериске. Конечно, есть множество систем биллинга - тот же <a href="http://www.asterisk.org/downloads/asterisknow">AsteriskNOW</a>, насколько мне известно, содержит зачатки биллинга или, можно сказать, индустриальный стандарт <a href="http://www.asterisk2billing.org/">A2Billing</a>. Но страсть все сделать самому победила, и я набросал простой скрипт биллинга, который можно посмотреть под катом.</p> http://www.snussi.ru/asterisk/22.html Vasiliy "Snussi" Shokov snussi@snussi.ru Tue, 31 Mar 2015 14:53:01 +0300 http://www.snussi.ru/asterisk/22.html диалплан extensions.conf mysql биллинг Связь двух астерисков <p>Честно говоря, я планировал связать два астрериска уже после того, как полностью заработает один. Но суровая реальность расставила все по своим местам.</p> http://www.snussi.ru/asterisk/21.html Vasiliy "Snussi" Shokov snussi@snussi.ru Thu, 02 Jun 2011 16:56:16 +0400 http://www.snussi.ru/asterisk/21.html диалплан sip.conf extensions.conf внутренние номера iax.conf php Занято v3 <p>Если вы читаете этот цикл статей с начала, то вы помните мои метания по поводу сигнала занято (вы можете посмотреть <a href="http://www.snussi.ru/asterisk/5.html#ne_suschestvuet,_nedostupen,_zanyat">здесь</a> и <a href="http://www.snussi.ru/asterisk/15.html">здесь</a>).</p><p>После переписки с разработчиками, чтения мануалов и тд, стал понятен третий, финальный и правильный путь. Переходим к делу.</p><p>Во-первых, удаляем столбец <b>call-limit</b> из <b>tbl_sip_conf</b> - он больше не понадобится.</p><p>Во-вторых, добавляем два столбца в ту же таблицу</p><div class="code">&nbsp;&nbsp;`busylevel` int(11) NOT NULL default '1',<br />&nbsp;&nbsp;`callcounter` varchar(45) NOT NULL default 'yes'</div><p><b>busylevel</b> будет определять, при каком количестве звонков телефон переходит в статус занято, а <b>callcounter</b> разрешает такой подсчет.</p><p>После перезапуска sip очереди уже будут контролироваться автоматически, не допуская появления новых звонков в процессе разговора.</p><p>Теперь дополнительный отбой при наборе.</p><p>Перед набором SIP номера (у меня это <b>macro-dial_sip_number</b>) добавляем</p><div class="code"><span style="color: rgb(255, 128, 0); ">; проверим набираемый номер на занятость</span><br /><span style="color: rgb(255, 128, 0); ">; по входящим</span><br />exten =&gt; s,n,GotoIF($[${GROUP_COUNT(${ARG1}@busy_in)} &gt; 0 ]?number_is_busy)<br /><span style="color: rgb(255, 128, 0); ">; и исходящим</span><br />exten =&gt; s,n,GotoIF($[${GROUP_COUNT(${ARG1}@busy_out)} &gt; 0 ]?number_is_busy)<br /><br /><span style="color: rgb(255, 128, 0); ">; маркируем набираемый как "занято"</span><br /><span style="color: rgb(255, 128, 0); ">; набирающий уже маркирован</span><br />exten =&gt; s,n,Set(GROUP(busy_in)=${ARG1})</div><p>А в контексты набора номера с телефонов добавляем</p><div class="code"><span style="color: rgb(255, 128, 0); ">; устанавливаем "занято"</span><br />exten =&gt; _X.,n,Set(GROUP(busy_out)=${CALLERID(NUM)})</div><p>Все!</p> http://www.snussi.ru/asterisk/20.html Vasiliy "Snussi" Shokov snussi@snussi.ru Thu, 26 May 2011 14:40:37 +0400 http://www.snussi.ru/asterisk/20.html диалплан sip.conf extensions.conf внутренние номера Статус линии на телефоне Grandstream 2020 <p>В качестве телефона оператора колл-центра, мы выбрали телефон <a href="http://www.homy.ru/catalog/ip_phones/gxp2020.html">Grandstream GXP-2020</a>. К нему подключаются дополнительные блоки кнопок и он умеет показывать статус линии (занята/свободна). Именно этим статусом и займемся.</p><p>Сначала добавим в таблицу <b>tbl_sip_conf</b> два столбца:</p><div class="code">notifyringing varchar(10) NOT NULL default 'yes',<br />subscribecontext varchar(80) NOT NULL default 'sip_subscribe'</div><p>Первый позволит уведомлять телефон колл-центра не только о разговаривающих абонентах, но и об абонентах, которым звонят. Второй предназначен для задания контекста, в который будет направляться телефон при подписке.</p><p>Из-за того, что указание в диалплане метки <b>hint</b>(а именно она нам и нужна) нельзя использовать шаблоны, придется немного схитрить.</p><p>В основной контекст я добавил следующие строки (они включают внешний файл <b>/etc/asterisk/rittal/hints.conf</b>):</p><div class="code"><span style="color: rgb(0, 0, 187); "><b>[sip_subscribe]</b></span><br />#include /etc/asterisk/rittal/hints.conf</div><p>Для формирования этого файла из базы я использовал скрипт</p><div class="code"><span style="color: #000000"> <span style="color: #0000BB">&lt;?php<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;добавляем&nbsp;в&nbsp;мониторинг&nbsp;(hints)<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;все&nbsp;записи&nbsp;из&nbsp;tbl_sip_conf<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$file_content</span><span style="color: #007700">=</span><span style="color: #DD0000">""</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$SQL</span><span style="color: #007700">=</span><span style="color: #DD0000">"SELECT&nbsp;name&nbsp;FROM&nbsp;tbl_sip_conf"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$rez_sql</span><span style="color: #007700">=</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$SQL</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(</span><span style="color: #0000BB">$row&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_fetch_assoc</span><span style="color: #007700">(</span><span style="color: #0000BB">$rez_sql</span><span style="color: #007700">))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$file_content</span><span style="color: #007700">=</span><span style="color: #0000BB">$file_content</span><span style="color: #007700">.</span><span style="color: #DD0000">'exten=&gt;&nbsp;'</span><span style="color: #007700">.</span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">].</span><span style="color: #DD0000">',hint,SIP/'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">].</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$fh&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'/etc/asterisk/rittal/hints.conf'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'w'</span><span style="color: #007700">)&nbsp;or&nbsp;die(</span><span style="color: #DD0000">"can't&nbsp;open&nbsp;file"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fh</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$file_content</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fh</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;в&nbsp;конце&nbsp;-&nbsp;перегрузим&nbsp;sip&nbsp;на&nbsp;астериске<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">shell_exec</span><span style="color: #007700">(</span><span style="color: #DD0000">'sudo&nbsp;/usr/sbin/asterisk&nbsp;-rx&nbsp;"sip&nbsp;reload"'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span> </span> </div><p>Этот скрипт создает файл вида</p><div class="code">exten=&gt; 1260,hint,SIP/1260<br />exten=&gt; 1261,hint,SIP/1261</div><p>Теперь осталось в настройках телефона прописать на кнопку мониторинг.</p><p><span class="image-border left" style="width: 583px;"> <a href="/images/imaginator/dynamico/asterisk/19/big/grandstream_setup_0.jpg"><img alt="" src="/images/imaginator/dynamico/asterisk/19/grandstream_setup_0.jpg" width="583" height="82"/></a> </span> </p> http://www.snussi.ru/asterisk/19.html Vasiliy "Snussi" Shokov snussi@snussi.ru Wed, 25 May 2011 11:34:44 +0400 http://www.snussi.ru/asterisk/19.html телефоны диалплан sip.conf extensions.conf Повтор последнего номера <p>Еще одна "неподкатная" статейка - как повторить последний набранный номер? Все просто...</p><p>Во-первых, если пошел набор реального номера, его нужно сохранить (в моем случае - в <b>AstDB</b>).</p><p>Я вписал в контекст набора номера с SIP телефона следующую строчку (она в середине):</p><div class="code"><span style="color: rgb(255, 128, 0); ">; это не набор системной функции, а набор номера</span><br />exten =&gt; _X.,1,NoOp(transfer to internal_phones_outgoing_dial)<br /><br /><span style="color: rgb(255, 128, 0); ">; Записываем номер в AstDB</span><br />exten =&gt; _X.,n,Set(DB(last_dial/${CALLERID(NUM)})=${EXTEN})<br /><br />exten =&gt; _X.,n,Gosub(internal_phones_outgoing_dial,${EXTEN},1)</div><p>Во-вторых, при наборе системного номера (в моем случае - <b>**</b>) этот номер нужно восстановить из базы и набрать:</p><div class="code"><span style="color: rgb(255, 128, 0); ">; ** - повтор последнего номера</span><br />exten =&gt; **,1,NoOp(system functions - redial)<br /><span style="color: rgb(255, 128, 0); ">; если номер не задан, то уходим на возврат</span><br />exten =&gt; **,n,GotoIF($["${DB(last_dial/${CALLERID(NUM)})}" = ""]?end)<br /><span style="color: rgb(255, 128, 0); ">; набираем номерок</span><br />exten =&gt; **,n,Gosub(internal_phones_outgoing_dial,${DB(last_dial/${CALLERID(NUM)})},1)<br />exten =&gt; **,n(end),Return</div> http://www.snussi.ru/asterisk/18.html Vasiliy "Snussi" Shokov snussi@snussi.ru Thu, 19 May 2011 15:49:27 +0400 http://www.snussi.ru/asterisk/18.html диалплан extensions.conf прочее Перехват звонков <p>Совсем коротко, даже нет смысла загонять под кат.</p><p>Нам необходимо разбить пользователей на группы и разрешить пользователям одной группы отвечать на звонки друг-друга.</p><p>Первым делом, добавляем в таблицу <b>tbl_sip_conf</b> два столбца </p><div class="code">&nbsp;&nbsp;`pickupgroup` varchar(10) default NULL,<br />&nbsp;&nbsp;`callgroup` varchar(10) default NULL,</div><p>Затем в <b>features.conf</b> добавляем</p><div class="code">; комбинация, используемая для перехвата<br />pickupexten = *8(default is *8)<br />;pickupsound = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;pickupfailsound =</div><p><b>Из-за бага в астериск, pickupsound и pickupfailsound должны быть закомментированы!</b></p><p>Далее мы можем добавлять в поля <b>pickupgroup</b> и <b>callgroup</b> номера групп, к которым принадлежит телефон и которые он может перехватить.</p><p>Для перехвата необходимо набрать номер <b>*8</b>.</p><p>Вот и все!</p> http://www.snussi.ru/asterisk/17.html Vasiliy "Snussi" Shokov snussi@snussi.ru Wed, 18 May 2011 16:29:50 +0400 http://www.snussi.ru/asterisk/17.html features.conf Конференц-колл <p>Попробуем организовать конференцию.</p> http://www.snussi.ru/asterisk/16.html Vasiliy "Snussi" Shokov snussi@snussi.ru Tue, 17 May 2011 09:00:00 +0400 http://www.snussi.ru/asterisk/16.html extensions.conf mysql конференц-колл Очередь звонков <p>Рассмотрим организацию очередей звонков на примере ответа секретаря.</p> http://www.snussi.ru/asterisk/15.html Vasiliy "Snussi" Shokov snussi@snussi.ru Mon, 16 May 2011 12:00:00 +0400 http://www.snussi.ru/asterisk/15.html диалплан sip.conf extensions.conf mysql очередь