<?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; Мониторинг</title>
	<atom:link href="http://tamkovich.com/monitoring/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>Расширение NET SNMP</title>
		<link>http://tamkovich.com/2009/10/custom-net-snmp/</link>
		<comments>http://tamkovich.com/2009/10/custom-net-snmp/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 12:18:51 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Мониторинг]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=458</guid>
		<description><![CDATA[По умолчанию, агент NET-SNMP предоставляет доступ к огромному количеству параметров. Здесь и различные счётчики с интерфейсов, и загрузка процессора, памяти и объём с жесткого диска. Пакет lm_sensors добавляет показания различных датчиков &#8211; термометры, измерители оборотов и т.д. Зачастую, наибольший интерес представляет мониторинг нестандартного оборудования или программного обеспечения, поддержки для которого в NET SNMP нет. Самостоятельно [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
По умолчанию, агент NET-SNMP предоставляет доступ к огромному количеству параметров. Здесь и различные счётчики с интерфейсов, и загрузка процессора, памяти и объём с жесткого диска. Пакет lm_sensors добавляет показания различных датчиков &#8211; термометры, измерители оборотов и т.д. Зачастую, наибольший интерес представляет мониторинг нестандартного оборудования или программного обеспечения, поддержки для которого в NET SNMP нет.
</p>
<p align=justify>
Самостоятельно расширить NET SNMP можно несколькими способами
</p>
<p><span id="more-458"></span></p>
<h2>Создание сабагента AgentX (AgentX subagent)</h2>
<p align=justify>
Subagent это независимое приложение которое осуществляет обработку специфических параметров и предоставляет их SNMP агенту по протоколу AgentX (RFC 2741). Многие производители программного обеспечения, распространяют сабагент в комплекте со своим ПО, например Sybase предоставляет <a href=http://manuals.sybase.com/onlinebooks/group-asarc/srg1100e/snmpug/@Generic__BookView>SQL Server SNMP Subagent</a> вместе со своим сервером БД. Если сабагента нет, его можно создать самому. Проще всего сделать это с помощью библиотеки libnetsnmpagent (AgentX Library). Сгенерировать скелет агента можно с помощью программы mib2c, для этого надо иметь MIB файл, описывающий параметры которые нам предстоит мониторить. В состав пакета net-snmp входит скрипт net-snmp-config. Этот скрипт, запущенный с параметром &#8211;compile-subagent, позволяет легко скомпилировать вашу программу-сабагент.</p>
<pre>
% net-snmp-config --compile-subagent mysubagent nstAgentSubagentObject.c
generating the tmporary code file: netsnmptmp.12259.c
checking for init_nstAgentSubagentObject in nstAgentSubagentObject.c
init_nstAgentSubagentObject(void)
running: gcc  -Dlinux -I. -I/usr/local/include -o nstAgentSubagentObject
 netsnmptmp.12259.c  nstAgentSubagentObject.c -L/usr/local/lib
 -lnetsnmpagent -lnetsnmphelpers -lnetsnmpmibs -lnetsnmp
netsnmptmp.12259.c: In function `main':
netsnmptmp.12259.c:26: warning: implicit declaration
 of function `init_nstAgentSubagentObject'
removing the tmporary code file: netsnmptmp.12259.c
subagent program nstAgentSubagentObject created
</pre>
<p>В результате компиляции получится программа mysubagent. Эту программу следует запускать после старта snmpd. Для того что бы включить поддержку протокола AgentX в snmpd.conf следует добавить строку &laquo;master agentx&raquo;. Функционал сабагента, можно вынести в отдельную программу, а можно сделать частью вашей программы, как сделано, например, в <a href=http://tamkovich.com/asterisk/ >Asterisk</a>. Модуль, выполняющий функции сабагента в <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, называется res_snmp.
</p>
<h2>Создание модуля DLO (Dynamically Loadable Object)</h2>
<p align=justify>
Другой вариант расширения net-snmp &#8211; написание модуля, который будет динамически подгружаться во время запуска snmpd. Данный подход имеет свои преимущества и недостатки. К преимуществам можно отнести: доступность всего API snmpd внутри модуля, возможность использовать общие конфигурационные файлы, отсутствие необходимости следить за порядком запуска приложений (сначала snmpd, затем сабагент). Самый явный недостаток &#8211; ошибки в модуле могут скомпрометировать весь сервис snmpd.
</p>
<p align=justify>
Модуль DLO это программа, скомпилированная как разделяемый объект (SO). Существует ряд требований, которые должна удовлетворять данная программа. В программе должны присутствовать функции:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> init_nstAgentPluginObject <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>и обратная ей</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> deinit_nstAgentPluginObject <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Эти функции вызываются автоматически после загрузки и перед выгрузкой модуля. nstAgentPluginObject &#8211; это имя загружаемого модуля, будет различаться от модуля к модулю. Загрузить модуль можно двумя способами: через командную строку -</p>
<pre>
snmpd -f -L -DnstAgentPluginObject,dlmod
</pre>
<p>Или же с помощью специальной записи в snmpd.conf</p>
<pre>
dlmod nstAgentPluginObject /path/to/nstAgentPluginObject.so
</pre>
<p>Здесь второе поле &#8211; имя модуля. Для того что бы snmpd мог загрузить модуль, имя модуля должно быть корректным (совпадать с именами функций init_ и deinit_)
</p>
<h2>Расширение SNMPD с помощью скриптов</h2>
<p align=justify >
Пожалуй, самый распространённый способ представления собственных данных через snmpd &#8211; расширение с помощью скриптов. Для подключения скрипта к snmpd, в файл snmpd.conf необходимо добавить следующую строку:</p>
<pre>
pass .1.3.6.1.4.1.2021.255 /bin/sh /usr/local/bin/passtest
</pre>
<p>Данная строка состоит из 3х полей. 1 поле &#8211; ключевое слово &laquo;pass&raquo;, оно указывает snmpd на то, что все запросы, адресованные к веткам входящим в указанное дерево, передавать внешней программе. 2ое поле позволяет указать дерево, контроль над которым мы передаём. 3е поле, это программа и её параметры. Внешняя программа может быть написана на любом языке &#8211; это не имеет никакого значения. Единственное требование, предъявляемое к программе, &#8211; возможность принимать параметры из командной строки, и выводить результаты на стандартный вывод в определённом формате. SNMPd передает программе 2 параметра, 1ый может принимать значения &laquo;-s&raquo; или &laquo;-n&raquo;. Параметр &laquo;-s&raquo; означает, что никаких действий предпринимать не надо, параметр &laquo;-n&raquo; говорит о том, что за ним следует запрашиваемый OID. Рассмотрим логику работы и формат вывода на примере shell скрипта passtest, распространяемого вместе с net-snmp.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh -f</span>
&nbsp;
<span style="color: #007800;">PATH</span>=<span style="color: #007800;">$path</span>:<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ucb
&nbsp;
<span style="color: #007800;">PLACE</span>=<span style="color: #ff0000;">&quot;.1.3.6.1.4.1.2021.255&quot;</span>
<span style="color: #007800;">REQ</span>=<span style="color: #ff0000;">&quot;$2&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;$1&quot;</span> = <span style="color: #ff0000;">&quot;-s&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$*</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>passtest.log
  <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;$1&quot;</span> = <span style="color: #ff0000;">&quot;-n&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REQ</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
    <span style="color: #007800;">$PLACE</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>      <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.1 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #007800;">$PLACE</span>.1<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.2.1 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #007800;">$PLACE</span>.2.1<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.2.2 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #007800;">$PLACE</span>.2.2<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.3 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #007800;">$PLACE</span>.3<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.4 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #007800;">$PLACE</span>.4<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.5 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #007800;">$PLACE</span>.5<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.6 <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>           <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">else</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$REQ</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
    <span style="color: #007800;">$PLACE</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>         <span style="color: #007800;">RET</span>=<span style="color: #007800;">$REQ</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$RET</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$RET</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
  <span style="color: #007800;">$PLACE</span>.1<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;string&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;life the universe and everything&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #007800;">$PLACE</span>.2.1<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;integer&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #007800;">$PLACE</span>.2.2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;objectid&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;.1.3.6.1.4.42.42.42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #007800;">$PLACE</span>.3<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;timeticks&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;363136200&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #007800;">$PLACE</span>.4<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;ipaddress&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;127.0.0.1&quot;</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #007800;">$PLACE</span>.5<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;counter&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #007800;">$PLACE</span>.6<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;gauge&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;string&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;ack... <span style="color: #007800;">$RET</span> <span style="color: #007800;">$REQ</span>&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">;;</span>
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<p>Пример работы данного скрипта:</p>
<pre>
<b># /usr/local/bin/passtest -n .1.3.6.1.4.1.2021.255.1</b>
.1.3.6.1.4.1.2021.255.2.1
integer
42
</pre>
<p>Вывод скрипта, ожидаемый snmpd, состоит из 3х строк. Первая строка содержит следующий OID, причём она может содержать несуществующий, главное, что бы не зацикливалась. Вторая строка содержит тип возвращаемого значения, в нашем случае это integer (целое число), а всего возможно 7 типов: string, objectid, integer, timeticks, ipaddress, counter и gauge. Третья строка содержит значение, возвращенное для OID указанного при запуске скрипта. Расширение NET-SNMP с помощью внешних программ и директивы pass &#8211; самый простой и быстрый способ. Однако не стоит забывать об эффективности, для каждого отдельного OID, SNMPd вызовет указанный скрипт, такой подход может быть неприемлем для высоконагруженных систем.
</p>
<ul>
<li> <a href=http://net-snmp.sourceforge.net/wiki/index.php/TUT:Writing_a_Subagent >Tutorial: Writing a Subagent</a>
<li> <a href=http://openhpi.sourceforge.net/subagent-manual/c167.html >Understanding the sub-agent</a>
<li> <a href=http://net-snmp.sourceforge.net/wiki/index.php/TUT:Writing_a_Dynamically_Loadable_Object >Tutorial: Writing a Dynamically Loadable Object</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%2F10%2Fcustom-net-snmp%2F&amp;title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5%20NET%20SNMP" 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/2009/10/custom-net-snmp/feed/</wfw:commentRss>
		<slash:comments>2</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_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/2009/05/sending-sms-through-gsm-modem-rs232-usb/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

