Eigener Sprachdienst mit Android über WebRTC

Auch in Zeiten von WhatsApp und Skype kann es gute Gründe geben einen eigenen Sprachdienst für ein Smartphone zu implementieren. Ein gewichtiger Vorteil ist es, sämtliche Informationen, wie Sprach- und Metadaten, über die eigene Infrastruktur übertragen zu können. Interessant kann das aus Sicherheitsgründen sein, oder um eigene Dienste rund um die Sprachkommunikation anbieten zu können.

In diesem Artikel stellen wir einen Lösungsansatz vor, mit der man eine Sprachkommunikation bei Android Geräten mit Hilfe des Janus WebRTC Gateways realisieren kann.

SIP und Android

Wenn es um digitale Sprachdienst geht, drängt sich zuerst das Session Initiation Protocol (SIP) als Technik im Hintergrund auf. Leider ist SIP unter Android ein ziemlich heißes Pflaster. Seit der Version 4.x liefert Android zwar alle technischen Voraussetzung mit um nativ und mit sehr einfachen Mitteln SIP-Verbindungen aufzubauen. Nur ist die Funktion in sehr vielen verbreiteten Smartphones deaktiviert oder wird von Netzwerkanbietern bei der Auslieferung ausgeschaltet. Ohne root-Rechte lässt sich diese künstliche Einschränkung nicht umgehen.

Mit zum Beispiel PJSIP MjSIP, JainSIP gibt es einige SIP-Bibliotheken die sich unter Android verwenden lassen. Mit csipsimple gibt es sogar ein fertiges Projekt. Die Bibliotheken benötigen aber einiges an Aufwand bei der Integration in eine Android-Anwendung. Einige wirken nicht mehr ganz frisch und erhalten auch keine aktuellen Updates oder sehen aktive Entwicklung.

Modern und flexibel: WebRTC

Mit WebRTC existiert ein moderner Standard für die Echtzeitkommunikation dessen grundlegende Techniken breit unterstützt sind. Neben der Sprachübertragung können auch Video- oder Textchats implementiert werden.

Die Firma Meetecho hat mit dem Janus-Gateway ein leichtgewichtiges und durch eine Plugin-Struktur flexibles Gateway bereitgestellt. Mit diesem lässt sich das Verbindungsmanagement auf eigenen Server umsetzen.

Auf Github hat ein fleißiger Anwender eine Client-Bibliothek für Android geschaffen. Das Projekt kommt mit fertig funktionierenden Beispielen für einen Videochat.

Um einen flexiblen Sprachdienst zu schaffen der auch nicht WebRCT-fähige Endgeräte wie Telefone unterstützt, bietet es sich an die Fähigkeit des Janus-Gateways zu nutzen um WebRTC Sitzungen an einen SIP-Server weiterzureichen. Damit lassen sich auch Kommunikationsszenarien von der App zu einem regulären Telefon abdecken:

Janus-SIP Plugin unter Android nutzen

In der oben genannten Client-Bibliothek für Android gibt es derzeit (Stand August 2017) noch kein funktionierendes Beispiel für die Kommunikation mit dem SIP-Plugin des Janus-Servers. Tatsächlich muss, um Ereignisse wie das Auflegen der Gegenstelle an die Anwendung durchreichen zu können, die Bibliothek noch leicht erweitert werden.

Ein lauffähiges Beispiel für eine SIP-Anwendung mit Hilfe eines eigenen Janus-Servers haben wir unter https://github.com/lampsolutions/JanusSipGatewayDemo auf github hochgeladen.

SIP Zugangsdaten von der App in den Server verlagern

Das SIP-Plugin des Janus-Gateways erwartet bei der Registrierung die Zugangsdaten zum Verbindungsaufbau mit dem SIP-Server. Da wir in unserem Beispiel den SIP-Verbindungsaufbau nicht der App überlassen wollen, können wir feste Zugangsdaten nach ein paar Änderungen im janus_sip.c Plugin des Janus-Server fest in einer Konfigurationsdatei angeben:

PROXY = sip:xxx.xxx.xxx.xxx:port;
USERNAME = sip:<username>@<domain>;
AUTHUSER = <username>;
PASSWORD = <password>;

Die Anwendung muss dann nur noch die anzurufende Adresse (sip:<user>@<domain>) mitschicken.

Bonuskapitel: Sitzungsverwaltung und Absicherung mit Webserver

In unserem Fall soll der Janus-Server zwar von überall im Internet erreichbar sein, die Kommunikation soll aber nur für authentifizierte Nutzer erlaubt werden. Das Janus-Gateway liefert fertige Authentifizierungsmechanismen. Da die eingebauten Lösungen nicht alle unsere Anforderungen erfüllt haben, haben wir eine einfache Möglichkeit geschaffen um Verbindungen zum Janus-Server dynamisch abzusichern.

Da der Apache-Webserver auch als Proxy für Websocket-Verbindungen dienen kann, hat es sich angeboten die Authentifizierung schon vor den eigentlichen Janus-Server zu legen.

LuaAuthzProvider token /etc/apache2/authz_provider.lua authz_check_token
DocumentRoot /var/www/html
<Location />
    Require token
    ProxyPass  ws://127.0.0.1:8188 retry=0
    ProxyPassReverse  ws://127.0.0.1:8188
</Location>

In dem lua-Script können wir zu jedem Request dynamisch prüfen, ob ein Verbindungsaufbau erlaubt wird. Dabei kann zum Beispiel ein Zugangstoken gegen eine lokale Datenbank mit Nutzerinformationen, oder auch gegen die API des Playstores abgeglichen werden und zum Beispiel zahlende User zu identifizieren.

Fazit:

Wie wir zeigen konnten, ist ein flexibel einsetzbarer und von Drittanbietern unabhängiger Sprachdienst über WebRTC unter Android mit überschaubarem Aufwand umsetzbar. Dem interessierten Leser haben wir auf GitHub ein Beispiel zur Verfügung gestellt, in welchem das hier beschriebene in der Praxis getestet werden kann.

Haben Sie Fragen zu dem Artikel oder ähnlichen Themen? Dann kontaktieren Sie uns. Wir freuen uns auf Ihre Anfrage.

Leave a reply