Att bygga sin egen telefonväxel med Asterisk

Förutsättningar

Krav

Förändringas som kommer göras senare:

Installation

Kommer göra installationen i flera steg: Har valt att köra Asterisk på Raspberry Pi. Installerade senaste wheezy (2012-10-28) från raspberrypi.org.

Efter att ha uppdaterat distron ställde jag in svenskt tangentbord genom att ställa in XKBLAYOUT="se" i filen /etc/default/keyboard

Sedan ställde jag in statiskt IP-nummer, genom att editera filen /etc/network/interfaces och där lägga in mina IP-uppgifter:

iface eth0 inet static
address 192.168.10.41
netmask 255.255.255.0
gateway 192.168.10.1
Istället för raden "iface eth0 inet dhcp"

Sedan installerade jag asterisk:

sudo apt-get install asterisk
Lite konfiguration av asterisk. Börja med filen /etc/asterisk/sip.conf Ändra till följande inställningar i [general]-sektionen:
[general]
context=default
allowoverlap=no
udpbindaddr=0.0.0.0
tcpenable=yes
tcpbindaddr=0.0.0.0
transport=udp
srvlookup=yes
I slutet av sip.conf kan man även lägga in sip-konton (sip-klienter som kan registrera sig). Lägg till konton för alla i hushållet som har SIP-klienter via mobiler. Även den SIP-telefon (flera?) som alltid finns hemma. Formatet på dessa är så här:
[<användarnamn>]
type=friend
username=<användarnamn>
secret=<lösenord>
host=dynamic
context=<kontext>
allow=all
(upprepa denna sektion för alla sip-konton, ange egna värden på <användarnamn>,<lösenord> och <kontext>) Använd långa och "säkra" lösenord. Kontext är den grupp användarna tillhör, ange exempelvis "hemma". Skapa även ett sip-konto för den sip-lur som alltid skall vara hemma.

I filen /etc/asterisk/extensions.conf, kommentera bort allt i [default]-sektionen och skapa en sektion som heter [<kontext>] i mitt fall [hemma]. Lägg till anknytningen till varje användarnamn i denna sektion

exten => <anknytning>,1,Dial(SIP/<användarnamn>)
exten => <användarnamn>,1,Goto(<anknytning>,1)
exempel på hur det kan se ut för mig:
exten => 1001,1,Dial(SIP/jka)
exten => jka,1,Goto(1001,1)
Anknytningen består av siffror, exempelvis 1001. Den andra exten-raden som skapas för varje användare gör att man kan ringa till användaren även via användarnamnet, inte bara växelnumret

Starta (om) asterisk och pröva att registrera ett par SIP-användare som du skapat. (domän är det domännamn som din sip-server har). Ett tips är att hämta hem SIP-klienter som går att köra på din smartphone (Android eller iPhone. Nyare versioner av Andriod har inbygd SIP-klient). Pröva att ringa till varandra.


Nu återstår att ringa in och ut till det fasta nätet från SIP-kontot som du har skapat i din asterisk-server. För att kunna göra detta måste du kontakta en ip-telefonioperatör och be om uppgifterna för ditt SIP-konto hos operatören.

När du har uppgifterna för sitt SIP-konto måste du registrera dig hos operatörenför att kunna ta emot inkommande samtal och ringa ut på det fasta nätet, detta görs genom att lägga in raden:

register => <användarnamn>:<lösenord>@<hostnamn för sipserver>
i slutet av "[general]"-sektionen i sip.conf.

Om du tänker placera din telefonväxel bakom en brandvägg (rekommenderas) så skall man även lägga in följande parametrar i slutet av denna sektion:

domain=<ditt domännamn>
externip=<det externa ip-nummer som du har>
localnet=<lokalt nät/nätmask> i mitt fall: 192.168.10.0/255.255.255.0
Om din växel är bakom en brandvägg får du även göra en port forwarding i din router för port 5060 både udp och tcp till ip-numret för din telefonväxel (i mitt fall 192.168.10.41)

För att kunna ringa in- och utgående samtal från och till det fasta nätet via dina SIP-klienter får du skapa en ny sektion i sip.conf (lägg den precis innan definitionerna av dina egna SIP-konton) som innehåller uppgifter om den operatör som skall användas (samma uppgifter som vid registreringen ovan). Skriv in följande:

[<namn, exempelvis operatörens namn>] i mitt fall [AllTele]
nat=yes (om man sitter bakom brandvägg, annars kan detta skippas)
qualify=yes
fromuser=<användarnamn>
username=<användarnamn>
secret=<lösenord>
host=<hostnamn för sipserver>
insecure=port,invite
allow=all
context=incoming (namn på den kontext man specar i extensions.conf som hanterar inkommande samtal, se nedan)

Nu lite mer konfiguration i extensions.conf. I den sektion där du la till växelnumren för dina sip-klienter (i mitt fall heter den [hemma]) får du även lägga in nummer som man skall kunna ringa ut och vilken operatör de skall kopplas till. Lägg till följande först i denna sektion:

exten => _0.,1,Dial(SIP/<operatörens namn>/${EXTEN},60)
exten => _+46.,1,Dial(SIP/<operatörens namn>/${EXTEN},60)
I mitt fall är operatörens namn AllTele (som spec:ades i sip.conf innan). (,60 innebär att man försöker ringa i 60 sekunder) Detta gör att det enbart går att ringa samtal inom Sverige, om du vill kunna ringa till alla länder, tag bara bort 46 i raden som inneåller _+46

Nu skall vi lägga in logiken för inkommande samtal. Vi börjar utan telefonsvarare och att man bara ringer på den SIP-telefon som jämt är hemma. Lägg till en ny sektion i extensions.conf under den du just ändrade i, vi namnger den incoming :

[incoming]
exten => s,1,Answer()
exten => s,n,Dial(SIP/hem,60,r)
exten => s,n,Dial(SIP/<operatörens namn>/+46704411118,30,r)
exten => s,n,Hangup
I mitt fall heter SIP-kontot för min hem-telefon "hem". operatörens namn=AllTele och det är mitt mobilnummer som skall ringas om ingen svarat hemma efter 60 sekunder

Starta nu om asterisk (/etc/init.d/asterisk restart) och kontrollera att all funktionaltitet fungerar så här långt. Kolla att registreringen går bra i (/var/log/asterisk/messages). Man skall kunna ringa ut från hemtelefonen eller via SIP-klienten i din mobil. Inkommande samtal skall först ringa på hemtelefonen i 60 sekunder sedan på det specade mobilnumret


Automatisk registrering av SIP-klienter i mobiltelefoner.

Det finns ett kommandoradsgränssnitt till asterisk där man kan kontrollera det mesta (allt?) ifrån. Bl a kan man ändra beteendet för hur de inkommande samtalen skall hanteras. Vi vill ändra på rad två i incoming "exten => s,n,Dial(SIP/hem,60,r)", så att det ringer på mer än en telefon. (Den första som svarar gör så att det slutar ringa för de andra). Detta kan göras genom att lägga till ett "&"-tecken till första argumentet i Dial, exempelvis: "exten => s,2,Dial(SIP/hem&SIP/jka,60,r)" gör så att det både ringer på hemtelefonen och användaren jka:s telefon. (n kan används i konfigurationsfilerna för att slippa tilldela explicita radnummer)

För att slippa behöva registrera mobilen i telefonväxeln varje gång jag kommer hem, så använder jag DHCP-servern i routern (Dlink DIR-655) för att ta reda på om en mobiltelefon befinner sig hemma eller är borta. Jag har satt ned lease-tiden till 10 minuter så att mobiltelefonerna blir avregistrerade då de inte längre är hemma. Använder ett python-script som mha selenium loggar in till routen och kontrollerar om hårdvarunumren för de intressanta mobilerna finns tillgängliga och om någon förändring av status skett (någon tillkommit eller försvunnit)

För att förändra hur inkommande samtal hanteras via kommandoraden så används kommandot (samma exempel som tidigare):

asterisk -rx "dialplan add extension s,2,Dial(SIP/hem&SIP/jka,60,r) into incoming replace"
Phyton-scriptet finns att ladda ned här


Telefonsvarare

Gör ett eget program som tar emot ljudfilen, konverterar den till mp3 och skickar den som ett mail, namnge det sendmailmp3 och lägg det i /usr/local/bin. SH-programmet finns att ladda ned här

Konfiguration i /etc/asterisk/voicemail.conf I sektionen [general] lägg till följande:

mailcmd=/usr/local/bin/sendmailmp3
I sektionen [default] lägg till den extension som skall få mail:
1001 => ,jka,jka@ekblad.org,,delete=yes
I extensions.conf ändra i incoming-sektionen så att det nu står:
[incoming]
exten => s,1,Answer()
exten => s,n,Dial(SIP/hem,60,r)
exten => s,n,Dial(SIP/<operatörens namn>/+46704411118,30,r)
exten => s,n,Voicemail(1001,u)
exten => s,n,Hangup
Starta om asterisk och ring telefonnumret hem utan att svara, tala in ett meddelande och se om du får ett mail!
Frågor? Kommentarer? Skicka ett mail till mig