<?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>coding &#187; sms</title>
	<atom:link href="http://www.coding.com.br/tag/sms/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coding.com.br</link>
	<description>have you coded today?</description>
	<lastBuildDate>Thu, 18 Aug 2011 17:29:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Enviando SMS no GNU/Linux</title>
		<link>http://www.coding.com.br/programacao/enviando-sms-no-gnulinux/</link>
		<comments>http://www.coding.com.br/programacao/enviando-sms-no-gnulinux/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 03:15:46 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sms]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=222</guid>
		<description><![CDATA[Essa semana vi no blog do Mauro Martins um post sobre mandar SMS a partir do Excel (recomendo ler lá antes). Fiquei curioso, mas por opção resolvi utilizar apenas o GNU/Linux. O exemplo a seguir pode ser feito utilizando qualquer sistema Linux, a linguagem Python (com o módulo do PySerial instalado) e um celular smartphone [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Essa semana vi no <a title="Post inspirador" href="http://mauromartins.wordpress.com/2009/09/08/mandar-sms-a-partir-do-excel/" target="_blank">blog</a> do Mauro Martins um <em>post</em> sobre mandar SMS a partir do Excel (recomendo ler lá antes). Fiquei curioso, mas por opção resolvi utilizar apenas o GNU/Linux. O exemplo a seguir pode ser feito utilizando qualquer sistema Linux, a linguagem Python (com o módulo do <a href="http://www.coding.com.br/programacao/pyserial-utilize-o-python-para-controlar-a-interface-serial/" target="_blank">PySerial</a> instalado) e um <span style="text-decoration: line-through;">celular</span> <em>smartphone</em> da Nokia (nesse caso um <a title="N95 specs" href="http://www.gsmarena.com/nokia_n95-1716.php" target="_blank">N95</a>). O primeiro passo foi conectar o cabo USB e escolher o modo <strong>PC Suite</strong>.</p>
<p style="text-align: justify;">No terminal:</p>
<pre># lsusb | grep Nokia
Bus 005 Device 004: ID 0421:04f0 Nokia Mobile Phone</pre>
<p style="text-align: justify;">É preciso carregar os módulos necessários, se você precisar compilar o kernel são as opções CONFIG_USB_ACM e CONFIG_USB_SERIAL do .config</p>
<pre># modprobe cdc-acm
# modprobe usbserial vendor=0x0421 product=0x04f0</pre>
<p style="text-align: justify;">Observe que os valores dos parametros do módulo usbserial são obtidos através do comando lsusb. A partir desse ponto será criado um <em>device node</em> referenciado por /dev/ttyACM0. O código é bem simples, aonde apenas instanciamos um objeto da classe PySerial e utilizamos os métodos de escrita e leitura.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> serial
ser = serial.<span style="color: black;">Serial</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
ser.<span style="color: black;">port</span>=<span style="color: #483d8b;">'/dev/ttyACM0'</span>
ser.<span style="color: black;">baudrate</span>=<span style="color: #ff4500;">19200</span>
ser.<span style="color: black;">rtscts</span>=<span style="color: #ff4500;">1</span>
ser.<span style="color: black;">timeout</span>=<span style="color: #ff4500;">3</span>
ser.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Depois foi apenas usar os métodos write() e read() para fazer a prova do conceito. Como eu não sabia a quantidade de bytes a serem recebidos &#8220;chutei&#8221; um valor (10 bytes) e especifiquei um <em>timeout</em> para sair.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AT'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># AT</span>
ser.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">O exemplo de envio de um SMS que o Mauro apresentou pode ser feito dessa forma, lembrando que a extensão &#8216;\x0d\x0a&#8217; é o valor hexadecimal para o terminador de linha (o equivalente a pressionar [ENTER]).</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AT+CMGF=1'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AT+CMGS=&quot;0XXYYYYYYYY&quot;'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'www.coding.com.br'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a<span style="color: #000099; font-weight: bold;">\x</span>1a'</span><span style="color: black;">&#41;</span>
 <span style="color: #808080; font-style: italic;"># envia a mensagem (www.coding.com.br) para o número definido</span></pre></div></div>

<p style="text-align: justify;">Meus primeiros testes só funcionaram quando dei um atraso (não se esqueça do <em>import time</em>) entre cada comando, abritrariamente escolhi 2 segundos, mas acredito que esse valor possa ser menor (fiz testes e funcionou). Passei uma boa parte da noite experimentando diversos comandos AT que encontrei no <a title="Lista de comandos AT (em inglês)" href="http://sw.nokia.com/id/95672052-6c77-488d-a055-acef77e4cdc5/AT_Command_Set_For_Nokia_GSM_And_WCDMA_Products_v1_2_en.pdf" target="_blank">manual</a>, os comandos de faziam a requisição de alguma informação: nível do sinal, número de série, fabricante, etc funcionaram, mas quando tentei fazer uma requisição da lista de contatos ou das mensagens SMS não obtive sucesso (mas é claro que fiz testes rápidos sem dar atenção merecida a documentação).</p>
<p style="text-align: justify;">Uma solução para fazer o equivalente no Excel é exportar a planilha no formato <a title="Explicação da Wikipedia sobre o fomarto CSV" href="http://pt.wikipedia.org/wiki/Comma-separated_values" target="_blank">CSV</a> e fazer um parser (lembrando que o Python já tem um <a href="http://docs.python.org/library/csv" target="_blank">módulo</a> pronto que faz isso) ou então até mesmo fazer um<em> plug-in</em> para o OpenOffice <img src='http://www.coding.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/programacao/enviando-sms-no-gnulinux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
