Donnerstag, 19. April 2012

VoIP Telefonie mittels Linux Shell

Zur Automatisierung von Anrufen aus einem Ticketsystem oder zur simplen Telefonie von einem Linux Rechner aus, kann man sich mittels linphone helfen. Dies lässt sich bequem mittels APT auf jedem guten Betriebssystem installieren.

apt-get install linphone
Nach der Installation starten wir den Daemon, und registrieren die Verbindung zu unserem SIP Server.
linphonecsh init
linphonecsh register --host x.x.x.x --username xxxx --password xxxx
Nun ist es uns möglich beliebige Anrufe auszuführen. Dies kann mit folgendem Befehl erreicht werden
linphonecsh dial 123456789
Zum Beenden der Verbindung reicht ein
linphonecsh generic terminate
In der gegenrichtung funktioniert dies natürlich auch. Nach dem Registern ist der Client telefonisch erreichbar und kann das eingehende Gespräch mittels
linphonecsh generic answer
annehmen. Um das Telefon bzw. den Client wieder abzumelden, reicht ein
linphonecsh exit Damit wird der Daemon, die Registrierung und alles was dazu gehört ausgeschalten. Wie jeder gute Admin weis, gilt es möglich wenig zeit mit solchem kleinkram zu verbringen. Daher habe ich ein mini Shell script das eine angegebene Nummer wählt und sich dabei um das drum herum kümmert.

# cat makecall.sh
#!/bin/bash
########################################

SIP_HOST='x.x.x.x'
SIP_USER='xxx'
SIP_PASS='xxx'
CALL=${1}

########################################
get_phone_state () {
 linphonecsh status register 2>/dev/null 1>&2
 if [ $? -eq $1 ]; then
  true
 else
  false
 fi
}
get_call_state () {
 linphonecsh status hook 2>/dev/null 1>&2
 if [ $? -eq $1 ]; then
  true
 else
  false
 fi
}

if [ $# -ne 1 ]; then
 echo "Usage: `basename $0` "
 exit 255
fi

# ret code 255 = no daemon started
if get_phone_state 255; then
 echo "Starting Phone client ..."
 linphonecsh init
 while get_phone_state 255; do sleep 0.2; done
else echo "Phone client already started ..."
fi

# ret code 0 = unregistered
# ret code 1 = registered
if get_phone_state 0; then
 echo "Register Client on SIP Server ..."
 linphonecsh register --host ${SIP_HOST} --username ${SIP_USER} --password ${SIP_PASS}
else echo "Client already registered ..."
fi
while ! get_phone_state 1; do sleep 0.2; done

echo "Calling Number: ${CALL} ..."
linphonecsh dial ${CALL}
while get_call_state 4; do sleep 0.2; done
echo "Ringing on remote site ..." # what the heck,.. no hook=ringing or stuff like that

echo -n "Press any key to terminate the call ... "
ABORT=false
while [ "`linphonecsh status hook`" == "" ] && ! ${ABORT}; do 
 read -n1 -s -t 1; ABORT=$?
 if [ ${ABORT} -eq 0 ];  then ABORT=true; else ABORT=false; fi 
done
if get_call_state 32; then echo -n "call established"; fi
while get_call_state 32 && ! ${ABORT}; do
 read -n1 -s -t 1; ABORT=$?
 if [ ${ABORT} -eq 0 ];  then ABORT=true; else ABORT=false; fi 
done

echo
echo "Cleaning up ..."
linphonecsh generic terminate 2>&1 1>/dev/null
echo "Exiting Daemon ..."
linphonecsh exit
echo 



Viel Spaß damit und Verbesserungen immer gerne zu mir.


1 Kommentar:

  1. Hallo Martin,
    Bin auf dein Script gestossen und habe mich gefragt, ob du vielleicht weisst, wie man dtmf töne (in den Client) empfangen kann.

    lg
    michael

    AntwortenLöschen