SIP

Für die Anbindung des Voipio an die SIP Welt steht ein entsprechender Container bereit. Diese Container registrieren sich via SIP an der Fritzbox oder Telefonanlage und teilen ihre Betriebszustände über MQTT der Steuerzentrale Node-RED mit. Node-RED kann dann Aktionenaufgrund von Anrufen auslösen. Wie hier zum Beispiel den Buzzer und die LED zu schalten.

../../../../../_images/voipio_call.png

Es gibt pro SIP Registrierung einen Container. Dieser Container registriert sich an dem entsprechend konfiguriertem Account.

Dazu muss in der docker-compose.yml Datei entsprechend ein Container konfiguriert werden.:

version: '3.1'

secrets:
  voipio_sip_account1:
    file: secrets/voipio_sip_account1.json

services:
  sip_account1:
    image: reg.cloud.trizwo.it/t2t/voipio-sip:amd64-latest
    depends_on:
      - mqtt
    ports:
      - 5061:5061
      - 4001:4001
    restart: always
    secrets:
      - voipio_sip_account1

Hier wird ein SIP Container gestartet, wenn der lokale MQTT Broker verfügbar ist. Er erhält den externen Port 5061 von Docker auf seinen internen SIP Port 5061 weiter geleitet. Gleiches mit einem RTP Port 4001. Die Konfiguration des Accounts erfolgt über eine JSON Datei, die über Docker Secrets berechtigten Containern zugeteilt wird. Diese JSON Dateien werden bei Installationen über die SD Karte aus /boot/voipio_sip_*.json erstellt und liegen anschließend unter /root/voipio/secrets/. Hier ein Beispiel einer solchen Grundkonfiguration:

{
  "accountid": "account1",
  "port": "5061",
  "rtpport": "4001",
  "enabled": true,
  "send_180_on_incoming_calls": false,
  "reregister_timeout": "",
  "username": "voipio",
  "password": "voipio",
  "registrar": "192.168.178.146",
  "registrarport": "5060",
  "realm": "*",
  "mqtt_server": "mqtt",
  "mqtt_port": "1883",
  "mqtt_username": "admin",
  "mqtt_password": "admin"
}

Konfigurationsänderungen erfolgen über Node in Node Red. Node Red schreibt diese Änderungen in die entsprechende JSON Config Datei. Ist die entsprechende Datei nicht vorhanden oder beschädigt, wartet der Container kurz und startet neu. Node Red ist für die Benutzung von bis zu 10 SIP Accounts vorkonfiguriert.

Verfügbare Port Forwarings können angezeigt werden.:

root@voipio:~/voipio# docker-compose ps

Account Topics

SIP Accounts veröffentlichen über ihre MQTT Broker Verbindung Nachrichten über ihre Konfiguration, Log Nachrichten und Status Details.

voipio/sip/<account>/config      # Topic to send Login or Config Messages
voipio/sip/<account>/newcall     # on a new Call, this Topic receives the unique call ID
voipio/sip/<account>/numcalls    # current Number of active Calls, 0 when Idle
voipio/sip/<account>/pjsua       # Raw Log Out with SIP Log of PJSUA
voipio/sip/<account>/state       # a JSON Message when changed

Beispielsweise abonniert das Voipio Display über seine Verbindung zum MQTT Broker das Topic voipio/sip/+/numcalls. Es erhält durch die Benutzung des Wildcard + anstatt eines bestimmten Acoounts die Anzahl an derzeitigen laufenden Anrufe aller SIP Accounts und kann sie daher im Display anzeigen.

Call Topics

Bei einem Anruf veröffentlicht der SIP Account verschiedene Nachrichten über seine MQTT Verbindung. Dabei erhält jeder Call eine eindeutige UUID, mit der seine MQTT Topics systemweit eindeutig sind. Kontrollkommandos können über das Topic voipio/sip/<account>/call/<calluuid>/cmd gesendet werden. Der SIP Account hat das Kontrolltopic nur bis zum Ende des Calls abonniert.

voipio/sip/<account>/call/<calluuid>/callid    # Call ID of this CAll
voipio/sip/<account>/call/<calluuid>/cdpn      # Called Party Number
voipio/sip/<account>/call/<calluuid>/cgpn      # Calling Party Number
voipio/sip/<account>/call/<calluuid>/media_state     # if Media is connected  (0/1)
voipio/sip/<account>/call/<calluuid>/received_dtmf   # a DTMF Digit
voipio/sip/<account>/call/<calluuid>/remote_uri      # SIP Uri of Callee
voipio/sip/<account>/call/<calluuid>/state           # Interger Indication the State of a Call
voipio/sip/<account>/call/<calluuid>/state_text      # same as String
voipio/sip/<account>/call/<calluuid>/status          # Call Details
voipio/sip/<account>/call/<calluuid>/uri             # SIP Uri of our own side, Called SIP Uri
voipio/sip/<account>/call/<calluuid>/cmd             # Topic to send Control Messages to this call
voipio/sip/<account>/call/<calluuid>/event/on_state_changed  # One JSON State Message if State changes

Beispiel einer JSON Nachricht unter dem Topic voipio/sip/account1/state:

{
  "username": "621",
  "reg_active": 1,
  "userpart": "621",
  "reg_reason": "OK",
  "online_status": 1,
  "rtp_port": null,
  "reg_status": 200,
  "online_text": "online",
  "sip_port": "5060",
  "uri": "<sip:621@192.168.178.1>",
  "is_default": 1,
  "reg_expires": 294,
  "registrar": "192.168.178.1",
  "time": 1528704489.0,
  "accountid": "account1",
  "time_str": "2018-06-11 08:08:09"
}

Wenn ein neuer Anruf eingeht, wird eine neue eindeutige Call ID 6dd9f3e4-55a9-48c8-a67b-ddd405fd723a vergeben, unter der der Call im Verlauf bekannt ist:

voipio/sip/account1/newcall 6dd9f3e4-55a9-48c8-a67b-ddd405fd723a
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/status [INCOMING] To: "IP222" <sip:**620@fritz.fonwlan.box>;tag=F2EB5E5FA51F8089
Call time: 00h:00m:00s, 1st res in 0 ms, conn in 0ms
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/received_dtmf (null)
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/state 2
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/cgpn **620
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/state_text INCOMING
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/callid 6dd9f3e4-55a9-48c8-a67b-ddd405fd723a
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/remote_uri "IP222" <sip:**620@fritz.fonwlan.box>
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/cdpn 621
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/uri <sip:621@192.168.178.57;ob>
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/media_state 0
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/event/on_state_changed {"status": "[INCOMING] To: \"IP222\" <sip:**620@fritz.fonwlan.box>;tag=F2EB5E5FA51F8089\r\n  Call time: 00h:00m:00s, 1st res in 0 ms, conn in 0ms\n", "received_dtmf": "", "state": 2, "cgpn": "**620", "state_text": "INCOMING", "callid": "6dd9f3e4-55a9-48c8-a67b-ddd405fd723a", "remote_uri": "\"IP222\" <sip:**620@fritz.fonwlan.box>", "cdpn": "621", "uri": "<sip:621@192.168.178.57;ob>", "media_state": 0}
voipio/sip/account1/numcalls 1

Wärend der Anruf ansteht, kann er mit Kommandos gesteuert werden. Beispielsweise können SIP Respone Codes gesendet werden, um einen Anruf anzunehmen oder weiter zuleiten. Wird Node-RED auf den MQTT Broker konfiguriert, kann die Voipio Node dort über das Kontrolltopic den Call im zuständigem SIP Container steuern.

voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/cmd <cmd as payload>

Wird der Anruf beantwortet oder anderweitig beendet:

voipio/sip/account1/newcall 6dd9f3e4-55a9-48c8-a67b-ddd405fd723a
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/status [INCOMING] To: "IP222" <sip:**620@fritz.fonwlan.box>;tag=F2EB5E5FA51F8089
Call time: 00h:00m:00s, 1st res in 0 ms, conn in 0ms
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/received_dtmf (null)
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/state 2
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/cgpn **620
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/state_text INCOMING
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/callid 6dd9f3e4-55a9-48c8-a67b-ddd405fd723a
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/remote_uri "IP222" <sip:**620@fritz.fonwlan.box>
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/cdpn 621
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/uri <sip:621@192.168.178.57;ob>
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/media_state 0
voipio/sip/account1/call/6dd9f3e4-55a9-48c8-a67b-ddd405fd723a/event/on_state_changed {"status": "[INCOMING] To: \"IP222\" <sip:**620@fritz.fonwlan.box>;tag=F2EB5E5FA51F8089\r\n  Call time: 00h:00m:00s, 1st res in 0 ms, conn in 0ms\n", "received_dtmf": "", "state": 2, "cgpn": "**620", "state_text": "INCOMING", "callid": "6dd9f3e4-55a9-48c8-a67b-ddd405fd723a", "remote_uri": "\"IP222\" <sip:**620@fritz.fonwlan.box>", "cdpn": "621", "uri": "<sip:621@192.168.178.57;ob>", "media_state": 0}
voipio/sip/account1/numcalls 1

Konferenz Raum

Über Command Line Optionen des Container kann auch ein Konferenzraum konfiguriert werden. Ein Beispiel einer docker-compose.yml:

version: "3.1"
services:

  sip_conference:
    image: reg.cloud.trizwo.it/t2t/voipio-sip:amd64-latest
    depends_on:
      - mqtt
    ports:
      - 5090:5090
      - 4030:4030
    command: [ "/usr/bin/pjsua", "--local-port=5090", "--rtp-port=4030", "--no-cli-console", "--use-cli", "--null-audio", "--auto-answer=200", "--auto-conf", "--max-calls=32",
       "--id=sip:voipio_conf@192.168.178.71", "--registrar=sip:192.168.178.71", "--realm=*", "--username=voipio_conf", "--password=voipio_pass" ]
    restart: always

Der Container registriert sich via SIP an 192.168.178.71 mit dem Usernamen voipio_conf und Passwort voipio_pass, nimmt eingehende Anrufe mit SIP Resonse Code 200 an und schaltet bis zu 32 gleichzeitigen Anrufer zusammen. Um eine höhere Kapazität zu erreichen wäre eine kaskadierende Lösung mit einem zentralen Mix und mehreren Eingangs Räumen denkbar. Dabei würden die Eingangsräume beim Start den Mixer anrufen, der ihr Audio mit anderen mischt. Sie selbst haben 31 offene Kanäle.

Bemerkung

PIN, Muten oder weitere Steuerungen der Konferenz sind nicht möglich. Es wird nur Audio gemischt.

Ansage / Audiodatei

Über Command Line Optionen des Container kann auch ein Konferenzraum konfiguriert werden. Ein Beispiel einer docker-compose.yml:

version: "3.1"
services:

  sip_testannc:
    image: reg.cloud.trizwo.it/t2t/voipio-sip:amd64-latest
    depends_on:
      - mqtt
    ports:
      - 5089:5089
      - 4029:4029
    command: [ "/usr/bin/pjsua", "--local-port=5089", "--rtp-port=4029", "--no-cli-console", "--use-cli", "--null-audio", "--auto-answer=200", "--auto-play", "--play-file=/sip/default.wav", "--max-calls=32",
       "--id=sip:voipio_annc@192.168.178.71", "--registrar=sip:192.168.178.71", "--realm=*", "--username=voipio_annc", "--password=voipio_pass" ]
    restart: always

Der Container registriert sich via SIP an 192.168.178.71 mit dem Usernamen voipio_annc und Passwort voipio_pass, nimmt eingehende Anrufe mit SIP Resonse Code 200 an und spielt das im Container mit gelieferte Testfile /sip/default.wav für bis zu 32 gleichzeitigen Anrufer. Über die Docker Volumes lässt sich jedes WAV dem Container in das Filesystem geben und über die docker-compose.yml konfigurieren.