Dynamische Anrufwarteschlangen bei Asterisk

    Guten Tag, liebe Leser dieser Seite.
    Heute möchte ich über eine seltsame Art sprechen, Warteschlangen in Asterisk zu verwalten.
    Also

    Gegeben:
    1. asterisk1.8.32.3 server
    2. sip clients (35 nummern). Die Nummerierung ist zweistellig. Erste Nummer 11, letzte Nummer 46.
    3. Warteschlangen anrufen. Wenn ein Anruf an eine Stadtnummer eingeht, wird das Menü angesagt und es wird empfohlen, die Nummern 1 bis 4 zu drücken. Wenn diese Taste gedrückt wird, wird der Anruf an die Warteschlange 1, 2, 3 bzw. 4 weitergeleitet.

    Wie die Datei "queues.conf" jetzt aussieht:
    [queue-1]
    music = Standardstrategie
    = lineares
    Timeout = 10
    wrapuptime = 0
    ringinuse = ja
    periodic-announce-frequency = 30
    joinempty = nein
    leavewhenempty = nein
    Announce-Position = keine
    Announce-Holdtime = keine
    Announce-Frequenz = 0
    Member => SIP / 24
    Member => SIP / 25
    Member => SIP / 17
    Member => SIP / 23
    Member => SIP / 21
    Member => SIP / 18

    [queue-2]
    music = default
    strategy = linear timeout
    = 10
    wrapuptime = 0
    ringinuse = ja
    periodic-announce-frequency = 30
    joinempty = nein
    leavewhenempty = nein
    announce-position = nein
    announce-holdtime = nein
    announce-frequency = 0
    member => SIP / 18-
    Mitglied => SIP / 21-
    Mitglied => SIP / 23

    [Warteschlange 3]
    Musik = Standardstrategie
    = lineares
    Timeout = 10
    wrapuptime = 0
    ringinuse = ja
    periodic-announce-frequency = 30
    joinempty = nein
    leavewhenempty = nein
    announce-position = nein
    announce-holdtime = nein
    announce-frequency = 0
    member => SIP / 37
    member => SIP / 35
    member => SIP / 31
    member => SIP / 33
    member => SIP / 34
    member => SIP / 32

    [Warteschlange-4]
    music = Standardstrategie
    = linear timeout =
    10
    wrapuptime = 0
    ringinuse = ja
    periodic-announce-frequency = 30
    joinempty = nein
    leavewhenempty = keine
    Announce-Position = keine
    Announce-Holdtime = keine
    Announce-Frequenz = 0
    member => SIP / 24
    member => SIP / 25
    member => SIP / 37
    member => SIP / 18
    member => SIP / 32

    So sehen wir , dass die Warteschlangendatei statisch angegeben wird. Nummern werden von Hand hinzugefügt / gelöscht, und nach jeder Dateiänderung muss das Neuladen der Warteschlange durchgeführt werden. Das heißt, Sie müssen zum Asterisk-Server in der Konsole gehen, sagen wir, dann zum Asterisk -vvvvvvvvvvvr und geben diesen Befehl ein.

    Aufgabe:

    Mitglieder dynamisch zur Warteschlange hinzufügen lassen. Und die Zusammensetzung der Warteschlange würde durch den Inhalt der entsprechenden Tabelle in MySQL bestimmt.
    Also. Die Zusammensetzung der Warteschlange wird von MySQL bestimmt.
    Dementsprechend können Daten in der MySQL-Tabelle sowohl über die MySQL-Konsole als auch über jedes andere Muskelzugriffsprogramm eingegeben werden. Zum Beispiel habe ich mein „Programm“ mit LAMP geschrieben, um die entsprechende Tabelle mit Warteschlangen zu lesen und zu ändern.

    Lösung:

    1. Erstellen Sie eine Tabelle in einer Art MySQL-Datenbank. Ich werde den Prozess der Erstellung einer Tabelle nicht beschreiben, sondern nur ein Beispiel für mein Arbeitsblatt geben.
    mysql> desc queue;
    + ------------ + -------------- + ------ + ----- + -------- - + ---------------- +
    | Feld | Typ | Null | Schlüssel | Standard | Extra |
    + ------------ + -------------- + ------ + ----- + -------- - + ---------------- +
    | id | int (11) | NEIN | PRI | NULL | auto_increment |
    | priznak | int (1) | JA | | NULL | |
    | Warteschlange | varchar (100) | JA | | NULL | |
    | schluck | varchar (100) | JA | | NULL | |
    | sort_queue | int (2) | JA | | NULL | |
    + ------------ + -------------- + ------ + ----- + -------- - + ---------------- +

    und die Daten der Tabelle selbst:
    mysql> select * from queue;
    + ---- + --------- + --------- + -------- + ------------ +
    | id | priznak | Warteschlange | schluck | sort_queue |
    + ---- + --------- + --------- + -------- + ------------ +
    | 1 | 1 | Warteschlange-1 | SIP / 24 | 4 |
    | 2 | 1 | Warteschlange-1 | SIP / 17 | 2 |
    | 3 | 1 | Warteschlange-1 | SIP / 23 | 3 |
    | 4 | 0 | Warteschlange-1 | SIP / 21 | 4 |
    | 5 | 1 | Warteschlange-1 | SIP / 25 | 1 |
    | 6 | 1 | Warteschlange-1 | SIP / 18 | 6 |
    | 7 | 1 | Warteschlange-2 | SIP / 18 | 1 |
    | 8 | 0 | Warteschlange-2 | SIP / 21 | 2 |
    | 9 | 1 | Warteschlange-2 | SIP / 23 | 2 |
    | 10 | 1 | Warteschlange-3 | SIP / 37 | 1 |
    | 11 | 1 | Warteschlange-3 | SIP / 35 | 2 |
    | 12 | 1 | Warteschlange-3 | SIP / 31 | 3 |
    | 13 | 1 | Warteschlange-3 | SIP / 33 | 4 |
    | 14 | 1 | Warteschlange-3 | SIP / 34 | 5 |

    Ich werde die Tabellenfelder erklären.
    ID ist der Schlüssel.
    Priznak - 0/1. Wenn dementsprechend 0, dann nimmt diese Nummer nicht an der
    Warteschlange teil - der Name
    der SIP- Warteschlange ist das SIP-Konto.
    sort_queue - Die Reihenfolge, in der SIP-Konten am Anruf teilnehmen. Angenommen, die Warteschlange ist in der Warteschlange erforderlich, damit die SIP / 25-Nummer zuerst anruft, dann SIP / 17 usw.

    2. Jetzt konfigurieren wir asterisk selbst so, dass es mit Warteschlangen in dieser Form arbeitet.
    Ich möchte Sie warnen, dass ich hier einen in AEL geschriebenen Wählplan verwende. Meistens, weil die AEL-Syntax C ++ ähnelt. Und das Schreiben von Loops auf AEL ist viel praktischer und sie sind besser zu lesen.

    Wir erstellen die Datei
    " extensions.ael". Ich werde keine "Details" darüber schreiben, wie ein eingehender Anruf an Asterisk weitergeleitet wird und was als nächstes damit passiert .

    Nun der Inhalt der Datei mit Kommentaren:
    push-1 => {
    // Beantworte den Anruf
    answer ();
    // Verbindung zu
    MySQL herstellen MYSQL (Connect connid 192.168.1.1 server user passwd);
    // Entferne in der Schleife alle Membes aus der Warteschlange. Wir erinnern uns an die Zahlen von 11 bis einschließlich 46.
    für (x = 11; $ {x} <= 46; x = $ {x} +1) {
    // tatsächlich löschen. Asterisk-Team.
    RemoveQueueMember (Warteschlange 1, SIP / $ {x});
    };

    // dann mache eine Anfrage aus der Tabelle. Wir suchen, wie viele Positionen in unserer Anfrage gefunden werden. Wir suchen, wie viele Mitglieder das Attribut "1" haben, dh diejenigen, die an der Warteschlange teilnehmen.
    MYSQL (Abfrageergebnis $ {connid} select count (*) als co aus der Warteschlange, wobei queue = 'queue-1' und priznak = 1 order by sort_queue);
    MYSQL (fetch fetchid $ {resultid} co);

    // kann so werden, dass die Warteschlange im Moment nur eine Zahl ist. Wir können nicht im Voraus wissen, wie viele Nummern sich in der Warteschlange befinden werden, und die Auswahl der Sternchen-Daten aus der Tabelle unterscheidet sich. Das heißt, wenn eine Übereinstimmung gefunden wird, wird die Auswahl auf diese Weise beschrieben, und wenn mehrere, dann anders. Daher überprüfen wir, wie viele Übereinstimmungen gefunden werden.
    // Wenn es mehr als eine Übereinstimmung gibt, stellen wir eine Anfrage (wir benötigen das sip-Feld) mit dem Zeichen "1" und sortieren nach dem Feld "sort_queue".
    if ($ {co}> 1) {

    MYSQL (Abfrageergebnis $ {connid}) select sip from queue where queue = 'queue-1' and priznak = 1 order by sort_queue);
    MYSQL (fetch fetchid $ {resultid} sip);
    // Die erste vom AddQueueMember-Befehl gefundene Zahl hinzufügen.

    // für die allgemeine Entwicklung. Wenn die Tabelle mehr als einen gefundenen Wert enthält, führen Sie zuerst eine Aktion mit dem ersten (MYSQL (fetch fetchid $ {resultid} sip);) und anschließend mit allen anderen Werten in der Schleife (MYSQL (NextResult resultid $ {connid});
    MYSQL (fetch aus fetchid $ {resultid} sip_next);)

    AddQueueMember (queue-1, $ {sip});

    // dann suchen wir in der Schleife nach den verbleibenden Ergebnissen und fügen sie entsprechend der Warteschlange mit dem AddQueueMember
    für (x = 1; $ {x} <$ {co}; x = $ {x} +1) {

    MYSQL (NextResult resultid $ {connid });
    MYSQL (fetch fetchid $ {resultid} sip_next);
    AddQueueMember (Warteschlange-1, $ {sip_next});
    };
    }
    // Wenn das Ergebnis einteilig ist, stellen wir eine Anfrage und fügen die gefundene Nummer mit dem Befehl AddQueueMember (queue-1, $ {sip}) in die Warteschlange ein.
    else {

    MYSQL (Abfrageergebnis $ {connid} select sip from queue where queue = 'queue-1' order by sort_queue);
    MYSQL (fetch fetchid $ {resultid} sip);
    AddQueueMember (Warteschlange-1, $ {sip});
    };

    // dann das Abfrageergebnis löschen und die Verbindung trennen.
    MYSQL (Clear $ {resultid});
    MYSQL ($ {connid} trennen);

    // eigentlich starten wir hier die Warteschlange.
    Warteschlange (Warteschlange-1, Ct ,,, 300);
    };

    Wir nehmen Änderungen an der Tabelle vor und die PBX berücksichtigt beim nächsten Anruf in der Warteschlange die Nummern, die benötigt werden. Nehmen wir an, Sie müssen ihm das Zeichen "0" geben, unabhängig davon, um welche Nummer es sich bei dem Anruf handelt.

    Bei anderen Warteschlangen ist alles gleich, nur der Name der Warteschlange ändert sich.

    Wie alles

    Ich möchte sofort sagen, dass der Lösch- / Hinzufügungszyklus in 1-2 Sekunden abgeschlossen ist, was in meinem Fall normal ist (keine Verzögerungen).

    Ich habe auch versucht, mit Hilfe von extconfig.conf mit Warteschlangen zu arbeiten. Diese Datei beschreibt, womit wir über MySQL arbeiten können. Das heißt, alle Warteschlangenparameter befinden sich nicht in der Datei, sondern in mysql. Persönlich ist das Lesen einer Datei für mich viel einfacher und einfacher, daher habe ich diese Option nicht verwendet.

    Jetzt queues.conf Datei sieht wie folgt aus :
    [Queue-1]
    Musik = default
    Strategie = linear ist
    timeout = 10
    wrapuptime = 0
    ringinuse = yes oder die
    periodische-announce-Frequenz Der = 30
    joinempty = die keine
    leavewhenempty = die nicht
    verkünden die No-position =
    announce-holdtime = keine
    Ankündigungsfrequenz = 0

    [Warteschlange-2]
    Musik = Standardstrategie
    = lineares
    Timeout = 10
    Wrapuptime = 0
    ringinuse = ja
    periodic-announce-frequency = 30
    joinempty = nein
    leavewhenempty = nein
    announce-position = nein
    announce-holdtime = nein
    announce-frequency = 0

    [queue-3]
    music = default
    strategy = linear timeout =
    10
    wrapuptime = 0
    ringinuse = yes
    periodic-announce-frequency = 30
    joinempty = no
    leavewhenempty = no
    announce-position = no
    announce-holdtime = no
    announce-frequency = 0

    [queue-4]
    music = default
    strategy = linear timeout =
    10
    wrapuptime = 0
    ringinuse = yes
    periodic -Ankündigungshäufigkeit = 30
    joinempty = no
    leavewhenempty = no
    ankündigungsposition = keine
    ankündigungshaltezeit = keine
    ankündigungshäufigkeit = 0
    Alle Einstellungen der Warteschlange selbst werden in einer Datei gespeichert und Mitglieder werden dynamisch hinzugefügt.

    Das ist alles Vielen Dank.

    Jetzt auch beliebt: