<?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>Tamkovich.com: Телеком/VoIP блог &#187; ITSP</title>
	<atom:link href="http://tamkovich.com/itsp/feed/" rel="self" type="application/rss+xml" />
	<link>http://tamkovich.com</link>
	<description>Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys</description>
	<lastBuildDate>Fri, 11 May 2012 04:00:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Приключения с KSS от компании Softkey</title>
		<link>http://tamkovich.com/2011/08/kss-from-softkey/</link>
		<comments>http://tamkovich.com/2011/08/kss-from-softkey/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 18:13:42 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[История успеха]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=2199</guid>
		<description><![CDATA[Аббревиатура KSS расшифровывается как Kaspersky Subscription Service &#8211; Служба Подписок Касперского. Предназначение этой службы &#8211; распространение продуктов лаборатории Касперского с помощью подписок. Подписка, это когда вы единожды подписываетесь на услугу и забываете о ней, дальнейшая пролонгации происходит автоматически, пока на вашем счету (кредитная карта, аккаунт у провайдера и т.д.) не кончатся деньги или же пока [...]]]></description>
			<content:encoded><![CDATA[<p><img src=/wp-content/uploads/2011/08/kaspersky.gif border=0 align=left ></p>
<p align=justify>
Аббревиатура KSS расшифровывается как Kaspersky Subscription Service &#8211; Служба Подписок Касперского. Предназначение этой службы &#8211; распространение продуктов лаборатории Касперского с помощью подписок. Подписка, это когда вы единожды подписываетесь на услугу и забываете о ней, дальнейшая пролонгации происходит автоматически, пока на вашем счету (кредитная карта, аккаунт у провайдера и т.д.) не кончатся деньги или же пока вы не откажитесь от подписки. Подписка, это очень удобный и современный способ оплаты услуги, чья стоимость не меняется из месяца в месяц. Впервые о том, что таким способом можно приобретать лицензии на продукты Касперского я услышал в апреле 2010 года.
</p>
<p align=justify>
Ознакомившись с документацией я немного приуныл. Под видом технической документации софткей подсунул бумагу со своими хотелками, где самыми конкретными фразами были &laquo;будет реализовано&raquo;, &laquo;появится возможность&raquo; и т.п. Забегая вперёд скажу, что унылость и документация софткея &#8211; идут друг с другом под руку. Даже если отбросить невероятное количество орфографических ошибок/опечаток, останется масса технических неточностей и, что самое смешное, описание того, чего нет в природе. Т.е. что-то подробно расписано в документации, а на практике этого нет. Бывают недокументированные фичи, а здесь, видимо, нереализованные :) По моим субъективным ощущениям, так называемая документация соответствует реализованному функционалу процентов на 50.
</p>
<p><span id="more-2199"></span></p>
<p align=justify>
К февралю 2011 года хотелки материализовались в якобы работающую систему. Для обмена данными с софткеем необходимо с помощью openssl сгенерировать пару ключей (открытый/закрытый) которыми потом вы будите шифровать или подписывать данные. Так написано в документации. на самом деле можно только подписывать. Кроме того, Ваш сертификат может потеряться. Однажды в мае, на все запросы стал приходить один и тот же ответ &#8211; мол не авторизован по причине неверного сертификата. На все запросы Софткеевские технари отвечали в лучших традициях отечественной школы: &laquo;Мы ничего не меняли, ошибка где-то у Вас&raquo;. Недолго думая предложил установить новый сертификат и форварднул письмо с оригинальным &#8211; от февраля &#8211; всё чудным образом заработало.
</p>
<p align=justify>
Проработало оно недолго, где-то через месяц после ввода в коммерческую эксплуатацию веб сервер Софткея перестал отвечать совсем &#8211; даже ошибкой на любые запросы. Здесь необходимо сделать отступление и рассказать как происходит обмен данными между сервером софткея и провайдером, интегрирующим у себя подписки. Провайдер посылает HTTP POST запрос, на который софткей формирует ответ. Ответ состоит из традиционных HTTP заголовков и XML документа после них. Перестав работать, веб сервер софткея выдавал ответ, оборванный на середине HTTP заголовка Date. При обращении в Софткей, технари, как это ни странно, не стали рассказывать что у них всё в порядке, а оперативно устранили проблему.
</p>
<p align=justify>
Ну и масса смешных моментов по мелочи. В марте прислали письмо с детальным описанием новой фичи &#8211; лето кончается а она так и не работает. Периодически отваливается на пару часов регистрация новых подписок.
</p>
<p align=justify>
Вот так, со скрипом и скрежетом работает KSS &#8211; сервис подписок от Касперского. По стилю работы всё это очень напоминает <a href=http://tamkovich.com/2009/11/chronopay/ >Chronopay (Хронопей)</a>. Возможно, технической частью обоих проектов занимались одни и те же люди. Тем не менее от чистого сердца желаю Софткею улучшения сервиса подписок, реализации нереализованного функционала и повышение уровня общения технарей с клиентами (ну что бы исключить ответы в стиле &laquo;сам дурак&raquo;) &#8211; затея то хорошая.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2011%2F08%2Fkss-from-softkey%2F&amp;title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%20KSS%20%D0%BE%D1%82%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8%20Softkey" id="wpa2a_2"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2011/08/kss-from-softkey/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Пару слов об энтерпрайзе</title>
		<link>http://tamkovich.com/2011/06/enterprise-solutions/</link>
		<comments>http://tamkovich.com/2011/06/enterprise-solutions/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 10:29:47 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=2166</guid>
		<description><![CDATA[В одной дружественной компании телефония организованна вся из себя энтерпрайзно. Биллинг от известной фирмы использует СУБД Oracle &#8211; авторизует все звонки в горячем режиме. В качестве ядра используется Mera siprise. Сервер, на котором работает Mera &#8211; зеркалирован с помощью linux-HA (heartbeat). Для офисных нужд &#8211; Cisco Call Manager и Cisco Unified Contact Center. В общем [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
В одной дружественной компании телефония организованна вся из себя энтерпрайзно. Биллинг от известной фирмы использует СУБД Oracle &#8211; авторизует все звонки в горячем режиме. В качестве ядра используется Mera siprise. Сервер, на котором работает Mera &#8211; зеркалирован с помощью linux-HA (heartbeat). Для офисных нужд &#8211; <a href=http://tamkovich.com/cisco/ >Cisco</a> Call Manager и <a href=http://tamkovich.com/cisco/ >Cisco</a> Unified Contact Center.  В общем всё очень красиво &#8211; прям просится на картинку в учебник. И вдруг, нежданно-негаданно, лёг сервер Oracle.
</p>
<p><span id="more-2166"></span></p>
<p align=justify>
Пока не работал сервер Oracle, соответственно не работала исходящая связь, т.к. Mera не могла авторизовать заонки. Так же стали отваливаться регистрации. Но самое интересное началось тогда, когда сервер Oracle поднялся через пару часов &#8211; исходящая связь так и не заработала, проблемы с авторизацией &#8211; остались. После нескольких дней (!) размышлений, служба технической поддержки Mera выдала ответ, ради которого, собственно, и написан весь этот текст :) Далее позволю себе процитировать:
</p>
<blockquote><p>Мера v1.3 не рассчитана на такой шквал одновременных запросов авторизации. Ее максимум 7-10, а было ~85. Предлагают резать фаерволом сети и открывать по очереди. </p></blockquote>
<p align=justify>
Т.е. на выставке мы вроде-бы и энтерпрайз, а вот на деле &#8211; не пробуйте включать больше 7-10 клиентов разом &#8211; устанете фаервол перенастраивать. Будь у знакомых <a href=http://tamkovich.com/asterisk/ >Asterisk</a> &#8211; всё сложилось бы иначе (с)</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2011%2F06%2Fenterprise-solutions%2F&amp;title=%D0%9F%D0%B0%D1%80%D1%83%20%D1%81%D0%BB%D0%BE%D0%B2%20%D0%BE%D0%B1%20%D1%8D%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B0%D0%B9%D0%B7%D0%B5" id="wpa2a_4"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2011/06/enterprise-solutions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Самые популярные SIP клиенты в 2010 году</title>
		<link>http://tamkovich.com/2010/11/most-popular-sip-clients-useragents-2010/</link>
		<comments>http://tamkovich.com/2010/11/most-popular-sip-clients-useragents-2010/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 11:05:42 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=1597</guid>
		<description><![CDATA[Цыплят, как известно, считают по осени. Месяц ноябрь &#8211; самое время для подведения итогов за прошедший год. Как я писал раньше &#8211; в CDR можно и нужно сохранять дополнительные поля. Я, например, среди прочих, сохраняю SIP заголовок Useragent для каждого звонка. И вот теперь, есть возможность проанализировать &#8211; чем пользуются клиенты IP телефонии? какой софт/железо [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
Цыплят, как известно, считают по осени. Месяц ноябрь &#8211; самое время для подведения итогов за прошедший год. Как я писал раньше &#8211; <a href=http://tamkovich.com/2009/04/asterisk-sip-security/ >в CDR можно и нужно сохранять дополнительные поля</a>. Я, например, среди прочих, сохраняю <a href=http://tamkovich.com/tag/sip/ >SIP</a> заголовок Useragent для каждого звонка. И вот теперь, есть возможность проанализировать &#8211; чем пользуются клиенты IP телефонии? какой софт/железо наиболее популярны среди любителей протокола <a href=http://tamkovich.com/tag/sip/ >SIP</a>?
</p>
<p align=justify>
В качестве исходных данных были взяты CDR трёх Российских операторов связи, предоставляющих возможность подключиться к ТФОП по протоколу <a href=http://tamkovich.com/tag/sip/ >SIP</a>. CDR были взяты за период с 1 ноября 2009 года по 1 ноября 2010 года. Исходные данные были подвергнуты простейшей обработке &#8211; агрегации. Так, например, записи содержащие в Useragent значения CUCM, <a href=http://tamkovich.com/cisco/ >Cisco</a>-CCM4.1, <a href=http://tamkovich.com/cisco/ >Cisco</a>-CCM5.1 &#8211; были объединены под общим названием CUCM/<a href=http://tamkovich.com/cisco/ >Cisco</a> Call Manager, различные версии оборудования Linksys &#8211; Linksys/SPA1001-3.1.19(SE), Linksys/SPA8000-6.1.3 и прочие &#8211; под общим названием Linksys и так далее.
</p>
<p align=justify>
После агрегации &#8211; настало время раздавать призовые места. Критерий места &#8211; очень простой, кто сделал больше всех трафика &#8211; тот и молодец. На картинке  наша двадцатка лидеров выглядит вот так:
</p>
<p><span id="more-1597"></span><br />
<img src=/wp-content/uploads/2010/11/useragents.png border=0 align=center ></p>
<p align=justify>
По оси Х отложены % от Совокупного трафика. Кому недостаточно картинки, тот может посмотреть на конкретные цифры:
</p>
<p><center></p>
<table border=1 cellspacing=0 width=500>
<tr>
<td><b>Место</b></td>
<td><b>Useragent</b></td>
<td><b>% от трафика</b></td>
</tr>
<tr>
<td>1</td>
<td><a href=http://tamkovich.com/asterisk/ >Asterisk</a></td>
<td>42,91</td>
</tr>
<tr>
<td>2</td>
<td>Linksys</td>
<td>23,16</td>
</tr>
<tr>
<td>3</td>
<td>Без названия</td>
<td>18,14</td>
</tr>
<tr>
<td>4</td>
<td>CUCM/<a href=http://tamkovich.com/cisco/ >Cisco</a> Call Manager</td>
<td>8,75</td>
</tr>
<tr>
<td>5</td>
<td>MERA</td>
<td>2,39</td>
</tr>
<tr>
<td>6</td>
<td><a href=http://tamkovich.com/cisco/ >Cisco</a>-SIPGateway</td>
<td>1,82</td>
</tr>
<tr>
<td>7</td>
<td>T38Modem</td>
<td>0,79</td>
</tr>
<tr>
<td>8</td>
<td>IP PBX</td>
<td>0,43</td>
</tr>
<tr>
<td>9</td>
<td>OxO_GW_710</td>
<td>0,35</td>
</tr>
<tr>
<td>10</td>
<td>AddPac <a href=http://tamkovich.com/tag/sip/ >SIP</a> Gateway</td>
<td>0,28</td>
</tr>
<tr>
<td>11</td>
<td>Oktell</td>
<td>0,27</td>
</tr>
<tr>
<td>12</td>
<td>3CXPhoneSystem</td>
<td>0,22</td>
</tr>
<tr>
<td>13</td>
<td>Zoiper</td>
<td>0,17</td>
</tr>
<tr>
<td>14</td>
<td>eyeBeam/X-Lite</td>
<td>0,08</td>
</tr>
<tr>
<td>15</td>
<td>InfiNet Switch</td>
<td>0,07</td>
</tr>
<tr>
<td>16</td>
<td>D-Link</td>
<td>0,03</td>
</tr>
<tr>
<td>17</td>
<td>OmniPCX</td>
<td>0,03</td>
</tr>
<tr>
<td>18</td>
<td>kfdslfklekore</td>
<td>0,02</td>
</tr>
<tr>
<td>19</td>
<td>Audiocodes</td>
<td>0,02</td>
</tr>
<tr>
<td>20</td>
<td>WLan800</td>
<td>0,02</td>
</tr>
</table>
<p></center></p>
<p align=justify>
Серьёзные пацаны на ЛОРе решают &#8211; дорос ли <a href=http://tamkovich.com/asterisk/ >Asterisk</a> до ентерпрайза или нет, и на сколько  далёк он ещё от CUCM/<a href=http://tamkovich.com/cisco/ >Cisco</a> Call Manager, а тем временем, этот самый недорощенный <a href=http://tamkovich.com/asterisk/ >Asterisk</a> забрал на себя 42% трафика, а значит реальных денег. Богато представлено оборудование под названием Linksys &#8211; российские пользователи IP телефонии по достоинству оценили высокое качество при минимальной цене. Судя по тому что в двадцатку попал T38Modem &#8211; каждый 150ый звонок совершаемые в России по IP телефонии &#8211; это отправка спама по факсу :) Удивил чрезвычайно низкий процент трафика приходящийся на оборудование D-Link. Судя по частоте упоминания в рунете, железки D-Link должны встречаться на порядок чаще оборудования Linksys. Вероятно голосовые шлюзы D-Link, в отличие от Linksys, предназначены не для передачи голоса по IP, а для общения в соответствующих форумах :)</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2010%2F11%2Fmost-popular-sip-clients-useragents-2010%2F&amp;title=%D0%A1%D0%B0%D0%BC%D1%8B%D0%B5%20%D0%BF%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5%20SIP%20%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B%20%D0%B2%202010%20%D0%B3%D0%BE%D0%B4%D1%83" id="wpa2a_6"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/11/most-popular-sip-clients-useragents-2010/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Kamailio: загружаем много данных с помощью db_mysql</title>
		<link>http://tamkovich.com/2010/10/kamailio-how-to-load-big-table-with-db_mysql/</link>
		<comments>http://tamkovich.com/2010/10/kamailio-how-to-load-big-table-with-db_mysql/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 09:42:38 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Сделай сам]]></category>
		<category><![CDATA[Kamailio]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=1572</guid>
		<description><![CDATA[В Kamailio/OpenSIPS, как в любом взрослом проекте, имеется некоторое количество &#171;прокладочных&#187; интерфейсов. Задача этих интерфейсов &#8211; унификация. Например, с помощью mem/mem.h унифицирована работа с памятью. Интерфейс предоставляет набор вызовов pkg_malloc/pkg_free для работы с обычной памятью и shm_malloc/shm_free для работы с разделяемой памятью. Благодаря унификации работы с памятью &#8211; Kamailio портирован на множество различных платформ. Другим [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
В Kamailio/OpenSIPS, как в любом взрослом проекте, имеется некоторое количество &laquo;прокладочных&raquo; интерфейсов. Задача этих интерфейсов &#8211; унификация. Например, с помощью mem/mem.h унифицирована работа с памятью. Интерфейс предоставляет набор вызовов pkg_malloc/pkg_free для работы с обычной памятью и shm_malloc/shm_free для работы с разделяемой памятью. Благодаря унификации работы с памятью &#8211; Kamailio портирован на множество различных платформ. Другим интерфейсом-прокладкой является интерфейс работы с базами данных <a href=http://www.asipto.com/pub/kamailio-devel-guide/#c09database>DB API</a>. Базовая работа с этим интерфейсом хорошо описана в <a href=http://www.asipto.com/pub/kamailio-devel-guide/>KAMAILIO (OPENSER) Devel Guide</a>.
</p>
<p><span id="more-1572"></span></p>
<p align=justify>
Классическая операция получения данных из MySQL выглядит следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">snprintf<span style="color: #009900;">&#40;</span>sqlcmd<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>sqlcmd<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
        <span style="color: #ff0000;">&quot;select n.id,n.name,n.ip,n.port,n.capacity,COUNT(c.node) 
         from cluster_nodes n left join active_calls c on (n.name=c.node) 
         where online=1 group by n.name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sql_cmd.<span style="color: #202020;">s</span> <span style="color: #339933;">=</span> sqlcmd<span style="color: #339933;">;</span>
sql_cmd.<span style="color: #202020;">len</span> <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>sqlcmd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
LOG<span style="color: #009900;">&#40;</span>L_DBG<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Trying to execute SQL: '%s'<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> sqlcmd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fres <span style="color: #339933;">=</span> dbf.<span style="color: #202020;">raw_query</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>sql_cmd<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fres <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        total <span style="color: #339933;">=</span> RES_ROW_N<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>total <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> total<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        node <span style="color: #339933;">=</span> shm_malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ci_li_node<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>node <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                LM_ERR<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Could not allocate shared memory<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        node<span style="color: #339933;">-&gt;</span>id <span style="color: #339933;">=</span> RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">values</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span>.<span style="color: #202020;">int_val</span><span style="color: #339933;">;</span>
                        node<span style="color: #339933;">-&gt;</span>calls_init <span style="color: #339933;">=</span> RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">values</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span>.<span style="color: #202020;">int_val</span><span style="color: #339933;">;</span>
                        node<span style="color: #339933;">-&gt;</span>calls_current <span style="color: #339933;">=</span> node<span style="color: #339933;">-&gt;</span>calls_init<span style="color: #339933;">;</span>
                        node<span style="color: #339933;">-&gt;</span>calls_max <span style="color: #339933;">=</span> RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">values</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span>.<span style="color: #202020;">int_val</span><span style="color: #339933;">;</span>
                        node<span style="color: #339933;">-&gt;</span>port <span style="color: #339933;">=</span> RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">values</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span>.<span style="color: #202020;">int_val</span><span style="color: #339933;">;</span>
                        snprintf<span style="color: #009900;">&#40;</span>node<span style="color: #339933;">-&gt;</span>name<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>node<span style="color: #339933;">-&gt;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> 
                                <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">values</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span>.<span style="color: #202020;">str_val</span>.<span style="color: #202020;">s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        snprintf<span style="color: #009900;">&#40;</span>node<span style="color: #339933;">-&gt;</span>ip<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>node<span style="color: #339933;">-&gt;</span>ip<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> 
                                <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">values</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span>.<span style="color: #202020;">str_val</span>.<span style="color: #202020;">s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        node<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
                        total_max <span style="color: #339933;">+=</span> node<span style="color: #339933;">-&gt;</span>calls_max<span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mylist<span style="color: #339933;">-&gt;</span>last <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                mylist<span style="color: #339933;">-&gt;</span>last <span style="color: #339933;">=</span> node<span style="color: #339933;">;</span>
                                mylist<span style="color: #339933;">-&gt;</span>first <span style="color: #339933;">=</span> node<span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                                mylist<span style="color: #339933;">-&gt;</span>last<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> node<span style="color: #339933;">;</span>
                                mylist<span style="color: #339933;">-&gt;</span>last <span style="color: #339933;">=</span> node<span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                LOG<span style="color: #009900;">&#40;</span>L_DBG<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;PRELOAD TOTAL: [servers] %d items = %lu bytes.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> 
                        i<span style="color: #339933;">,</span> i <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ci_li_node<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                mylist<span style="color: #339933;">-&gt;</span>dt <span style="color: #339933;">=</span> time<span style="color: #009900;">&#40;</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>       
        dbf.<span style="color: #202020;">free_result</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Как видим из простого примера, получение данных из MySQL сводится к трём действиям:
<ol>
<li>Отправляем SQL запрос с помощью команды raw_query.
<li>Читаем результаты с помощью макросов RES_ROW_N и RES_ROWS
<li>Подчищаем за собой память с помощью free_result</ol>
<p>Пока мы действуем по шаблону &#8211; всё отлично работает.
</p>
<p align=justify >
Но стоит нам захотеть чего то большего &#8211; и подход придётся менять. Например приведенным выше кодом нельзя загрузить за раз большую таблицу (тысячи записей). Прокладочные интерфейсы БД и памяти &#8211; накладываются друг на друга и возникают интересные эффекты. Дело в том, что при попытке загрузить большую таблицу целиком &#8211; db_mysql выделяет память под неё &#8211; одним куском. С другой стороны, pkg_free не освобождает память моментально, а лишь помечает её как готовую к очистке. Всё это приводит к тому, что загрузка большой таблицы срабатывает 2 раза подряд, а на третий возникает ошибка &#8211; недостаточно памяти.
</p>
<p align=justify >
Зачем загружать всю таблицу целиком &#8211; спросите вы? Вариантов может быть очень много &#8211; самый распространённый, пожалуй, &#8211; для того, что бы закешировать данные из БД. На одной СУБД далеко не уедешь, даже на такой быстрой как MySQL. Итак, что же нужно сделать для того, что бы обойти проблемы с памятью? Ответ очень простой: нужно воспользоваться вызовом fetch_result. К сожалению, применение этого вызова не расписано в <a href=http://www.asipto.com/pub/kamailio-devel-guide/>KAMAILIO (OPENSER) Devel Guide</a>, но, как известно, лучшая документация это исходный код. С практикой применения этого вызова можно ознакомиться в модулях Kamailio:</p>
<pre>
[root@sipproxy kamailio-3.0.3]# grep -l fetch_result */*/*.c
...
modules_k/dialog/dlg_db_handler.c
modules_k/drouting/dr_load.c
modules_k/htable/ht_db.c
modules_k/pdt/pdt.c
...
</pre>
<p>Вызов fetch_result позволяет указать сколько строк мы хотим поместить в память. Таким образом, вызывая fetch_result в цикле &#8211; мы обработаем все строки возвращённые базой данных по порциям. Если вы планируете использовать fetch_result самостоятельно, необходимо передать NULL в качестве указателя db_res_t** _r у функций raw_query(&#8230;) и query(&#8230;). Для наглядности, рассмотрим похожий кусок кода, написанный с использованием вызова fetch_result. Параметр ci_preload_chunk задаёт количество строк загружаемых в память за 1 вызов:
</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">snprintf<span style="color: #009900;">&#40;</span>sqlcmd<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>sqlcmd<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
        <span style="color: #ff0000;">&quot;select name,owner from sip where host='dynamic' and owner&gt;0&quot;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sql_cmd.<span style="color: #202020;">s</span> <span style="color: #339933;">=</span> sqlcmd<span style="color: #339933;">;</span>
sql_cmd.<span style="color: #202020;">len</span> <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>sqlcmd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
LOG<span style="color: #009900;">&#40;</span>L_DBG<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Trying to execute SQL: '%s'<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> sqlcmd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fres <span style="color: #339933;">=</span> dbf.<span style="color: #202020;">raw_query</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>sql_cmd<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fres <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        LOG<span style="color: #009900;">&#40;</span>L_DBG<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Trying to fetch first %d items.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> ci_preload_chunk<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dbf.<span style="color: #202020;">fetch_result</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>res<span style="color: #339933;">,</span> ci_preload_chunk<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                LM_ERR<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Error while fetching result<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        dbf.<span style="color: #202020;">free_result</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>       
        total <span style="color: #339933;">=</span> RES_ROW_N<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        LOG<span style="color: #009900;">&#40;</span>L_DBG<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d first items fetched.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> total<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>total <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> total<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                row <span style="color: #339933;">=</span> RES_ROWS<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> i<span style="color: #339933;">;</span>
                                u <span style="color: #339933;">=</span> shm_malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> ci_li_sipuser<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>u <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                        LM_ERR<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Could not allocate shared memory<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                        <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                                <span style="color: #009900;">&#125;</span>       
                                u<span style="color: #339933;">-&gt;</span>sipaccount <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>VAL_STRING<span style="color: #009900;">&#40;</span>ROW_VALUES<span style="color: #009900;">&#40;</span>row<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                u<span style="color: #339933;">-&gt;</span>customer <span style="color: #339933;">=</span> VAL_INT<span style="color: #009900;">&#40;</span>ROW_VALUES<span style="color: #009900;">&#40;</span>row<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                u<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mylist<span style="color: #339933;">-&gt;</span>last <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                        mylist<span style="color: #339933;">-&gt;</span>last <span style="color: #339933;">=</span> u<span style="color: #339933;">;</span>
                                        mylist<span style="color: #339933;">-&gt;</span>first <span style="color: #339933;">=</span> u<span style="color: #339933;">;</span>
                                <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                                        mylist<span style="color: #339933;">-&gt;</span>last<span style="color: #339933;">-&gt;</span>next <span style="color: #339933;">=</span> u<span style="color: #339933;">;</span>
                                        mylist<span style="color: #339933;">-&gt;</span>last <span style="color: #339933;">=</span> u<span style="color: #339933;">;</span>
                                <span style="color: #009900;">&#125;</span>
                                mylist<span style="color: #339933;">-&gt;</span>elements<span style="color: #339933;">++;</span>
                                cnt<span style="color: #339933;">++;</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dbf.<span style="color: #202020;">fetch_result</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>res<span style="color: #339933;">,</span> ci_preload_chunk<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                LM_ERR<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Error while fetching result<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                        dbf.<span style="color: #202020;">free_result</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                <span style="color: #009900;">&#125;</span>
                                <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span>
                        total <span style="color: #339933;">=</span> RES_ROW_N<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>total <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                dbf.<span style="color: #202020;">free_result</span><span style="color: #009900;">&#40;</span>db_handle<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2010%2F10%2Fkamailio-how-to-load-big-table-with-db_mysql%2F&amp;title=Kamailio%3A%20%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D0%B5%D0%BC%20%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20db_mysql" id="wpa2a_8"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/10/kamailio-how-to-load-big-table-with-db_mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Услуга &#171;непростой номер&#187; от РОСНЕТ</title>
		<link>http://tamkovich.com/2010/07/neprostoy-nomer-rosnet/</link>
		<comments>http://tamkovich.com/2010/07/neprostoy-nomer-rosnet/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 20:58:31 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=1421</guid>
		<description><![CDATA[Приятно видеть, что IP телефония вообще и SIP в частности перестаёт быть уделом операторов 3его эшелона и наколенных коллцентров. Постепенно крупные операторы поворачиваются лицом к передовым технологиям &#8211; не прошло и двадцати лет. Одним из таких операторов стал РОСНЕТ (ОАО РТС, входит в группу компаний ЦентрТелеком), который недавно запустил услугу &#171;непростой номер&#187;. Суть услуги &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p align=justify >
Приятно видеть, что IP телефония вообще и <a href=http://tamkovich.com/tag/sip/ >SIP</a> в частности перестаёт быть уделом операторов 3его эшелона и наколенных коллцентров. Постепенно крупные операторы поворачиваются лицом к передовым технологиям &#8211; не прошло и двадцати лет. Одним из таких операторов стал РОСНЕТ (ОАО РТС, входит в группу компаний ЦентрТелеком), который недавно запустил услугу &laquo;непростой номер&raquo;. Суть услуги &#8211; виртуальная АТС (Hosted PBX) на 8 каналов, функционирущая по протоколу <a href=http://tamkovich.com/tag/sip/ >SIP</a>. Схема с сайта РОСНЕТ &#8211; наилучшая иллюстрация типового использования новой услуги:
</p>
<p><center><img src=/wp-content/uploads/2010/07/npn.gif ></center></p>
<p align=justify >
Более подробную информацию и тарифы можно получить на <a href=http://npn.rosnet.ru/pages/how/ >сайте услуги</a>.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2010%2F07%2Fneprostoy-nomer-rosnet%2F&amp;title=%D0%A3%D1%81%D0%BB%D1%83%D0%B3%D0%B0%20%C2%AB%D0%BD%D0%B5%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9%20%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%C2%BB%20%D0%BE%D1%82%20%D0%A0%D0%9E%D0%A1%D0%9D%D0%95%D0%A2" id="wpa2a_10"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/07/neprostoy-nomer-rosnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Интеграция Asterisk 1.6.2 и Kamailio 3.0.x</title>
		<link>http://tamkovich.com/2010/06/asterisk-kamailio-integration/</link>
		<comments>http://tamkovich.com/2010/06/asterisk-kamailio-integration/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 15:59:15 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[ITSP]]></category>
		<category><![CDATA[Kamailio]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=1308</guid>
		<description><![CDATA[Обновился документ по интеграции Kamailio 3.0.x и Asterisk 1.6.2. Кроме того, что используются новые версии ПО, изменилась сама концепция интеграции. Ключевые тезисы новой схемы: Минимизация отклонений от стандартной конфигурации Asterisk-realtime. Вся аутентификация — внутри Kamailio. Все звонки, в т.ч. и локальные — проходят через Asterisk. Все media потоки — проходят через Asterisk. Обработка SIP сообщений [...]]]></description>
			<content:encoded><![CDATA[<p align=justify >Обновился <a href=http://kb.asipto.com/asterisk:realtime:kamailio-3.0.x-asterisk-1.6.2-astdb >документ</a> по интеграции Kamailio 3.0.x и <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.6.2. Кроме того, что используются новые версии ПО, изменилась сама концепция интеграции. Ключевые тезисы новой схемы:</p>
<ul>
<li> Минимизация отклонений от стандартной конфигурации <a href=http://tamkovich.com/asterisk/ >Asterisk</a>-realtime.
<li> Вся аутентификация — внутри Kamailio.
<li> Все звонки, в т.ч. и локальные — проходят через <a href=http://tamkovich.com/asterisk/ >Asterisk</a>.
<li> Все media потоки — проходят через <a href=http://tamkovich.com/asterisk/ >Asterisk</a>.
<li> Обработка <a href=http://tamkovich.com/tag/sip/ >SIP</a> сообщений не связанных со звонками выполняется с помощью Kamailio.
</ul>
<p align=justify >Согласно предложенной схеме, регистрация выглядит следующим образом:</p>
<p><center><img src=/wp-content/uploads/2010/06/int-register.png ></center><br />
<span id="more-1308"></span></p>
<p align=justify >Аппарат А, отправляет запрос REGISTER и после успешной аутентификации регистрируется на Kamailio. Kamailio регистрируется на сервере <a href=http://tamkovich.com/asterisk/ >Asterisk</a> от имени клиента, указав в качестве котакта свой IP адрес. Таким образом при звонке с <a href=http://tamkovich.com/asterisk/ >Asterisk</a> к абоненту A, <a href=http://tamkovich.com/asterisk/ >Asterisk</a> отправит INVITE к Kamailio, а тот в свою очередь передаст его клиенту. Кстати о звонках, звонок между абонентами A и B выглядит следующим образом:</p>
<p><center><img src=/wp-content/uploads/2010/06/int-invite.png ></center></p>
<p align=justify >Для установки соединения между аппаратами A и B, аппарат A отправляет запрос INVITE по IP адресу сервера Kamailio. После успешной аутентификации, Kamailio отправляет INVITE к <a href=http://tamkovich.com/asterisk/ >Asterisk</a>. <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, отправляет INVITE к абоненту B, однако в качестве контакта для абонента B указан IP адрес Kamailio. Получив INVITE от <a href=http://tamkovich.com/asterisk/ >Asterisk</a> для абонента B, Kamailio проверяет базу зарегистрированных пользователей (usrloc) и пытается перенаправить INVITE для абонента B по его фактическому адресу.</p>
<p align=justify >На мой взгляд: просто, элегантно, и, самое главное, масштабируемо. Я обычно использую несколько иную балансировку нагрузки, однако предложенная схема заслуживает самого тщательного изучения. Автор документа, Daniel-Constantin Mierla, обещает регулярно обновлять инструкцию, поддерживая её в актуальном состоянии.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2010%2F06%2Fasterisk-kamailio-integration%2F&amp;title=%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20Asterisk%201.6.2%20%D0%B8%20Kamailio%203.0.x" id="wpa2a_12"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/06/asterisk-kamailio-integration/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>VoIP &#8211; самый интересный рынок за 10 лет!</title>
		<link>http://tamkovich.com/2010/01/voip-fastest-growing-market/</link>
		<comments>http://tamkovich.com/2010/01/voip-fastest-growing-market/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 09:33:10 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>
		<category><![CDATA[История успеха]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=858</guid>
		<description><![CDATA[В конце декабря, американская компания IBISWorld, опубликовала исследование наиболее выросших рынков за прошедшие 10 лет (с 2000 по 2009 включительно). Рост рынков сравнивался по росту совокупной выручки компаний участниц. Десятка &#171;самых-самых&#187; выглядит следующим образом: Voice Over Internet Protocol Providers (VoIP) +179035% Search Engines +1656% eCommerce &#038; Online Auctions +469% Online Dating &#038; Matchmaking +249% Tank [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
В конце декабря, американская компания IBISWorld, опубликовала исследование наиболее выросших рынков за прошедшие 10 лет (с 2000 по 2009 включительно). Рост рынков сравнивался по росту совокупной выручки компаний участниц. Десятка &laquo;самых-самых&raquo; выглядит следующим образом:
</p>
<ol>
<li> Voice Over Internet Protocol Providers (VoIP) <font color=green>+179035%</font>
<li> Search Engines <font color=green>+1656%</font>
<li> eCommerce &#038; Online Auctions <font color=green>+469%</font>
<li> Online Dating &#038; Matchmaking <font color=green>+249%</font>
<li> Tank &#038; Armored Vehicle Manufacturing <font color=green>+245%</font>
<li> Petrochemical Manufacturing <font color=green>+221%</font>
<li> Mining Support <font color=green>+187%</font>
<li> Wireless Telecommunications Carriers <font color=green>+183%</font>
<li> Biotechnology <font color=green>+182%</font>
<li> Warehouse Clubs and Supercenters <font color=green>+147%</font>
</ol>
<p><span id="more-858"></span></p>
<p align=justify>
Рынок VoIP вырос за 10 лет в 1790 раз! Это почти в 1000 раз больше роста рынка танков и броневиков. На первый взгляд, рост в <font color=green>+179035%</font> выглядит подозрительно. Сразу же вспоминается <a href=http://tamkovich.com/2009/12/internet-exchange-points-2009/ >VNIX с его ростом +2421,84 %</a>. С другой стороны, вспомним ситуацию в 1999-2000 годах: операторов связи можно было пересчитать по пальцам одной руки, а их клиентов &#8211; по пальцам другой. Качество интернета вообще и &laquo;последней мили&raquo; в частности &#8211; было большой преградой для повсеместного внедрения IP телефонии. Сегодня, мы имеем качественно иную ситуацию. Широкополосный интернет есть везде, даже в России. А появление новых инструментов для IP-телефонии (в первую очередь <a href=http://tamkovich.com/asterisk/ >Asterisk</a>) позволило стать оператором связи &#8211; любому студенту :) Вероятней всего, большой рост рынка VoIP обусловлен эффектом мизерной базы. Вряд ли компания IBISWorld, функционирующая с 1971 года, позволит себе допустить ошибку в несложных расчётах.
</p>
<p align=justify>
Другой интересный нюанс, на который я хотел бы обратить внимание &#8211; структура десятки лидеров. Половина десятки это IT рынки, причём первая половина. Рост IT рынков существенно опережает рост рынков реального сектора экономики. Исследование никак не объясняет этот момент. Хочется верить что это, так же как и в случае с VoIP &#8211; лишь проявление эффекта малой базы, а не предвестие очередного пузыря доткомов.
</p>
<ul>
<li> <a href=http://www.ibisworld.com/ >IBISWorld</a>
<li> <a href=http://www.comparebusinessproducts.com/blog/entryid/127/voip-named-as-fastest-growing-technology-of-the-past-decade.aspx >VoIP Named As Fastest Growing Technology Of The Past Decade</a>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2010%2F01%2Fvoip-fastest-growing-market%2F&amp;title=VoIP%20%E2%80%93%20%D1%81%D0%B0%D0%BC%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B9%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA%20%D0%B7%D0%B0%2010%20%D0%BB%D0%B5%D1%82%21" id="wpa2a_14"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/01/voip-fastest-growing-market/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nufone умер &#8230; снова</title>
		<link>http://tamkovich.com/2009/09/nufone-dead-again/</link>
		<comments>http://tamkovich.com/2009/09/nufone-dead-again/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 14:31:32 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>
		<category><![CDATA[chan_h323]]></category>
		<category><![CDATA[История успеха]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=380</guid>
		<description><![CDATA[Многие &#171;технари&#187; с пренебрежением относятся к менеджерам по продажам, считая их бесполезными и никчёмными. Они считают что быть успешным продавцом (или, как сейчас модно говорить, менеджером по продажам) &#8211; плёвое дело. И даже больше &#8211; многие пытаются совмещать эти два рода деятельности. Не получается почти ни у кого. Не получилось и у талантливого программиста Jeremy [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>Многие &laquo;технари&raquo; с пренебрежением относятся к менеджерам по продажам, считая их бесполезными и никчёмными. Они считают что быть успешным продавцом (или, как сейчас модно говорить, менеджером по продажам) &#8211; плёвое дело. И даже больше &#8211; многие пытаются совмещать эти два рода деятельности. Не получается почти ни у кого.</p>
<p><img src=/wp-content/uploads/2009/09/nufone1.gif align=left ></p>
<p align=justify>Не получилось и у талантливого программиста Jeremy McNamara, создателя chan_h323, основателя компании Nufone. В мае этого года он в очередной раз объявил о закрытии своей компании Nufone и приурочил к этому событию серию заметок &laquo;How Not To Do Business&raquo; первая из которых называется <a href=http://www.jeremy-mcnamara.com/2009/03/31/how-the-hell-happened-to-nufone/ >&laquo;How The Hell Happened To NuFone?&raquo;</a> Но обо всём по порядку.</p>
<p><span id="more-380"></span></p>
<p align=justify>
В 2002 году, работая инженером в VoIP компании штат Мичиган, Джереми предложил своему работодателю использовать <a href=http://tamkovich.com/asterisk/ >Asterisk</a> в качестве универсальной платформы предоставления услуг. По его словам, на тот момент в компании был зоопарк из разнородного оборудования: <a href=http://tamkovich.com/cisco/ >Cisco</a>, Clarent и собственных разработок на базе Dialogic. <a href=http://tamkovich.com/asterisk/ >Asterisk</a> был отвергнут, только из-за того что он OpenSource.
</p>
<p align=justify>
Сразу после релиза <a href=http://tamkovich.com/asterisk/ >Asterisk</a>-oh323, Джереми вновь предложил работодателю использовать <a href=http://tamkovich.com/asterisk/ >Asterisk</a>. На этот раз дело дошло до тестов, однако реализация протокола H323 была очень слаба и <a href=http://tamkovich.com/asterisk/ >Asterisk</a> был снова отвергнут. Не смотря на провал попыток внедрить <a href=http://tamkovich.com/asterisk/ >Asterisk</a> у себя на работе, Джереми продолжил &laquo;играться&raquo; с ним, в свободное от работы время. Попытки исправить <a href=http://tamkovich.com/asterisk/ >Asterisk</a>-oh323 натолкнулись на нежелание автора вносить какие-либо чужие изменения в свой код. Тогда, за одни выходные, Джерими написал первый работоспособный вариант chan_h323, было это в январе 2003 года.
</p>
<p align=justify>
Проводя большое количество времени в <a href=http://tamkovich.com/asterisk/ >Asterisk</a> сообществе (IRC, список рассылки и т.д.). Джереми заметил, что существует большой неудовлетворенный спрос на &laquo;<a href=http://tamkovich.com/asterisk/ >Asterisk</a>-friendly&raquo; провайдеров. На этот раз он предложил своему работодателю партнёрскую схему: колокейшен, электричество и PRI в обмен на любые настройки и консультации по <a href=http://tamkovich.com/asterisk/ >Asterisk</a>. Работодатель не устоял и сдался под натиском Джереми. Так появился nufone.
</p>
<p align=justify>
Первый сервер был обычным компьютером, с чужой Zaptel/DAHDI картой на 4 потока без каких либо отказоустойчивых/дублированных подсистем. Более года аккаунты заводились вручную в текстовом файле. С появлением &laquo;портала&raquo;, в июне 2004 года, где пользователи могли регистрироваться самостоятельно, рост клиентской базы и трафика получил взрывной характер. За несколько дней были выбраны все 4 имевшихся потока, и срочно понадобилось расширение. По словам Джереми, &laquo;Nufone рос быстрее, чем желал расти вышестоящий оператор&raquo;. За полтора года деятельности Джереми из наёмного работника превратился в крупнейшего клиента. Вероятно, вышестоящего оператора не устраивала маржа получаемая с Nufone, поэтому у Джереми начались неприятности.
</p>
<p align=justify>
Первой ласточкой было письмо о якобы неоплаченном счёте на 125 000 $. На основании этого письма, оборудование Nufone (тот самый суперсервер) выключали несколько раз. Не сложно представить, что такое для телефонной компании, отключение на 5 минут. Это колоссальный удар по репутации. Последнее отключение продлилось несколько дней. Это, фактически, была первая (клиническая :) ) смерть nufone.
</p>
<p align=justify>
Во время вынужденного простоя, Джереми сумел оперативно переехать на колокейшен к другому оператору. На этом увлекательное повествование заканчивается, Джереми обещал продолжить рассказ, но прошло уже пол года, а продолжения пока нет.
</p>
<p align=justify>
Возвращаясь к тому, с чего я начал: невозможно стать хорошим бизнесменом в одно мгновение. Бизнес это не только успешные продажи, бизнес, в первую очередь, это план развития. Успешно начав, можно потерять всё, только потому, что инфраструктура не будет успевать за клиентской базой. Не стоит так же забывать про организованность и порядок, про хороший &#8211; здоровый педантизм. Нельзя заниматься бизнесом с бардаком в голове, есть риск остаться без головы :) .</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2009%2F09%2Fnufone-dead-again%2F&amp;title=Nufone%20%D1%83%D0%BC%D0%B5%D1%80%20%E2%80%A6%20%D1%81%D0%BD%D0%BE%D0%B2%D0%B0" id="wpa2a_16"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2009/09/nufone-dead-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Отправка SMS через GSM модем Siemens/Nokia (RS-232/USB)</title>
		<link>http://tamkovich.com/2009/05/sending-sms-through-gsm-modem-rs232-usb/</link>
		<comments>http://tamkovich.com/2009/05/sending-sms-through-gsm-modem-rs232-usb/#comments</comments>
		<pubDate>Mon, 04 May 2009 10:47:53 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[ITSP]]></category>
		<category><![CDATA[Железо]]></category>
		<category><![CDATA[Мониторинг]]></category>
		<category><![CDATA[GSM]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[SMS]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=313</guid>
		<description><![CDATA[Невозможно переоценить важность оперативного мониторинга. Имея хорошую систему мониторинга, Австралийская компания, из предыдущей заметки, могла бы избежать счёта на 120 000 долларов. Для ITSP, помимо всплесков трафика по экзотическим направлениям, жизненно-важно отслеживать уровень качества предоставляемых клиентам услуг. В общем случае система мониторинга состоит из 3х частей: сбор данных, обработка и уведомления. К слову, Nagios использует [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
Невозможно переоценить важность оперативного мониторинга. Имея хорошую систему мониторинга, Австралийская компания, из <a href="http://tamkovich.com/2009/04/asterisk-sip-security/">предыдущей заметки</a>, могла бы избежать счёта на 120 000 долларов. Для ITSP, помимо всплесков трафика по экзотическим направлениям, жизненно-важно отслеживать уровень качества предоставляемых клиентам услуг.
</p>
<p align=justify>
В общем случае система мониторинга состоит из 3х частей: сбор данных, обработка и уведомления. К слову, <a href="http://www.nagios.org/">Nagios</a> использует именно это концепцию, дополняя её разнообразными удобствами (визуальное отображение, расписания и т.д.). Уведомление по электронной почте, первое, что приходит в голову, однако оно не всегда оперативное. Самым оперативным уведомлением на сегодня является SMS сообщение. Отправку SMS сообщений можно организовать &laquo;на коленке&raquo; с помощью мобильного телефона подключенного к серверу.
</p>
<p><img border=0 src=/wp-content/uploads/2009/04/1.jpg /><br />
<span id="more-313"></span></p>
<p align=justify>
Большинство телефонов представляют собой модем, к которому можно подключиться через интерфейс RS-232 (COM порт). Основным отличием мобильного телефона от обычного модема является поддержка расширенных AT команд. Эти команды используются для управления функциями специфичными для мобильного телефона, например, приёмом и отправкой коротких сообщений (SMS).
</p>
<p align=justify>
Традиционно считается, что для отправки SMS с ПК лучше всего подходят мобильные телефоны Siemens. Для реализации мобильных уведомлений, я запасся несколькими моделями: парочкой ME45 и одним A50. Первая неудача с телефонами Siemens ждала меня на этапе подсоединения к ПК. Оказывается, не все дата-кабели одинаковые.
</p>
<p><img border=0 src=/wp-content/uploads/2009/04/2.jpg></p>
<p align=justify>
Вот, этот например, определялся телефоном как гарнитура, и имел большое количество распаянных контактов внутри. Однако соединение по RS-232 установить с таким кабелем невозможно. Конечно, нельзя исключать, что мне попался бракованный экземпляр, но, как говорится, осадок то остался.
</p>
<p><img border=0 src=/wp-content/uploads/2009/04/3.jpg></p>
<p align=justify>
А вот так выглядит правильный дата-кабель доработанный мной. GND, RX, TX &#8211; все что нужно для работы по RS-232. Однако после доработки кабеля всплыла вторая проблема с телефонами Siemens. Все аппараты, имевшиеся у меня, выключались вскоре после того как аккумулятор был полностью заряжен. Т.е. их невозможно было эксплуатировать постоянно подключенными к сети. Вероятно это такой способ защиты аккумуляторов. Списать это на случайность не получится при всём желании.
</p>
<p align=justify>
В принципе, на этом можно было и остановить некрофильские эксперименты с аппаратурой фирмы Siemens, однако совесть потребовала идти до конца. Как я уже писал выше, для приёма и отправки текстовых сообщений через GSM модем используется специальный набор AT команд. Подробней об этом наборе можно почитать <a href=http://www.developershome.com/sms/>здесь</a>. В общем случае отправка SMS выглядит вот так:<br />
<code><br />
# picocom /dev/ttyS0<br />
AT<br />
OK<br />
AT+CMGF=1<br />
OK<br />
AT+CMGS="+85291234567"<br />
It is easy to send text messages.^Z<br />
</code><br />
Если телефон поддерживает текстовый режим отправки SMS, или вот так:<br />
<code><br />
# picocom /dev/ttyS0<br />
AT<br />
OK<br />
AT+CMGS=42<br />
07915892000000F0<br />
01000B9158922143<br />
65F7000021493A28<br />
3D0795C3F33C88FE<br />
06CDCB6E32885EC6<br />
D341EDF27C1E3E97<br />
E72E^Z<br />
</code><br />
- если текстовый режим телефоном не поддерживается. Для активации текстового режима используется команда <code>AT+CMGF=1</code>, чтобы узнать, какие режимы поддерживаются Вашим телефоном, следует выполнить команду <code>AT+CMGF=?</code>.
</p>
<p align=justify>
Как вы уже догадались, третья проблема с телефонами Siemens заключалась в том, что ни один из имевшихся телефонов не поддерживал текстовый режим. Работая с PDU режимом Вы вынуждены генерировать сложную структуру содержащую в себе множество разнообразных параметров. Для работы с данной структурой Вам придётся либо изобрести велосипед и написать собственное API либо воспользоваться одной из существующих библиотек/программ (gsmlib, xgsmlib, Gammu и т.д.). Лучшим вариантом, на мой взгляд, является программа <a href=http://gnokii.org/>Gnokii</a>
</p>
<p align=justify>
Намучавшись с сименсами, я решил опробовать устройство, которое изначально было бы рассчитано на постоянное использование в паре с ПК. Выбор мой пал на GSM/GPRS модем <a href=http://www.gprs-modem.ru/TELEOFIS_RX201_USB_EDGE.htm>Teleofis RX201</a> (USB EDGE).
</p>
<p><img border=0 src=/wp-content/uploads/2009/04/4.jpg></p>
<p align=justify>
Приобрел я этот девайс за 3700 рублей, дороговато, по сравнению с рекламируемыми GPRS модемами от БиЛайн/Мегафон/МТС. По заверениям производителя (ООО КБ &laquo;Телеофис&raquo;), устройство произведено в России &#8211; мелочь, а приятно.
</p>
<p><img border=0 src=/wp-content/uploads/2009/04/5.jpg></p>
<p align=justify>
При подключении к ПК с linux, устройство определяется как &laquo;USB FTDI Serial Converter&raquo;. Соответствующий модуль (ftdi_sio) автоматически создаёт файл устройства /dev/ttyUSBN. Этот файл вы можете использовать для связи с модемом, с помощью вашего любимого терминала (например picocom). Хочу обратить внимание на то, что устройство RX201 по умолчанию рассчитано на скорость 460800 кб/сек. Драйвер, идущий с Fedora 10 (ftdi_sio: v1.4.3) такую скорость не поддерживает. Что бы понизить скорость на модеме, к нему необходимо подключиться из альтернативной ОС и выполнить команду <code>AT+IPR=115200&#038;W</code>.
</p>
<p align=justify>
Модем Teleofis RX201 отлично подружился с программой gnokii. Для отсылки sms с помощью gnokii сперва необходимо изменить конфигурационный файл /etc/gnokiirc. Вот пример рабочего конфига:<br />
<code><br />
[global]<br />
port = /dev/ttyUSB0<br />
model = AT<br />
initlength = default<br />
connection = serial<br />
use_locking = no<br />
serial_baudrate = 115200<br />
</code><br />
Обратите внимание на параметр use_locking, если Вы собираетесь рассылать SMS из Nagios, следует использовать use_locking = yes, что бы избежать конфликтов при рассылке уведомлений нескольким адресатам. Отправляется SMS очень просто:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'ya sms-ko !'</span> <span style="color: #000000; font-weight: bold;">|</span> gnokii <span style="color: #660033;">--sendsms</span> +<span style="color: #000000;">79260000000</span></pre></div></div>

<p>Вот и всё! SMS с текстом &#8216;ya sms-ko !&#8217; будет отправлена на номер +79260000000.
</p>
<p align=justify>
Модем <a href=http://www.gprs-modem.ru/TELEOFIS_RX201_USB_EDGE.htm>Teleofis RX201</a> работает уже почти месяц. В среднем в сутки отправляется около 10 сообщений. Никаких претензий и нареканий за этот небольшой срок не возникло, однако настораживает наличие модели Teleofis RX201-R единственное отличие которой &#8211; встроенный таймер перезагрузки.
</p>
<ul>
<li> <a href=http://www.nagios.org/>Nagios</a>
<li> <a href=http://www.developershome.com/sms/>Short Message Service / SMS Tutorial</a>
<li> <a href=http://gnokii.org/>Gnokii</a>
<li> <a href=http://www.gprs-modem.ru/>ООО КБ &laquo;Телеофис&raquo;</a>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2009%2F05%2Fsending-sms-through-gsm-modem-rs232-usb%2F&amp;title=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0%20SMS%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20GSM%20%D0%BC%D0%BE%D0%B4%D0%B5%D0%BC%20Siemens%2FNokia%20%28RS-232%2FUSB%29" id="wpa2a_18"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2009/05/sending-sms-through-gsm-modem-rs232-usb/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Asterisk: SIP и безопасность</title>
		<link>http://tamkovich.com/2009/04/asterisk-sip-security/</link>
		<comments>http://tamkovich.com/2009/04/asterisk-sip-security/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 07:46:07 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[ITSP]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[CDR]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=299</guid>
		<description><![CDATA[В начале года проскочило несколько новостей о хакерской активности в области IP-телефонии. Деятельность хакеров, как правило, сводится к поиску публично доступных шлюзов/прокси серверов и подбору паролей. Лёгкость в установке и настройке Asterisk-a, привлекла большое количество низко квалифицированных IT-шников в сегмент IP-телефонии. Этим объясняются простые пароли для SIP логинов (или пароли, совпадающие с логином) и, соответственно, [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
В начале года проскочило несколько новостей о хакерской активности в области IP-телефонии. Деятельность хакеров, как правило, сводится к поиску публично доступных шлюзов/прокси серверов и подбору паролей.
</p>
<p align=justify>
Лёгкость в установке и настройке <a href=http://tamkovich.com/asterisk/ >Asterisk</a>-a, привлекла большое количество низко квалифицированных IT-шников в сегмент IP-телефонии. Этим объясняются простые пароли для <a href=http://tamkovich.com/tag/sip/ >SIP</a> логинов (или пароли, совпадающие с логином) и, соответственно, простота их подбора.
</p>
<p align=justify>
Наиболее заметными событиями в информационном поле стали: <a href=http://www.news.com.au/technology/story/0,28348,24939188-5014239,00.html>Публикация на сайте news.com.au</a> о том, как маленькая Австралийская компания получила счёт на 120000$ после того как её корпоративную систему IP телефонии взломали и слили 11000 международных звонков за 46 часов и длиннющий <a href=http://lists.digium.com/pipermail/asterisk-biz/2009-February/029481.html>тред</a> в списке рассылки <a href=http://tamkovich.com/asterisk/ >Asterisk</a>-biz, начавшийся в начале февраля и закончившийся лишь к концу марта. Убыток во втором случае не столь впечатляющ, всего лишь 2000$. Однако последующее обсуждение имеет большую ценность.
</p>
<p><span id="more-299"></span></p>
<p align=justify>
Многие участники рассылки, используют программу fail2ban, которая умеет парсить лог-файлы различного формата и добавлять засветившиеся там IP адреса в iptables для блокирования. Подробную инструкцию как настроить <a href=http://tamkovich.com/asterisk/ >Asterisk</a> и fail2ban на совместную работу, можно прочитать <a href=http://www.voip-info.org/wiki/view/Fail2Ban+(with+iptables)+And+Asterisk>здесь</a>. Данная схема замечательна, заслуживают самого пристального внимания и оперативного внедрения. Однако я бы хотел обратить внимание на некоторые моменты:
</p>
<p><b>Не доверяйте автоматике на 100%</b></p>
<p align=justify>
Автоматической системе на основе fail2ban нельзя доверять на 100%. Дело в том, что использую <a href=http://tamkovich.com/tag/sip/ >SIP</a> в <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, мы используем протокол UDP. Реальность такова, что UDP пакеты с поддельным IP адресом отправителя без каких либо проблем проходят несколько автономных систем. Таким образом, автоматическая система на основе fail2ban может быть использована против Вас для отказа в обслуживании Ваших клиентов.
</p>
<p align=justify>
Автоматическую систему на основе fail2ban следует дополнить списком &laquo;белых&raquo; IP, которые будут игнорироваться при создании блокирующих правил iptables. Все результаты деятельности fail2ban следует регулярно проверять.
</p>
<p><b>Сохраняйте IP адреса для каждого <a href=http://tamkovich.com/tag/sip/ >SIP</a> звонка внутри CDR</b></p>
<p align=justify>
Стандартные CDR <a href=http://tamkovich.com/asterisk/ >Asterisk</a>-а не содержат IP адреса, с которого был совершён звонок. Это легко исправить. Если Вы используете cdr_addon_mysql для хранения CDR в базе данных, добавьте поле в таблицу cdr:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">alter</span> <span style="color: #990099; font-weight: bold;">table</span> cdr 
<span style="color: #990099; font-weight: bold;">add</span> <span style="color: #990099; font-weight: bold;">column</span> remote_signal_ip 
<span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">16</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">not</span> <span style="color: #9900FF; font-weight: bold;">null</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #008000;">''</span></pre></div></div>

<p>Теперь измените свой диалплан так, что бы cdr переменная remote_signal_ip инициализировалась перед исходящим звонком. Например, вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="ael" style="font-family:monospace;">context dialout {
    _X. =&gt; {
        Noop();
        Set(CDR(remote_signal_ip)=${SIPCHANINFO(recvip)});
        Dial(SIP/myprovider/${EXTEN});
    }
}</pre></div></div>

<p>Вот и всё! Функция SIPCHANINFO(recvip) вернёт IP адрес, с которого клиент производит вызов, а по окончании вызова модуль cdr_addon_mysql сохранит все переменные, имена которых совпадают с названиями колонок в таблице cdr.
</p>
<p align=justify>
Сохранение IP адреса для каждого звонка открывает большой потенциал для изучения миграции клиентов по IP сетям, выявления приоритетных партнёров для пиринга IP трафиком, решения проблем с утечками паролей и много чего ещё.
</p>
<p><b>Используйте встроенные access-листы</b></p>
<p align=justify>
chan_sip и некоторые другие модули сетевых протоколов имеют поддержку списков доступа в зачаточном состоянии. С помощью директив permit и deny вы можете ограничивать возможные IP адреса для каждого <a href=http://tamkovich.com/tag/sip/ >SIP</a> аккаунта. Если у вас есть офисные номера, работающие в интранете, не ленитесь, пропишите для каждого аккаунта</p>

<div class="wp_syntax"><div class="code"><pre class="ael" style="font-family:monospace;">deny=0.0.0.0/0.0.0.0
permit=192.168.1.0/255.255.255.0</pre></div></div>

<p>Возможно, это спасёт Вас от судьбы той компании из Австралии.
</p>
<p><b>Подходите к вопросу творчески: комбинируйте, изобретайте!</b></p>
<p align=justify>
Не стоит сидеть, сложа руки и ждать, пока появятся проблемы. Лучше потратить немного усилий на превентивные меры, что бы обезопасить себя от форс-мажора. В вопросе безопасности, надо всегда быть на шаг впереди. Анализируйте свой трафик &#8211; каждый всплеск мг/мн трафика должен быть тщательно расследован. Не работайте по шаблонам &#8211; комбинируйте и изобретайте. Например, можно написать скрипт, который раз в месяц анализирует IP адреса из вашей таблицы cdr, и автоматически генерирует списки доступа (acess-list) для тех аккаунтов, чьи IP не менялись за прошедший месяц. Будьте креативными!
</p>
<ul>
<li> <a href=http://www.fail2ban.org/>Fail2ban</a>
<li> <a href=http://www.voip-info.org/wiki/view/Fail2Ban+(with+iptables)+And+Asterisk>Fail2Ban (with iptables) And Asterisk</a>
<li> <a href=http://www.news.com.au/technology/story/0,28348,24939188-5014239,00.html>Small business gets $120,000 phone bill after hackers attack VoIP phone</a>
<li> <a href=http://lists.digium.com/pipermail/asterisk-biz/2009-February/029481.html>[asterisk-biz] PBX got Hacked</a>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Ftamkovich.com%2F2009%2F04%2Fasterisk-sip-security%2F&amp;title=Asterisk%3A%20SIP%20%D0%B8%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C" id="wpa2a_20"><img src="http://tamkovich.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2009/04/asterisk-sip-security/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

