<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: texting code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 18 May 2008 13:56:54 GMT</pubDate>
    <description>DZone Snippets: texting code</description>
    <item>
      <title>Send and receive SMS text messages with Ruby and a GSM/GPRS modem</title>
      <link>http://snippets.dzone.com/posts/show/3647</link>
      <description>&lt;code&gt;require 'serialport'&lt;br /&gt;require 'time'&lt;br /&gt;&lt;br /&gt;class GSM&lt;br /&gt;  &lt;br /&gt;  SMSC = "+447785016005"  # SMSC for Vodafone UK - change for other networks&lt;br /&gt;&lt;br /&gt;  def initialize(options = {})&lt;br /&gt;    @port = SerialPort.new(options[:port] || 3, options[:baud] || 38400, options[:bits] || 8, options[:stop] || 1, SerialPort::NONE)&lt;br /&gt;    @debug = options[:debug]&lt;br /&gt;    cmd("AT")&lt;br /&gt;    # Set to text mode&lt;br /&gt;    cmd("AT+CMGF=1")&lt;br /&gt;    # Set SMSC number&lt;br /&gt;    cmd("AT+CSCA=\"#{SMSC}\"")    &lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def close&lt;br /&gt;    @port.close&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def cmd(cmd)&lt;br /&gt;    @port.write(cmd + "\r")&lt;br /&gt;    wait&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def wait&lt;br /&gt;    buffer = ''&lt;br /&gt;    while IO.select([@port], [], [], 0.25)&lt;br /&gt;      chr = @port.getc.chr;&lt;br /&gt;      print chr if @debug == true&lt;br /&gt;      buffer += chr&lt;br /&gt;    end&lt;br /&gt;    buffer&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def send_sms(options)&lt;br /&gt;    cmd("AT+CMGS=\"#{options[:number]}\"")&lt;br /&gt;    cmd("#{options[:message][0..140]}#{26.chr}\r\r")&lt;br /&gt;    sleep 3&lt;br /&gt;    wait&lt;br /&gt;    cmd("AT")&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  class SMS&lt;br /&gt;    attr_accessor :id, :sender, :message, :connection&lt;br /&gt;    attr_writer :time&lt;br /&gt;    &lt;br /&gt;    def initialize(params)&lt;br /&gt;        @id = params[:id]; @sender = params[:sender]; @time = params[:time]; @message = params[:message]; @connection = params[:connection]&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def delete&lt;br /&gt;      @connection.cmd("AT+CMGD=#{@id}")&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def time&lt;br /&gt;      # This MAY need to be changed for non-UK situations, I'm not sure&lt;br /&gt;      # how standardized SMS timestamps are..&lt;br /&gt;      Time.parse(@time.sub(/(\d+)\D+(\d+)\D+(\d+)/, '\2/\3/20\1'))&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def messages&lt;br /&gt;    sms = cmd("AT+CMGL=\"ALL\"")&lt;br /&gt;    # Ugly, ugly, ugly!&lt;br /&gt;    msgs = sms.scan(/\+CMGL\:\s*?(\d+)\,.*?\,\"(.+?)\"\,.*?\,\"(.+?)\".*?\n(.*)/)&lt;br /&gt;    return nil unless msgs&lt;br /&gt;    msgs.collect!{ |m| GSM::SMS.new(:connection =&gt; self, :id =&gt; m[0], :sender =&gt; m[1], :time =&gt; m[2], :message =&gt; m[3].chomp) } rescue nil&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destination_number = "+44 someone else"&lt;br /&gt;&lt;br /&gt;p = GSM.new(:debug =&gt; false)&lt;br /&gt;&lt;br /&gt;# Send a text message&lt;br /&gt;p.send_sms(:number =&gt; destination_number, :message =&gt; "Test at #{Time.now}")&lt;br /&gt;&lt;br /&gt;# Read text messages from phone&lt;br /&gt;p.messages.each do |msg|&lt;br /&gt;  puts "#{msg.id} - #{msg.time} - #{msg.sender} - #{msg.message}"&lt;br /&gt;  # msg.delete&lt;br /&gt;end&lt;/code&gt;</description>
      <pubDate>Thu, 08 Mar 2007 11:41:34 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3647</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
  </channel>
</rss>
