Hi,
das hier hab ich bis jetzt. Es wird die ankommende SMS ausgelesen und überprüft, ob die Absendernr. in der Datenbank vorhanden ist. Wenn dies der Fall ist wird der Text nach einem Schlüsselwort überprüft. Wird dieser gefunden wird der Name der abzuspieleden Sounddatei ausgegeben, falls nicht wird Text to Speech verwendet.
Nun werden die Nummern der Mitarbeiter aus der Datenbank ausgelesen und in Arrays gespeichert. Diese werden dann nach einander angerufen.
Hier habe ich noch das Probleme, wenn ein Mitarbeiter nicht direkt nach abspielen des Soundfiles auflegt, wird er mit dem nächsten verbunden, was aber nicht passieren soll. Aber das werde ich heute noch verbessern.
Sonst bin ich recht zufrieden. Es ist bestimmt nicht die beste Lösung, aber es funktioniert erstmal alles, auch wenn es teilweise recht umständlich ist (hab erst vor ca. 2 1/2 Wochen angefangen mit Perl zuarbeiten und muss auch erst Asterisk richitg verstehen). Ein paar kleine Sachen muss ich noch verbessern, sowie ein Bestätigungsmenü einbauen.
So hier ist das Script, vll hilft es ja irgendeinen.
1.SMS auslesen und überprüfen.
Code:
#!/usr/local/bin/perl -w
#****Funktionen/Module****
use strict; #hilft bei der Fehlevermeidung
use Asterisk::AGI;
use DBI;
use DBD::mysql;
$|=1;
#****Variablen****
my $MSG; #Textnachricht
my $ABS; #Absendernummer
my $DATI; #DAte und TIme
my $DATE; #Eingangsdatum
my $TIME; #Eingagnszeitpunkt
#----------------------------------------------------------------------
#****************************Datei auslesen****************************
#----------------------------------------------------------------------
my $dir = "/var/spool/asterisk/sms/mtrx/"; #Pfad zum SMS Ordner
my $lastsms_pfad = (reverse(sort(glob "$dir/SIPGATEID*")))[0]; #letzte SMS Datei mit Pfad (kurze Version)
open(SMS, $lastsms_pfad); #öffent die Datei, um damit zuarbeiten
foreach my $line (<SMS>){ #kontrolliert jede Zeile in der SMS, die aktuelle Zeile wird in der Variable $line gespeichert
if($line =~ /oa=/){ #sucht nach der Absendernummer, bei einer SMS von Asterisk beginnt diese Zeile mit "oa=".
$ABS = $line; #setzt die Variabel $ABS gleich der aktuellen Zeile
$ABS =~ s/oa=//; #entfernt das voran stehende "oa="
#print "Nummer: $ABS"; #gibt die Nummer aus
print "SET VARIABLE ABS \"$ABS";
chomp $ABS;
}elsif($line =~ /ud=/){ #sucht nach dem Text und gibt diesen aus.
$MSG = $line;
$MSG =~ s/ud=//;
#print "Text: $MSG";
print "SET VARIABLE MSG \"$MSG";
chomp $MSG;
}elsif($line =~ /scts=/){ #sucht nach dem Eingagnsdatum mit Zeit und splitet es in Datum und Zeit auf.
$DATI = $line;
$DATI =~ s/scts=//;
my @DATI = split /T/, $DATI;
$DATE = $DATI[0];
#print "Datum: $DATE\n";
print "SET VARIABLE DATE \"$DATE\n";
$TIME = $DATI[1];
#print "Zeit: $TIME\n";
print "SET VARIABLE TIME \"$TIME\n";
}
}
close SMS; #schließt die Datei
#---------------------------------------------------------------------
#********************Verbindung mit der Datenbank*********************
#---------------------------------------------------------------------
#Verbindung mit der Datenbank
my $host = 'localhost'; #host
my $database = 'asterisk'; #Tabellenname
my $user = 'user'; #benutzer
my $pw = 'password'; #passwort
my $dsn = "dbi:mysql:$database:localhost:3306"; #adresse
my $dbh = DBI->connect($dsn, $user, $pw) or die DBI::errstr; #Verbindung herstellen
#--->1.Suche nach dem Absender
#Datensatz auslesen
my $title = $dbh->prepare("SELECT * FROM Anrufer WHERE Handy = $ABS");#Normaler SQL Befehl
my $control = $title->execute();
#Überprüfen, ob die NUmmer in der Datenbank eingetragen ist, wenn nicht wird das Skript abgebrochen
if($control == undef){
print "SET VARIABLE vorhanden no\n";
die DBI::errstr;
}else{
print "SET VARIABLE vorhanden yes\n";
}
while (my $anrufer = $title->fetchrow_hashref){
#print $anrufer->{Name};
};
#
#--->2.Suche nach der Nachricht
#Datensatz auslesen (Text für Text to Speech oder Soundfile)
my $problem = $dbh->prepare("SELECT * FROM Probleme WHERE Schluessel = '$MSG'");
$control = $problem->execute();
#Überprüfen, ob der Text in der Datenbank vorhanden ist, wenn ja wird der Name der Sounddatei ausgegeben sonst wird Text to Speech verwendet.
if ($control ne undef){
#Datensatz in einem Hash speichern
while (my $probleme = $problem->fetchrow_hashref) {
my $sound2 = $probleme->{Soundname};
print "SET VARIABLE sound \"$sound2\n";
print "SET VARIABLE tts no\n";
}
}else{
print "SET VARIABLE tts yes\n";
}
$dbh->disconnect();#trennt die Verbindung zur Datenbank
2.Nummern auslesen und in Arrays speichern
Code:
#!/usr/local/bin/perl
#use strict;
use DBI;
use DBD::mysql;
#---------------------------------------------------------------
#******************Auslesen aus der Datenbank*******************
#---------------------------------------------------------------
my $host = 'localhost'; #host
my $database = 'asterisk'; #Tabellenname
my $user = 'root'; #benutzer
my $pw = '18usc795+'; #passwort
my $dsn = "dbi:mysql:$database:localhost:3306"; #adresse
my $dbh = DBI->connect($dsn, $user, $pw) or die DBI::errstr; #Verbindung herstellen
my $mitarbeiter = $dbh->prepare("SELECT * FROM Mitarbeiter");
$mitarbeiter->execute;
my $anzahl = $mitarbeiter->execute;
while (my $anrufer = $mitarbeiter->fetchrow_hashref){
};
my $telnum = $dbh->prepare("SELECT m.MID, m.Name, t.Nummer FROM Mitarbeiter AS m INNER JOIN Telefonnummer AS t ON m.MID = t.MID");
$telnum->execute();
my %hash;
my @nummern;
my $l1 = 1;
my $l2 = 1;
while ($l1 <= $anzahl){
print "Mitarbeiter Nr.$l1\n";
$telnum->execute();
while (my $row = $telnum->fetchrow_arrayref){
if($row->[0] eq "$l1"){
foreach my $nummer ($row->[2]){
#my @nummern =($row->[2]);
#print "$nummern[$zah2]\n";
print "$l2. Nummer => $nummer\n";
push @{"mitnummer_$l1"}, $nummer;
}
}
}
$l1 += 1;#Hochzählen der Mitarbeiternummer
$l2 += 1;#Hochzähler der Nummer für die Telefonummern
}
$dbh->disconnect();#trennt die Verbindung zur Datenbank
#---------------------------------------------------------------
#*****************Übertragung an Asterisk***********************
#---------------------------------------------------------------
my $mid = $ARGV[0];#gibt die Mitarbeiternummer an
my $numid = $ARGV[1];
my $control;
#Anzahl der Nummern je Mitarbeiter
my $numanzahl = (@{"mitnummer_$mid"}-1);
print "$numanzahl \n";
if($mid <= $anzahl){
$control = "no";
print "SET VARIABLE CONTROL \"$control\n";
}else{
$control = "done";
} print "SET VARIABLE CONTROL \"$control\n";
if($control ne "done"){
my $NUM = ${"mitnummer_$mid"}[$numid];
print "SET VARIABLE NUM \"$NUM\n";
print "SET VARIABLE NUMANZAHL \"$numanzahl\n";
print "SET VARIABLE CONTROL \"$control\n";
$mid += 1;
$numid += 1;
}else{
print "SET VARIABLE end ende\n";
};
3.Hier meine extensions.ael
Code:
context eingang {
1000 => {
Answer();
AGI(SMS-Eingang);
SET(GLOBAL(sound)=${sound});
SET(GLOBAL(TextToSpeech)=${MSG});
SET(GLOBAL(tts)=${tts});
SET(GLOBAL(vorhanden)=${vorhanden});
NoOp(${vorhanden});
if(${vorhanden} = yes){
jump 2003@spass;
}else{
NoOp("Der Absender ist nicht in der Datenbank vorhanden!");
}
}
}
context spass {
2003 => {
SET(GLOBAL(MID)=1);
SET(GLOBAL(NUMID)=0);
SET(GLOBAL(CONTROL)="no");
SET(GLOBAL(NUMANZAHL)=0);
jump 2002;
}
2002 => {
AGI(Liste,${MID},${NUMID});
SET(GLOBAL(NUM)=${NUM});
SET(GLOBAL(NUMANZAHL)=${NUMANZAHL});
NoOp(${NUMANZAHL});
SET(GLOBAL(CONTROL)=${CONTROL});
if(${CONTROL} =done){
jump 2007;
}
NoOp(${NUM});
NoOp(${NUMID});
jump 2004;
}
2006 => {
if(${NUMID}<${NUMANZAHL}){
SET(GLOBAL(NUMID)=${MATH(${NUMID}+1,int)});
jump 2002;
}else{
SET(GLOBAL(MID)=${MATH(${MID}+1,int)});
SET(GLOBAL(NUMID)=0);
NoOp(${MID});
jump 2002;
}
}
2004 => {
DIAL(SIP/${NUM},5,G(spass^2005^1));
if(${DIALSTATUS}=NOANSWER OR CONGESTION OR BUSY){
jump 2006;
}
}
2005 => {
Wait(3);
if(${tts}=yes){
System(rm -rf /tmp/test.wav);
System(/opt/swift/bin/swift -o /tmp/test.wav -p audio/sampling-rate=8000,audio/channels=1 "${TextToSpeech}");
Playback(/tmp/test);
}else{
Playback(${sound});
}
Wait(5);
Hangup();
jump 2006;
}
2007 => {
NoOp("FERTIG !!!!!!!!!!!!");
}
}
So werde nächste Woche oder so noch ne verbesserte Version posten.
ps: teilweise sind überflüssige Codezeilen im Script. Diese haben meistens als Test gedient oder ich weiß nicht dass diese überflüssig sind.