SIP-Telefonie mit Android

Lauffähiges Demo bei Github

Techniken: Java, C, Lua


SIP und Android

Wenn es um digitale Sprachdienst geht, drängt sich zuerst das Session Initiation Protocol (SIP) als Technik im Hintergrund auf. Leider war zumindest im Jahr 2017 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 ich unter https://github.com/lygie2221/JanusSipGatewayDemo auf github von dem damaligen Firmenprojekt geclont. 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>;

 

Sitzungsverwaltung und Absicherung mit Webserver

Ein großer Vorteil von WebDocket-Verbindungen ist, dass sie sich durch normale Webproxies wie den Apache leiten lassen. Da unser Kunde die Telefonate zeitbasiert abrechnen wollte, mussten wir sicherstellen, dass serverseitig die Zeit erfasst, abgerechnet und bei fehlendem Guthaben die Verbindung gesperrt wurde. Die App selbst ist kein sicherer Ort für Abrechnungen und zu leicht zu überlisten. Der in C geschriebene Janus-Server war uns für die Implementierung der Geschäftslogik zu schwer. Zum Glück erlaubt es der Apache seit der Version 2.4 eine Proxy mit Logik aus einen Lua-Script abzusichern. Dort konnte ich die Geschäftslogik zum Abbuchen von Guthaben und zur Sperrung von Verbindungen leicht unterbringen.

 

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>