43
ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 1 Samstag, 5. Juni 2010

ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

ASTERISK & PHPHans-Christian Otto

International PHP Conference 2010 SEBerlin, June 1, 2010

1Samstag, 5. Juni 2010

Page 2: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

ABOUT ME

PHP since 2004

Asterisk since 2007

working as a freelancer for various companys

computer science student at TU Dortmund

active member of phpugdo

2Samstag, 5. Juni 2010

Page 3: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

… AND YOU?

3Samstag, 5. Juni 2010

Page 4: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

ASTERISK open source PBX

actually dual-licensed

created by Mark Spencer in 1999

runs on *nix and windows

VoIP

ISDN

bluetooth

and more

4Samstag, 5. Juni 2010

Page 5: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

InterAsterisk eXchange

Session Initiation Protocol

H.323

UNIStim

Voice over Frame Relay-Protokoll

SCCP

SS7

Euro-ISDN (DSS1)

4ESS

QSIG

DMS100

Lucent 5E Distributed Switching

National ISDN2

NFAS

Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: May 28, 2010, 10:49 pm UTC. URL: http://de.wikipedia.org/w/index.php?title=Asterisk_(Telefonanlage)&oldid=74905428

5Samstag, 5. Juni 2010

Page 6: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

FEATURES

music on hold

voicemail

phone conferences

IVR

speech recognition

„follow me“

scriptable

AstDB

queues

call parking

pickup

6Samstag, 5. Juni 2010

Page 7: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

USE CASES

7Samstag, 5. Juni 2010

Page 8: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

DIALING

8Samstag, 5. Juni 2010

Page 9: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

INCOMING CALLS9Samstag, 5. Juni 2010

Page 10: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

MISSED CALLS10Samstag, 5. Juni 2010

Page 11: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

SOME TERMS

device

dialplan

extension

context

channel

11Samstag, 5. Juni 2010

Page 12: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

DEVICES

SIP peers

SIP phones

softclients

legacy phones using ATA

sip providers

isdn phones

IAX peers

bluetooth devices

etc.

12Samstag, 5. Juni 2010

Page 13: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

DIALPLAN

contexts

extension

priority

applications

macros

control structures

13Samstag, 5. Juni 2010

Page 14: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

SIP.CONF [alice]

type=friend

context=from-sip

secret=passwordAlice

host=dynamic

disallow=all

allow=ulaw

allow=alaw

[bob]

type=friend

context=from-sip

secret=passwordBob

host=dynamic

disallow=all

allow=ulaw

allow=alaw14Samstag, 5. Juni 2010

Page 15: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

EXTENSIONS.CONF

exten => 10,1,Dial(SIP/alice&SIP/bob)exten => 11,1,Dial(SIP/alice)exten => 11,hint,SIP/aliceexten => 12,1,Dial(SIP/bob)

exten => 81,1,Answer()exten => 81,2,AGI(weather.agi)exten => 81,3,Hangup()

[from-sip]

15Samstag, 5. Juni 2010

Page 16: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

IVR

exten => 90,1,Answer()exten => 90,n,Playback(marryme)

exten => 1,1, Playback(thank-you-cooperaation)exten => 1,n, Hangup()

exten => 2,1, Playback(sorry)exten => 2,n, Hangup()

16Samstag, 5. Juni 2010

Page 17: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

CONTROL STRUCTURES

exten => 123,1,Answer

exten => 123,n,Set(i=1)

exten => 123,n,While($[${i} < 5])

exten => 123,n,SayNumber(${i})

exten => 123,n,Set(i=$[${i} + 1])

exten => 123,n,EndWhile

17Samstag, 5. Juni 2010

Page 18: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

AEL

context ael-demo { 123 => { Answer(); for (x=0; ${x} < 5; x=${x} + 1) { SayNumber(${x}); };}

18Samstag, 5. Juni 2010

Page 19: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

LUAfunction demo_start(context, exten) app.wait(1) app.answer() demo_congrats(context, exten)endextensions = { demo = { s = demo_start; ["2"] = function() app.background("demo-moreinfo") demo_instruct() end; }}

19Samstag, 5. Juni 2010

Page 20: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

FUNFACTAEL and extensions.conf support goto for a long time ;-)

20Samstag, 5. Juni 2010

Page 21: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

PHP?

dialplan

AGI

FastAGI

AMI

AJAM

callfiles

21Samstag, 5. Juni 2010

Page 22: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

STATE OF ASTERISK & PHP

multiple php libraries

freepbx

22Samstag, 5. Juni 2010

Page 23: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

USE CASES

23Samstag, 5. Juni 2010

Page 24: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

DIALING SUCKS. dialing results in …

missdialing

procrastination; not misdialing calls (laziness)

using (more expensive) cellphones

solution: computer based dialing

AMI

callfiles

24Samstag, 5. Juni 2010

Page 25: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

CALLFILES

text files initiating a call

key-value pairs

placed in a special directory

watched by asterisk

schedule calls by mtime modification

Channel: SIP/aliceContext: from-sipExtension: 12Priority: 1WaitTime: 30 RetryTime: 60 MaxRetries: 2

25Samstag, 5. Juni 2010

Page 26: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

<?php$filename = tempnam( '/var/spool/asterisk/tmp/', 'callfile');file_put_contents($filename, $callFile);touch($filename, time() + 60);rename( $filename, tempnam( '/var/spool/asterisk/outgoing/', 'callfile' ));

26Samstag, 5. Juni 2010

Page 27: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

INCOMING CALL

display notifications

on client computers

using funny gadgets (emergency lights, anyone?)

turn off espresso maker (so your staff gets back to work)

entertain caller

log (missed) calls

visualize in CRM27Samstag, 5. Juni 2010

Page 28: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

CDR

log all calls

different output modules

csv

mysql

etc.

28Samstag, 5. Juni 2010

Page 29: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

CDR_MYSQL.CONF

[global]

hostname = localhost

dbname=asteriskcdrdb

password = amp109

user = asteriskuser

userfield=1

29Samstag, 5. Juni 2010

Page 30: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

calldate: 2010-05-29 11:26:18

clid: "Extern: 123" <123>

src: 123

dst: 31

dcontext: from-internal

channel: SIP/9-09bde8f8

dstchannel: SIP/31-09bb7550

lastapp: Dial

lastdata: SIP/31|20

duration: 22

billsec: 11

disposition: ANSWERED

amaflags: 3

accountcode:

uniqueid: 1275125178.20185

userfield:

30Samstag, 5. Juni 2010

Page 31: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

AGI

executables

chmod +x & shebang

receive variables through STDIN

just like HTTP-headers, Key: Value

send commands through STDOUT

fwrite(STDOUT,"EXEC Playback tt-allbusy \"\"\n");

PHPAGI

31Samstag, 5. Juni 2010

Page 32: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

A SIMPLE AGI

#!/usr/bin/env php<?phprequire 'phpagi/phpagi.php';$agi = new AGI();$agi->text2wav('Please enter the PIN.');$pin = $agi->get_data( 'beep', 5000, 4 );if( $pin['result'] != '2342' ) { $agi->text2wav('The entered pin was wrong.');} else { start_servers($agi);}

32Samstag, 5. Juni 2010

Page 33: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

A SIMPLE AGI

function start_servers($agi){

$agi->text2wav('Which server should be started?'); $server = $agi->menu(array( '1' => '*Press 1 for CRM', '2' => '*Press 2 for ERP', )); $agi->text2wav('Waking up server ' . $server); WakeOnLan($server);}

33Samstag, 5. Juni 2010

Page 34: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

WHO‘S CALLING?#!/usr/bin/env php<?phprequire 'phpagi/phpagi.php';$agi = new AGI();$cid = $agi->getVariable('callerid(name)');if(!$cid['result']) exit;$agi->set_callerid(sprintf( '"%s"<%d>', lookupNameByNumber($cid['data']), $cid['data']));

34Samstag, 5. Juni 2010

Page 35: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

WHO‘S CALLING?

exten => 11,1,AGI(callerid_lookup)exten => 11,2,Dial(SIP/alice)

35Samstag, 5. Juni 2010

Page 36: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

PHP & PHONES

XML browser

directory lookup

missed call list

busy lamp field

„action buttons“

36Samstag, 5. Juni 2010

Page 37: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

BUSY LAMP FIELD

indicates status of phones using „hints“

available

ringing

busy/unavailable

can indicate „devstate“

37Samstag, 5. Juni 2010

Page 38: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

DEVSTATE

can be controlled using

dialplan

exten => 23,n,Set(DEVSTATE(Custom:foo) = RINGING)

cli command

devstate change Custom:foo RINGING

AMI

38Samstag, 5. Juni 2010

Page 39: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

DEVSTATE: USECASES

presence

non-phone indicators

escalating support ticket

system status (nagios?)

build failures? ;-)

39Samstag, 5. Juni 2010

Page 40: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

MISSED CALLS

common asterisk issue: missed calls

possible solution: CDR / AGI and XML application / webgui

40Samstag, 5. Juni 2010

Page 41: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

CONCLUSION

PHP can …

originate calls

interact with calls

interact with caller

interact with callee

analyze logs

enrich phones41Samstag, 5. Juni 2010

Page 42: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

CONTACT

http://hans-christian-otto.de/

[email protected]

@muhdiekuh

muh-die-kuh @ euIRC / freenode

42Samstag, 5. Juni 2010

Page 43: ASTERISK & PHP · ASTERISK & PHP Hans-Christian Otto International PHP Conference 2010 SE Berlin, June 1, 2010 Samstag, 5. Juni 2010 1

FURTHER REFERENCES

http://das-asterisk-buch.de/ (german, source for some examples)

http://www.the-asterisk-book.com/

http://eder.us/projects/phpagi/

http://www.voip-info.org/

http://www.asterisk.org/

43Samstag, 5. Juni 2010