Abfrage der PLZ für eine Datenbankabfrage

Folgende Anforderung:

Zu bestimmten Zeiten soll bei einem eingehenden Anruf zunächst die PLZ abgefragt werden.
Mit Hilfe der PLZ soll dann aus einer Datenbank eine Rufnummer ermitelt werden und der Anrufer dann zu der in der Datenbank für die PLZ hinterlegte Rufnummer weitergeleitet werden.

Ziel des ganzen ist eine Bereitschaftsdienst-Datenbank. Im konkreten Fall gibt es bundesweit Techniker, die jeweils für bestimmte Postleitzahlen zuständig sind und außerhalb der Geschäftszeiten die Anrufe entgegen nehmen sollen.

Hat sowas ähnliches schon mal jemand umgesetzt und kann mir entsprechende Tips oder Skripte zur Verfügung stellen. Die Datenbank existiert bisher nicht, daher ist es mir derzeit im Prinzip noch egal, ob das eine MySQL o.ä, wird. Mit PHP fühle ich mich allerdings nicht so zu Hause (C# liegt mir mehr).

Auch habe ich noch so gut wie keine Ahnung, wo ich mögliche Datenbankabfrage-Skripte hinterlege. Ich habe in dem einen oder anderen Beitrag aus der Sktipecke schon gesehen, dass die PHP-Skript tlw. in der Pascom gespeichert wurden. Ein anderer Ansatz scheint zu sein, eine REST-Abfrage durchzuführen oder eine externe PHP-Seite aufzurufen, die dann das Ergebnis zurück liefert.

Wie gesagt, stehe noch ganz am Anfang und arbeite mich gerade erst langsam in das Thema ein. Die PLZ-Abfrage einzubinden, gelingt mir noch. Aber wie ich dann weiter machen muss ist mir nicht klar.

Bin für jeden Hinweis oder auch externe Links mit weiterführender Literatur zum Thema dankbar.

Gruß
Michael

Moin,

wieviele solcher Techniker und welche Rufstrategie gibt es denn? Wie kommst du von der PLZ zum Techniker, gibt es da schon eine Datenbank?

Als Einsteiger beginnst Du wohl am besten mit einem sogenannten “Anrufverteiler”. Dort drin kannst Du per “inline Skript” die Asterisk Application “read” (https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+Application_Read) nutzen. Diese kann eine Ansage abspielen und eine Nummer per DTMF anfragen und in eine Variable ablegen.
Wenn Du wenige PLZ-Gebiete hast, könntest Du nun im einfachsten Fall eine Kurzwahl pro PLZ haben, die direkt zum Techniker führt. Du kannst die PLZ auch als Team-Rufnummer, Skill o.ä. ansehen. Auch ein curl Aufruf (https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+Function_CURL) an ein externes System kann dir helfen.

Das sollte jetzt erstmal genug “getting startet” sein :grinning:

Gruß,

Thomas

Hallo Thomas,

ganz so am Anfang stehe ich dann doch nicht :wink:

Abfrage der PLZ und auch die Thematik Rufstrategie ist mir durchaus bekannt. Das macht mir keine Schwierigkeiten.

Für mich schwierig wird es in dem Moment, wo ich die PLZ abgefragt habe und diese dann verwenden möchte, um eine Datenbank-Abfrage einer externen Datenbank durchzuführen und das Ergebnis dann weiter zu verarbeiten im Dialplan, damit die Weiterleitung auf die entsprechende Mobiltelefonnumer erfolgt.

Wie gehe ich vor, um mich mit einer externen DB zu verbinden und die SQL-Anweisung durchzuführen?
Wo speichere ich die DB-Abfrage innerhalb der Pacom ab?
Wie rufe ich die SQL-Anweisung in einem Skript auf und verarbeite das Ergebnis?
Welche Technik empfiehlt sich (ODBC, AGI und PHP, REST)?

Einen Ansatz habe ich hier gefunden: https://www.savelono.com/linux/asterisk-post/how-to-query-a-database-from-mysql-with-asterisk-16-odbc.html

Das Formulieren der SQL-Anweisung selbst ist dann wieder kein Problem.

Insgesamt gibt es 20 Niederlassungen und damit etwas 40 Ziele (Je Standort 2 Techniker). Wer wann Dienst hat, wird in der bereits bestehenden Datenbank verwaltet. Dort ist auch schon hinterlegt, für welche PLZ welche Niederlassung zuständig ist, woraus sich dann ergibt, welcher Techniker oder Stellvertreter zu dem Zeitpunkt Dienst hat.

Gruß
Michael

Die Antwort ist ganz klar: nutze die Datenbank NICHT direkt in der pascom.

Baue einen Service der auf einer anderen Maschine läuft und z.B. per HTTP GET/POST angesprochen wird. Dort bringst Du die ganze Logik unter. Im Dialplan nutzt Du dann z.B. die curl Funktion (s.o.) um mit Deinem Dienst zu sprechen. So kannst Du auch einen Timeout und einen Fallback einbauen falls die Anfrage zu lange dauert oder nicht klappt.

Ob Du Deinen Dienst dann mit php, go, nodejs, c# etc. baust, ist egal. Auch das Testen ist so viel einfacher.

@tweber
Perfekt, vielen Dank. Ich habe inzwischen auch noch ein wenig weiter gelesen und bin dabei auf diesen Link gestoßen, der erklärt, wie man CURL einfach im Dialplan über ein Skript verwenden kann.

Denke, damit habe ich für den Anfang genug Input, um die Anforderung umzusetzen. Besonders gut gefällt mir daran, dass ich dann jede beliebige DB verwenden kann und zudem den REST-Service in meiner Lieblingssprache C# aufsetzen kann.

Also, vielen Dank Thomas.

LG
Michael

Hi Michael,

wir haben sowas ähnliches. Bei uns wird die Telefonnummer einem Script übergeben, dass anhand der Vorwahl bestimmte Aktion ausführt. Das AGI Script setzt ein Label, wie in dem Beispiel den Ort. Anhand des Labels erfolgt dann das weitere Routing.

Mobydick Script.

exten => s,1,Verbose("=================================")
exten => s,2,Verbose(${MDC_CALLER_NUM_NAT})
exten => s,3,Verbose("=================================")
exten => s,4,agi(agi_get_ort.agi,${MDC_CALLER_NUM_NAT})
exten => s,5,Return()

AGI Script:

#!/bin/bash
nummer=$1
name=$(curl -m 1 --connect-timeout 1 -s "https://mobydick.datazon.de/reverse_ort.php?telefonnummer=$nummer")
name=$(echo -e "$name" | sed -e 's/^[ \t]*//')
echo 'SET VARIABLE MDC_LABEL-2 '"\"$name\""

Als Rückgabe könntest du ja gleich die zu wählende Nummer übergeben.

Vielleicht hilft dir das weiter.

Gruss

Flo

1 Like

@florian.schermer
Hallo Forian,

vielen Dank für Deinen Vorschlag. Inzwischen war ich nach weiteren Recherchen auch bei einem AGI-Skript angekommen und werden den auch von Dir vorgeschlagenen Weg weiterverfolgen. Derzeit erstelle ich den dazugehörigen Rest-Service, den es bisher nicht gibt für die bestehende Datenbank und dann wird das recht einfach umzusetzen sein. Ich habe mich zu lange mit direkte DB-Abfrage per ODBC herumgeschlagen, per AGI-Script gefällt mir das aber viel besser.

Gruß
Michael