Implementierung des OpenSIPS 3.1-Lastausgleichs-MRCP-Servers

1. Schemaentwurf

FreeSWITCH stellt über das unimrcp-Modul eine Verbindung zum MRCP-Server her, das beim Start einen MRCP-Client basierend auf der mrcp-Profilkonfigurationsdatei erstellt. Bei Verwendung der MRCP-Funktion gibt FreeSWITCH den zu verwendenden MRCP-Client über den Namen des mrcp-Profils an und bestimmt dann den MRCP-Server, zu dem eine Verbindung hergestellt werden soll. In Analyse des Lastverteilungsschemas des MRCPv2-Servers analysierte der Autor, dass ein MRCP-Lastausgleich erreicht werden kann, solange die SIP-Signalisierung gut ausbalanciert ist. Auf dieser Grundlage , Eine mögliche Lösung ist wie folgt:

  1. FreeSWITCH konfiguriert das mrcp-Profil so, dass es auf den OpenSIPS-Server verweist.Konfigurieren Sie den UA-Namen im Profil als Identifikationszeichen für mrcp-Anfragen
  2. Das OpenSIPS-Skript ermittelt den UA-Namen in der INVITE-Anfrage. Wenn es sich um eine mrcp-Anfrage handelt, behandeln Sie diese entsprechend.
  3. Fügen Sie den entsprechenden mrcp-Server-Adressdatensatz in die OpenSIPS-Datenbank ein und rufen Sie die Funktion ds_select_dst des Dispatcher-Moduls auf, um den mrcp-Server während der Verarbeitung auszuwählen.Diese Funktion füllt $du und leitet die Anfrage an die Adresse weiter, auf die $du zeigt

Fügen Sie hier eine Bildbeschreibung ein

2. Implementierungsmethode

2.1 FreeSWITCH-Konfiguration

In FreeSWITCHVerzeichnis conf/mrcp_profilesErstellen Sie unter eine neue Konfigurationsdatei, verweisen Sie sie auf den OpenSIPS-Server, geben Sie den UA-Namen an und starten Sie dann FreeSWITCH neu

<include>
  <!-- UniMRCP Server MRCPv2 -->
  <profile name="opensips-tts-mrcp2" version="2">
    <!-- OpenSIPS 服务器地址 端口号-->
    <param name="server-ip" value="127.0.0.1"/>
    <param name="server-port" value="8060"/>

    <!-- FreeSWITCH IP、端口以及 SIP 传输方式 -->
    <param name="client-ip" value="$${local_ip_v4}" />
    <param name="client-port" value="5072"/>
    <param name="sip-transport" value="udp"/>

    <param name="speechsynth" value="speechsynthesizer"/>
    <param name="speechrecog" value="speechrecognizer"/>
    <!-- SIP 请求携带的 ua 名称 -->
    <param name="ua-name" value="OPENSIPS_TTS_MRCP_CLIENT"/> 

    <!-- Add any default MRCP params for SPEAK requests here -->
    <synthparams>
    </synthparams>

    <!-- Add any default MRCP params for RECOGNIZE requests here -->
    <recogparams>
      <!--param name="start-input-timers" value="false"/-->
    </recogparams>
  </profile>
</include>

2.2 Konfiguration von OpenSIPS 3.1

  1. Beachten Sie, dass der Autor hier betont, dass die OpenSIPS-Version 3.1 ist. Dies liegt daran, dass die APIs verschiedener Versionen von OpenSIPS Änderungen aufweisen. Wenn die Version nicht mit dem in diesem Artikel angegebenen Skriptcode übereinstimmt, tritt wahrscheinlich eine Ausnahme auf.
  2. Vor dem Üben müssen die Leser sicherstellen, dass OpenSIPS mit dem Dispatcher-Modul kompiliert und geladen wurde.Wenn während des Startvorgangs von OpenSIPS eine Ausnahme gemeldet wird, dass das Modul nicht gefunden werden kann, können Sie das Quellcodemodul selbst kompilieren und dann die so dynamische Bibliothek in das entsprechende Modulverzeichnis im Quellcode-Stammverzeichnis kopieren modules目录 Gehen Sie einfach in das Verzeichnis, in dem die Ausnahme Sie auffordert
2.2.1 OpenSIPS speichert MRCP-Serveradresse

Führen Sie die folgende SQL-Anweisung aus, um den Adressdatensatz des Ziel-MRCP-Servers in die Dispatcher-Tabelle der OpenSIPS-Datenbank einzufügen. setid in dieser Tabelle ist die Kennung des Gruppenkonzepts. Dieser Parameter muss beim Aufruf der Funktion ds_select_dst im Skript angegeben werden. Wenn im Skript die Datenbankadresse des Dispatcher-Moduls konfiguriert ist, fragt OpenSIPS beim Start die Daten aus der Datenbank ab und lädt sie in den Speicher. Interessierte Leser können sich an Dispatcher-Beamter wenden Dokumentation

Die Dispatcher-Tabelle kann mit demopensips-cli-Tool erstellt werden. Wenn sie aufgrund von Berechtigungsproblemen nicht erstellt werden kann, kann sie auch erstellt werden im OpenSIPS-Quellcode-Stammverzeichnis Wählen Sie das entsprechende Datenbanktypverzeichnis in a>scripts目录 und suchen Sie im Verzeichnis beispielsweise nach der entsprechenden Tabellenerstellungsdateiscripts/mysql/dispatcher-create.sql, kopieren Sie den Inhalt in die Datenbank und führen Sie ihn aus

INSERT INTO `dispatcher` (`setid`, `destination`, `state`, `weight`, `priority`, `attrs`, `description`) VALUES
    (19, 'sip:10.129.39.88:7010', 0, 1, 100, 'pstn=100', 'TTS_MRCP_CLIENT_FS_7010'),
    (19, 'sip:10.129.39.88:7011', 0, 1, 100, 'pstn=100', 'TTS_MRCP_CLIENT_FS_7011');
2.2.2 OpenSIPS-Skriptentwicklung

Der Hauptverteilungscode des Skripts lautet wie folgt. Die spezifische Verarbeitung wurde oben erwähnt und wird hier nicht wiederholt. Sie müssen jedoch weiterhin auf die folgenden Punkte achten:

  1. Für die von FreeSWITCH initiierte MRCP INVITE-Anfrage muss $rU null sein. Wenn es im Skript ein Nullurteil für diese Variable gibt, muss eine entsprechende Vermeidung vorgenommen werden. Wenn Leser die Kernvariablen von OpenSIPS nicht verstehen, können sie zum offiziellen Portal gehen
  2. OpenSIPS führt beim Start eine Syntaxprüfung des Skripts durch.Leser können OpenSIPS zunächst im Vordergrund starten und dann das Startprotokoll beobachten und bei eventuellen Fehlermeldungen diese nacheinander beheben.
route {
    
    
    # 省略无关代码 ...
    if (is_method("INVITE")) {
    
    
        xlog("ua = $ua , callid = $ci, fu = $fu , tu = $tu , ru = $ru , du =$du src:$si, $(rb{sdp.line,m})");
        $var(dlgPingTag) = "Pp";
        if ( $ua == "OPENSIPS_TTS_MRCP_CLIENT" ) {
    
    
               $var(dlgPingTag) = "";  # TTS 的SIP通道不能做 OPTION 探测
        }
        if ( !create_dialog("$var(dlgPingTag)")) {
    
    
            send_reply(500,"Internal Server Error");
            exit;
        }
        if ( $ua == "OPENSIPS_TTS_MRCP_CLIENT" ) {
    
    
             # 指定 setid 为 19,与插入 dispatcher 表的数据相匹配,选择可用的节点
             $var(lbRst) = ds_select_dst(19, 4);
             if($var(lbRst) == -1) {
    
    
                  xlog("Failed by dispatcher group_id: 19");
                  t_reply(480, "MRCP server Unavailable");
                  exit();
             }
             if ( $var(lbRst) > 0) {
    
    
                 $ru = "sip:" + $(du{
    
    uri.host}) + ":" + $dp;
                 xlog("[$fU->$rU] Route to $ru");
             } else {
    
    
                xlog("[$fU->$rU] No available server now");
                t_reply(480, "$var(node_type) Unavailable");
                exit();
             }
        } else {
    
    
            # 其他类型 INVITE 处理 .....
        }
    }
    route(relay);
}

route[relay] {
    
    
    # for INVITEs enable some additional helper routes
    if (isflagset("NAT")) {
    
    
        add_rr_param(";nat=yes");
    } 
    
    if (!t_relay()) {
    
    
        send_reply(500,"Internal Error");
    }
    exit;
}

2.3 Ergebnisse erzielen

Fügen Sie hier eine Bildbeschreibung ein

Acho que você gosta

Origin blog.csdn.net/weixin_45505313/article/details/130802700
Recomendado
Clasificación