Ruby voip

Post on 17-May-2015

4,538 views 4 download

Tags:

transcript

VOIP and Ruby

The Convergence of Web and Voice Applications using Open Source Software

Justin GrammensLocaltone Interactivejustin@localtone.com

VOIP is NOT About Cheap Phone Calls

Other companies are already doing this cheaper and better.

VOIP Applications!

It's about the applications that we can build!

What We Will Cover

➢ Why do VOIP now?

➢ Asterisk

➢ Adhearsion

➢ Telegraph

➢ Demos

Why Now?

Only recently has good Open Source Software been developed ( Rails / Asterisk )

Telecoms are slow to react

Few applications merge voice and web

Cell phone are everywhere!

Why Now?➢ 2.7 Billion mobile phones. 1.4 Billion fixed-lines.

➢ 1/3 of “Internet Users” access the internet from their mobile phone.

➢ iPhone has shown consumers why they need the interactive internet on their phone. Others will follow.

➢ Most phone users can be identified by a standardized numerical system.

VOIP / Web Analogy

Technology Web VOIPProtocol HTTP

FTPRTP

SIP – Industry StandardIAX – Asterisk SpecificH.323 – ObsoleteJingle – GtalkSkype - Proprietary

Codec gzip, jpg, gif,mp3, ogg, wma,flv, mpeg, avi

g.711 – high bandwidthgsm – medium bandwidthg.729 – low bandwidth

Interactivity

Server Apache / Lighttpd Asterisk, Freeswitch

CGIAGI – Asterisk Gateway InterfaceAMI – Asterisk Manager Interface

Asterisk

➢ + Open Source Private Branch Exchange (PBX)

➢ + Very powerful and flexible

➢ + Relatively Stable

➢ - Messy to deal with in terms of extending functionality.

➢ +++ Free!

Asterisk : Terminology➢ Channel – A channel is what can setup and receive calls.

➢ Dialplan – Script of what to do with a call. Written in the asterisk macro language.

➢ AGI – Stdin/out TCP method allowing external applications to dynamically write dialplans.

➢ AMI – Allows sending of commands and listen for stateful events.

Typical Voice System

PSTNNetwork

Origination/Termination

Server

VOIPClients

PSTN Network

AnalogInterface

Card

AsteriskServer

Rails

/

Adhearsion

/

Telegraph

SIP

SIP / IAX

Zaptel/ Other

AGI / AMI

Asterisk Dialplan Language[demo] ; Sample from Asterisk configuration extensions.conf file;; We start with what to do when a call first comes in.;exten => s,1,Wait(1) ; Wait a second, just for funexten => s,n,Answer ; Answer the lineexten => s,n,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 secondsexten => s,n,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10 secondsexten => s,n(restart),BackGround(demo-congrats) ; Play a congratulatory messageexten => s,n(instruct),BackGround(demo-instruct); Play some instructionsexten => s,n,WaitExten ; Wait for an extension to be dialed.

exten => 2,1,BackGround(demo-moreinfo) ; Give some more information.exten => 2,n,Goto(s,instruct)

exten => 3,1,Set(LANGUAGE()=fr) ; Set language to frenchexten => 3,n,Goto(s,restart) ; Start with the congratulations

exten => 1000,1,Goto(default,s,1)

Difficulties in Asterisk

➢ Conditional Loops➢ Complex Data

Structure➢ Database / LDAP

Integration➢ Extending the

language➢ Portability - Asterisk

v.s Freeswitch, etc.

➢ Error Handling➢ Date and time

handling➢ RegEx Pattern

Matching➢ Variables➢ Object Oriented

Design

Ruby / Asterisk Integration Tools➢ RAGI – Just for AGI. Not integrated with Rails. No longer active.

➢ RAMI – Just for Management Interface. No Rails Integration. Not Active.

➢ Adhearsion – Active. Good for writing pure voice applications. Not tied with Rails (but can be without too much effort).

➢ Telegraph – Active. Tightly integrated with Rails. Embraces the Voice/Web Analogy.

Adhearsion

Standalone server that talks with Asterisk

Developed by Jay Phillips of Codemecca

Open Source

Current version is 0.7.7

Development on 0.8 is nearly complete. Lots of new changes.

Adhearsion

Put the line below in extensions.confTells Asterisk to process all calls by our

Adhearsion server

exten => _X.,1,Agi(agi://127.0.0.1)

or... when extension 888 is dialed.

exten => 888,1,Agi(agi://127.0.0.1)

Adhearsion - dialplan.rbadhearsion { play %w(press-1 for minneapolis press-2 for chicago or press-3 for dallas weather otherwise-press 4) selection = input() w = new_weather case selection when '1' then play w.weather_report("Minneapolis, MN") when '2' then play w.weather_report("Chicago, IL") when '3' then play w.weather_report("Dallas, TX") else simon = new_simon_game simon.start end}

Adhearsion - Demos

Asterisk

extensions.conf

[ adhearsion ]

exten => 8000,1,Agi(agi://...)

SIP PhoneXLite Adhearsion

dialplan.rb

adhearsion {code..code..

}

Adhearsion - Demo

Notes:Start up Asterisk : sudo asteriskShow asterisk CLI.

Start up Adhearsion 0.8 Server :~/development/adhersion/trunk/bin/ahn start .in the rumadhearsion directory

Point Xlite Phone to Localhost dial extension 8000

Adhearsion – Weather Demo

Demo #1 - Weather - Parses data from Yahoo RSS feed <yweather:forecast day="Mon" date="31 Dec 2007" low="6" high="19" text="Flurries" code="13" />

rep = %W(weather is-currently #{w.current.temp} degrees today high #{today.high} low #{today.low}) + w.current.desc

Adhearsion – Simon Says

Demo #2 - Play Simon Says Game

def verify_attempt if attempt_correct? call_context.play 'good' else call_context.play %W(#{number.size - 1} times wrong-try-again-smarty) reset end end

Adhearsion

● Write Ruby in our dial plans!

● Ability to use any Ruby gems we need (Active Record, etc.)

● Test and debug our application in isolation.

● Bring OO practices to VOIP development

Adhearsion

● It's abstracted and portable across other PBXes

● It's simple● It's extensible● It's readable● It's maintainable● It's fun!

Adhearsion

Where's the Rails?

Not directly integrated with Rails – by choice. Written to stand on it's own, but you can link in

your models using ActiveRecord.

Looking for VOIP in the MVC framework?Look no further than Telegraph...

Telegraph➢Written by a company named Idapted.

➢Extracted from production application ( Idapted's distributed voice system for English language learning – EnglishQuad )

➢ Started with RAGI / RAMI

➢ Tightly Integrated with the Rails/Web Interface

➢ They claim it “embraces the Voice/Web analogy”

Telegraph

Installs into any Rails project as a plugin

script/plugin install svn://rubyforge.org/var/svn/telegraph/trunk

start up the server

script/agi_server – Interfaces with the gateway (incoming calls)script/ami_server – Interfaces with the Asterisk manager

Telegraph – Banking Demo

Asterisk

SIP PhoneXLite

RailsApplication

AGI Server

Telegraph

Add this to your extensions.confexten => s, n, AGI(agi://localhost/account)

respond_to do |wants| #r index.html wants.html { render } # Telegraph allows render_voice

# which uses the index.voice file wants.voice{ render_voice }end

Banking Demo

index.voice:

voice.play "welcome-to-demo #{say_amount(@balance)}"

voice.link_to_dtmf 'banking-main-menu' do link 1, :action=>'new' link 2, :action=>'list' link :default, :action=>'index'end

Telegraph - Demo

Start up telegraph server : telegraph/banking_demo

ruby script/asterisk_serverruby script/server

Visit http://localhost:3000/account

Dial Extension 9000

Real World Application

eStaraOffers a service where a

user browsing a site can enter their phone number. The system will dial their number, ask the person to hold and then dial customer service.

We'll do this.

Demo Topology

Asterisk

Rails Application

AGI

AMI

CellPhone Origination/

TerminationServer

PSTN Internet

Demos:1. Using the browser to initiate phone call.2. “Who Wants To Be A Billionaire” game.

Demo – Using PSTN➢Telegraph Demos - ➢ Use the browser to initiate a wakeup call.➢ Use the browser to initiate phone calls to 10 digit phone numbers and bridge the calls➢ Use the browser to initiate a call and verify correct code was entered.

➢Adhearsion Demo -➢ Adhearsion – My “Who Wants To Be A Billionaire” application.

Resources

http://rubyhoedown2007.confreaks.com/session03.html

http://www.slideshare.net/jpalley/respondto-voice-the-convergence-of-voice-and-web-interfaces-with-rails-and-asterisk

http://adhearsion.com/

http://telegraph.rubyforge.org

http://www.voip-info.org