Nieuwe tutorials

Heb twee nieuwe tutorials gemaakt mbt. het opzetten van een server waarmee je kan (video)bellen met SIP clients en WebRTC clients zoals Google Chrome.

Installing webrtc2sip on Ubuntu 12.04
Asterisk and sipml5 interoperability

En ja, ze zijn in het Engels vanwege wat verzoeken vanuit de Doubango community. Bovendien gebeurt er in Nederland nog bar weinig op het gebied van WebRTC.

Nieuwe tutorials

WebRTC en WebSocket: webrtc2sip ftw!

Sinds Google WebRTC geopensourced heeft en er diverse drafts zijn opgesteld mbt. de standaardisatie van WebRTC als API door het W3C consortium wint WebRTC steeds meer terrein en is het inmiddels een hot topic geworden. Steeds meer bedrijven (ook grote multinationals) gaan er mee aan de slag en zien er grote kansen in.

WebRTC (Web Real-Time Communication) is een API die real-time communicatie in de browser mogelijk maakt, zonder plug-ins, add-ons of Flash. Denk bij real-time communicatie aan o.a. telefonie, chatten en videoconferencing.

WebSocket is een redelijk nieuwe API met bijbehorend protocol die het mogelijk maakt om TCP verkeer twee kanten op te sturen over één TCP verbinding en als je dit implementeert in een browser dan wordt het mogelijk voor applicaties om allerlei TCP verkeer heen en weer te sturen, zoals bijv. SIP verkeer.

Wat nu als je deze twee recente technologieën combineert met behulp van een derde nieuwe technologie, HTML5, en de mogelijkheden van JavaScript? Dat dachten ze bij Doubango ook en afgelopen voorjaar lanceerden ze hun sipml5 SIP client waarmee je vanuit een browser die WebRTC en WebSocket ondersteunt naar andere SIP clients kan bellen die WebRTC kunnen verstaan. Helaas is het aantal SIP clients dat het bij WebRTC horende mediaprofiel ondersteunt nogal klein, eigenlijk geldt dit alleen voor de SIP clients van Doubango zelf (zoals IMSDroid, iDoubs en sipml5). Dus in de praktijk had je er niet zo gek veel aan.

Recentelijk is daar met de release van webrtc2sip van Doubango drastisch verandering in gekomen. webrtc2sip maakt het mogelijk welke SIP client dan ook met elkaar te verbinden, ongeacht of deze nu WebRTC ondersteunt of niet. Dit maakt het dus mogelijk om conventionele SIP clients zoals bijv. Linphone te laten communiceren met sipml5. Vanaf je mobiele telefoon kun je nu dus heel gemakkelijk videobellen naar iemand die op een website ingelogd is in Google Chrome (of straks Firefox 18). Niks add-ons, niks plug-ins, niks Flash.

Op mijn werk stuitten we eigenlijk bij toeval op sipml5 en de hele infrastructuur daarachter bij het zoeken naar een alternatief voor bellen vanuit de browser mbv. Flash. Verschillende klanten hadden hier om gevraagd echter kregen we de boel niet goed aan de praat. Inmiddels heb ik een webrtc2sip server gebouwd en is er een webapplicatie met bijbehorende apps in ontwikkeling. Dit werkt zo veel beter dat de benaderde klanten vooralsnog enthousiast zijn. Nu hoeven ze geen aparte applicaties meer te installeren maar kunnen ze vanuit hun browser de werkzaamheden doen waarvoor ze videobellen nodig hebben (denk aan alarmcentrales of webconsults).

Binnenkort biedt ook Firefox ondersteuning voor WebRTC aan (vanaf versie 18) wat betekent dat straks meer dan de helft van de gebruikte browsers op het internet WebRTC aankan. Oftewel, WebRTC zit in een momentum en als ik de auteur van bloggeek.me mag geloven zal dat het nodige gaan veranderen in de VoIP business.

WebRTC en WebSocket: webrtc2sip ftw!

VoIP updateje

Alles werkt perfect en pas vorige week heb ik na 7 maanden mijn VoipBuster credit aan moeten vullen. Dat kost iets meer dan €12,- dus VoipBuster heeft zo’n €1,75 per maand gekost. Via Ziggo verbelden we voorheen gemiddeld ruim €11,- per maand en op jaarbasis besparen we zo dus meer dan €100,-. Gesprekskwaliteit is over het algemeen redelijk tot goed dus je hoort ons niet klagen.

VoIP updateje

Kan het nóg goedkoper?

Ja dat kan bij Allobox.

Bizar lage tarieven, misschien een optie voor het bellen naar mobiele nummers via VoIP ipv. een Betamax/Dellmont kloon. Mobiele nummers bellen we nu via InterVoip maar hun tarieven liggen hoger dan die van Allobox.

Jeetje, je bent eigenlijk gek als je nog via een traditionele telecomboer belt. Vooral als je weet dat een aantal van hen (zoals Ziggo) het telefoonverkeer ook over internet gooit.

Edit: een andere zeer goedkope optie is Globe7.

Kan het nóg goedkoper?

Contact!

Na het aansluiten van alle spullen kon ik mijn vader wel bellen maar hij kon niet uitgaand bellen via VoIP. ngrep erop losgelaten en met behulp van TeamViewer en Zoiper op mijn vader z’n PC gaan troubleshooten. Kwam erachter dat ik mijn Asterisk bakje als outbound proxy had moeten instellen op de N300A IP van mijn ouders, alsnog ingesteld via TeamViewer en toen werkte het prima. Kwaliteit is verassend goed ondanks de trage ADSL verbinding van mijn ouders.

Contact!

Centrale’tje spelen

M’n ouders gaan ook bellen via mijn Asterisk centrale’tje. Eerst een VoipBuster en InterVoip account voor ze aangemaakt, niet alleen om de boel gescheiden te houden. In het geval van VoipBuster bijvoorbeeld kun je wel meerdere gesprekken tegelijkertijd voeren maar alleen het eerst opgezette gesprek is dan gratis. Dus mocht ik aan het bellen zijn via VoipBuster en m’n ouders gaan ook bellen via die trunk dan moeten zij wel betalen. Dus ik laat nu alles via gescheiden trunks gaan.

/etc/asterisk/contexts/pstn-out.conf

[pstn-out]

; Nationaal
exten => _0ZXXXXXXXX,1,NoOp(${CALLERID(num)} belt nationaal)
 same => n,GotoIf($[${CALLERID(num)} = 123]?ouders:wij)
 same => n(ouders),Dial(SIP/0033${EXTEN:1}@voipbuster-ouders)
 same => n,Hangup()
 same => n(wij),Dial(SIP/0031${EXTEN:1}@voipbuster-wij)
 same => n,Hangup()

; Internationaal
exten => _00X.,1,NoOp(${CALLERID(num)} belt internationaal)
 same => n,GotoIf($[${CALLERID(num)} = 123]?ouders:wij)
 same => n(ouders),Dial(SIP/${EXTEN}@voipbuster-ouders)
 same => n,Hangup()
 same => n(wij),Dial(SIP/${EXTEN}@voipbuster-wij)
 same => n,Hangup()

; Mobiel
exten => _06X.,1,NoOp(${CALLERID(num)} belt mobiel)
 same => n,GotoIf($[${CALLERID(num)} = 123]?ouders:wij)
 same => n(ouders),Dial(SIP/0033${EXTEN:1}@intervoip-ouders)
 same => n,Hangup()
 same => n(wij),Dial(SIP/0031${EXTEN:1}@intervoip-wij)
 same => n,Hangup()

; Mobiel NL => FR
exten => _00336X.,1,NoOp(${CALLERID(num)} belt Frankrijk mobiel)
 same => n,Dial(SIP/${EXTEN}@intervoip-wij)
 same => n,Hangup()

; Mobiel FR => NL
exten => _00316X.,1,NoOp(${CALLERID(num)} belt Nederland mobiel)
 same => n,Dial(SIP/${EXTEN}@intervoip-ouders)
 same => n,Hangup()

; Regionaal
exten => _[2-8]XXXXX,1,NoOp(${CALLERID(num)} belt regionaal)
 same => n,Dial(SIP/0031XXX${EXTEN}@voipbuster-wij)
 same => n,Hangup()

M’n ouders hadden al een Siemens Gigaset C300 DECT telefoon dus heb bij bol.com een N300A IP basisstation besteld en deze ingeregeld en opgestuurd. Dus ze hoeven alleen maar de snoertjes erin te steken, de handset af te melden bij hun huidige basisstation en te registreren op de N300A IP en klaar. Hopelijk.

Mocht het goed werken, waar ik wel vanuit ga, dan kunnen mijn ouders een hoop besparen. Ze bestieren een camping in Zuid-Frankrijk en bellen aardig wat af, vooral naar Nederlandse en andere internationale nummers. Bottlenecks zijn er wel, m’n ouders hebben dan wel ADSL maar omdat ze zo ver van de centrale afzitten komen ze niet verder dan 512 kb up. Gelukkig neemt VoIP verkeer niet zo veel bandbreedte in beslag en Skypen met video lukte redelijk dus zal VoIP ook wel werken.

Centrale’tje spelen

Bellen naar mobiele nummers via VoIP

Goedkoop bellen naar vaste nummers is allemaal wel mooi, maar hoe zit het met mobiele nummers? Even de progx.ch site raadplegen en dan blijkt dat InterVoip, ook weer een Betamax/Dellmont vehikel maar specifiek voor bellen naar mobiele nummers, het allergoedkoopst is. Dus account aangemaakt, wat credit gestort, trunk aangemaakt en we kunnen nu ook heel goedkoop naar mobiele nummers bellen.

Bellen naar mobiele nummers via VoIP

Gratis Nederlands nationaal nummer!

Bij 12connect.com kun je gratis een account aanmaken waar een 085 DID nummer aan gekoppeld zit. Accountje aangemaakt en daarna een inbound SIP trunk opgezet op mijn Asterisk server.

/etc/asterisk/register/12connect.conf

register => gebruikersnaam12connect:wachtwoord12connect@vpbx.12connect.com/extensienummer

/etc/asterisk/trunks/12connect.conf

[12connect](peers-template)
context=pstn-in
host=vpbx.12connect.com

/etc/asterisk/templates/peers.conf

[peers-template](!)
insecure=port,invite
qualify=yes
type=peer
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
allow=g722
allow=g729
dtmfmode=rfc2833

Gratis Nederlands nationaal nummer!

Gratis Frans nationaal telefoonnummer!

Op fixe2mob.com kun je een gratis Frans nationaal telefoonnummer aanvragen die je kunt gebruiken met bijvoorbeeld je Asterisk PBX. Zulke nummers worden ook wel DID’s genoemd (Direct inward dialing). We hadden thuis al een Nederlands regionaal DID nummer via Budgetphone maar dat kost een tientje per jaar. Het Franse DID nummer dat we nu hebben is echter helemaal gratis. Heb gelijk een SIP trunk aangemaakt op onze eigen PBX en we zijn nu dus ook bereikbaar op onze huistelefoon met dit Franse nummer. Scheelt weer voor m’n ouders, hoeven ze niet meer naar ons Nederlandse nummer te bellen.

Gratis Frans nationaal telefoonnummer!

Asterisk configuratie

We bellen nu thuis via Voipbuster aangezien dat gewoon de goedkoopste aanbieder is. Tientje ex. BTW en dan kun je vier maanden gratis bellen naar een aantal landen (waaronder Nederland en Frankrijk waar mijn ouders wonen). Na die vier maanden ga je de normale tarieven betalen maar die zijn nog steeds zeer aantrekkelijk. Neem Frankrijk, bij Ziggo kost dat €0,08 per minuut met een starttarief van eveneens €0,08. Bij Voipbuster €0,015 en géén starttarief! Ok, bij Voipbuster ronden ze af op de minuut en bij Ziggo rekenen ze per seconde maar dan nog scheelt bellen met Voipbuster aanzienlijk. Bij Voipbuster kun je echter géén lokaal telefoonnummer aanvragen dus dat heb ik bij Budgetphone gedaan. Niet dat dat echt nodig is maar het prepaid abbo van Budgetphone met een lokaal nummer is zo goedkoop (ook een tientje per jaar) dat ik het maar heb aangeschaft, op deze manier kan ik ook thuis lekker klooien met Asterisk en meerdere trunks van verschillende VoIP aanbieders.

Ik gebruik het Asterisk pakketje van Debian Squeeze (1.6.2.9). Heb wel 1.8.8.x geïnstalleerd gehad maar dat werkte niet met Budgetphone aangezien Budgetphone de “From:” SIP headers van deze versie van Asterisk niet accepteerde. Volgens mij werkt het met 1.8.9.2 inmiddels weer wel als ik het Budgetphone forum mag geloven dus wellicht dat ik Asterisk binnenkort ga proberen te updaten. Dus vooralsnog Asterisk 1.6.2.9 met onderstaande configuratie.

/etc/asterisk/sip.conf

[general]
context=default
allowoverlap=no
externip=www.xxx.yyy.zzz
localnet=192.168.1.0/255.255.255.0
bindport=5060
nat=yes
srvlookup=yes
useragent=AutoStatic PBX
disallow=all
allow=alaw
allow=ulaw
allow=g726
allow=ilbc
allow=gsm
allow=g723
allow=g722
allow=g729
language=nl
dtmfmode=auto

;###########################
;## Register    ############
;###########################

#include "/etc/asterisk/register/*.conf"

;###########################
;##  Templates  ############
;###########################

#include "/etc/asterisk/templates/*.conf"

;###########################
;##  Trunks     ############
;###########################

#include "/etc/asterisk/trunks/*.conf"

;###########################
;##  Accounts   ###########
;###########################

#include "/etc/asterisk/accounts/*.conf"

/etc/asterisk/register/budgetphone.conf

register => budgetphonegebruikersnaam:budgetphonewachtwoord@sip1.budgetphone.nl/budgetphonegebruikersnaam

Je Budgetphone gebruikersnaam is tevens je telefoonnummer. Vandaar de schuine streep op het einde met daarachter nog een keer de gebruikersnaam. Op deze manier worden binnenkomende telefoontjes op dat nummer doorgezet naar de gelijknamige context.

/etc/asterisk/trunks/budgetphone.conf

[budgetphone]
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
allow=g722
allow=g729
context=pstn-in
dtmfmode=rfc2833
host=sip1.budgetphone.nl
insecure=port,invite
qualify=yes
type=user

De context voor inkomende telefoontjes op het Budgetphone nummer heet dus pstn-in.

/etc/asterisk/trunks/voipbuster.conf

[voipbuster]
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
context=pstn-out
dtmfmode=rfc2833
host=sip.voipbuster.com
qualify=yes
type=peer
defaultuser=voipbustergebruikersnaam
secret=voipbusterwachtwoord
fromuser=voipbustergebruikersnaam
fromdomain=sip.voipbuster.com

Met Voipbuster bellen we naar buiten, de context heet dan ook pstn-out en we moeten onze gebruikersgegevens opgeven anders accepteert Voipbuster onze telefoontjes niet. Voor Budgetphone is dit niet nodig aangezien we daar alleen telefoontjes mee ontvangen.

/etc/asterisk/templates/phones.conf

[phones](!)
type=friend
qualify=yes
nat=yes
context=phones
host=dynamic
canreinvite=no
dtmfmode=rfc2833
allowtransfer=yes
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
allow=g722
allow=g729

Dit sjabloon gebruik ik voor mijn accounts, dan hoef ik dat niet voor iedere account toe te voegen.

/etc/asterisk/extensions.conf

;###########################
;## Contexts    ############
;###########################

#include "/etc/asterisk/contexts/*.conf"

/etc/asterisk/contexts/pstn-in.conf

[pstn-in]
exten => budgetphonetelefoonnummer,1,Dial(SIP/10,25,tT)
 same => n,Hangup()

Oftewel, stuur alles wat binnenkomt op het Budgetphone nummer door naar toestel met extensie 10 (onze Gigaset C610 IP huistelefoon).

/etc/asterisk/contexts/pstn-out.conf

[pstn-out]
exten => _00X.,1,Set(CALLERID(num)=budgetphonetelefoonnummer-internationaalformaat)
 same => n,Dial(SIP/${EXTEN}@voipbuster)
 same => n,Hangup()

exten => _0XXXXXXXXX,1,Set(CALLERID(num)=budgetphonetelefoonnummer-nationaalformaat)
 same => n,Dial(SIP/${EXTEN}@voipbuster)
 same => n,Hangup()

/etc/asterisk/contexts/internal.conf

[internal]
exten => 10,1,Dial(SIP/10,25,tT)
 same => n,Hangup()

exten => 20,1,Dial(SIP/20,25,tT)
 same => n,Hangup()

exten => 30,1,Dial(SIP/30,25,tT)
 same => n,Hangup()

exten => 40,1,Dial(SIP/40,25,tT)
 same => n,Hangup()

De interne extensies zodat er ook intern gebeld kan worden. Extensie 10 wordt gebruikt voor binnenkomende telefoontjes die van Budgetphone vandaan komen.

/etc/asterisk/contexts/phones.conf

[phones]
include => internal
include => pstn-in
include => pstn-out

De phones context die alle andere contexts ‘include’.

/etc/asterisk/accounts/10.conf

[10](phones)
callerid=Thuis <10>
secret=***

(phones) geeft aan dat voor dit account het phones sjabloon gebruikt moet worden. In de /etc/asterisk/accounts directory staan verder nog configuratiebestandjes voor mijn mobiele telefoon, mijn werktelefoon en mijn softphone applicatie.

Er kunnen nog wat fouten zitten in bovenstaande configuratie. En ik moet nog even goed kijken naar de codecs, volgens mij is dat nu nog een rommeltje.

Asterisk configuratie