Hlavní navigace

Asterisk 12 – New Age

7. 2. 2014
Doba čtení: 8 minut

Sdílet

Nový Asterisk 12 má pod kapotou revoluční změny. Tento nejčastěji používaný komunikační framework má kompletně novou podporu protokolu SIP a REST API zaměřené na webové vývojáře, pro které je psaní komunikačních služeb o několik řádů jednodušší. Přibyla také podpora kodeku Opus, který je špičkou mezi kodeky.

Obecně o Asterisku

Na úvod krátce o Asterisku pro neznalé. Asterisk je open source framework pro budování komunikačních systémů a aplikací. Asterisk pohání různé pobočkové ústředny, konferenční servery, VoIP Gatewaye a další speciální aplikace. Projekt je sponzorován firmou Digium, která prodává support a komerční produkty.

První verzi dal k dispozici Mark Spencer v roce 1999. Mark Spencer je mimo jiné také původním autorem programu dnes známého pod jménem Pidgin.

Pokud si chcete Asterisk vyzkoušet, doporučuji například návod VoIP s Asterisk: pobočková ústředna za 30 minut.

V České republice existují firmy, které poskytují komerční support nebo produkty nad Asteriskem postavené. Jsou to například Canistec, IPEX a další.

Používáte u vás ve firmě nějakou variantu Asterisku?

Asterisk 12 je standardní verze. Tzn. není dlouhodbě podporovaná a tudíž se nehodí pro projekty, u kterých je třeba zajistit dlouhodobou podporu. K tomuto účelu slouží tzv. LTS verze. Standardní verze je určena na projekty kde je možné dělat jednoduše upgrady, na testování, na ověřování nových funkcí atp.

Release series Release type Release date Security fix only EOL
11.x LTS 25.10.2012 25.10.2016 25.10.2017
12.x standard 2013–12–20 2014–12–20 2015–12–20
13.x LTS 2014–10 (tentative) 2018–10 (tentative) 2019–10 (tentative)

Hlavní novinky verze 12

  • Podpora kodeku OPUS a VP8
  • Bridging API
  • Nový interní message bus – Stasis
  • Přepracované a zdokumentované AMI
  • Přidané nové rozhraní ARI – Asterisk REST Interface
  • Nový driver pro SIP založený na SIP stacku PJSIP

Asterisk 12 má pod kapotou velké technologické změny. Nezodpovězenou otázkou zřejmě zůstane, jak moc velký vliv na tyto velké změny, jako je například kompletní výměna SIP stacku měl odchod Kevina Fleminga z postu hlavního architekta.

Kodeky OPUS a VP8

Do Asterisku 12 byla začleněna podpora audio kodeku OPUS a videokodeku VP8. Oba jsou podporovány pouze v pass-through módu, tzn. že není možné hovor převést na jiný typ kodeku (transcoding)

U kodeku VP8 je to dané náročností a charakteristikou Asterisku, kdežto u kodeku OPUS je to dané neoblíbeným patentovým právem. Někteří z vás ví, že OPUS je budoucnost audia ve světě sw, ale to je na samostatný článek. Více informací je možné získat z mailu od Matthewa Jordana.

Autorem podpory OPUS kodeku je Lorenzo Miniero, který dal k dispozici i patche pro transcoding.

Bridging API

Asterisk 12 obsahuje nový bridging framework, který umožňuje bezpečné a konzistentní manipulace s hovorovými kanály, které jsou v bridgi připojeny. Bridge (most) je objekt, který propojuje hovor volajícího s volaným. Původně se tento framework používal pouze pro audiokonferenční modul ConfBridge. Nyní je použit pro všechny moduly, které s hovorovými kanály pracují. Tímto bylo dosaženo vyšší stability a přehlednosti. Nyní jsou tedy například i funkce 3Way konference (konference tří účastníků) realizovány pomocí tohoto obecného bridge a je mnohem jednodušší přecházení v různých scénářích např. z 3way konference na víceuživatelskou.

Stasis

Stasis message bus je sběrnice zpráv typu publish/subscribe, kterou Asterisk používá pro interní komunikaci mezi moduly. V linuxu se můžete setkat např. s D-Bus nebo případně obecnějšími systémy typu RabbitMQ, AMQ atp.

Na tuto sběrnici byly předělány i moduly jako je AMI, ARI, CDR, CEL a další.

Konfigurace sběrnice Statis je umístěna do stasis.conf. Typicky ale není třeba v konfiguraci nic měnit. Technické informace jsou dostupné ve wiki.

AMI (Asterisk Manager Interface)

Toto rozhraní se používá pro management ústředny. Pomocí něj lze zjistit např. aktuální počet hovorů. Nejčastěji se používá pro integraci se CRM systémy pro funkce click2dial a zobrazení informací o volajícím.

Rozhraní prošlo pročištěním a standardizací v názvosloví. Důležitým dopadem je, že v celé délce života hovorového kanálu se nemění jeho jméno, což velmi ocení programátoři, kteří to dříve museli hlídat.

Jak již bylo uvedeno výše, AMI nově pro interní komunikaci používá Stasis message bus.

Tok zpráv v rámci Asterisk

Po dlouhých letech je konečně dostupná oficiální dokumentace přímo na webu projektu.

Nicméně pořád není úplně dokonalá, protože chybí popisy výstupu funkcí. Takže třeba zjištění, s jakou verzí Asterisku vlastně komunikuji, je pořád ještě trochu skryto. Pro informaci – dá se to zjistit pomocí akce CoreStatus. AMI je v Asterisku 12 verzováno jako 2.0.0.

ARI (Asterisk REST Interface)

Toto nově přidané rozhraní nenahrazuje žádné stávající, ale přidává novou funkcionalitu zaměřenou hlavně na webové vývojáře. Původně pokud jste chtěli vytvořit aplikaci, která pracovala na nižší úrovni tak byla potřeba úprava nebo napsání nového modulu v jazyce C. Místo složitých úprav stávajících rozhraní AMI, AGI bylo připraveno nové, které oba postupy kombinuje a způsobem bližším webovým aplikacím.

V ARI je komunikace založena na protokolu HTTP a události jsou zasílány přes websocket v JSONu. Díky těmto obecným standardům je možné ARI použít z jakéhokoliv vámi oblíbeného jazyka.

Pomocí ARI je možné manipulovat s nízkoúrovňovými objekty, jako jsou kanály, bridge, endpointy apod.

ARI je dokumentováno pomocí nástroje Swagger. Dá se tudíž používat interaktivně pomocí Swagger UI. Tento nástroj je hostován také na adrese ari.asterisk.org.

Dokumentace ARI pomocí nástroje Swagger

Pro fungování je třeba povolit interní HTTP server, který se konfiguruje v http.conf.

ARI samotné je konfigurováno pomocí ari.conf. Komunikace s ARI musí být ověřována. Podporovány jsou dvě metody:

  1. Api key (username:password)
  2. HTTP basic authentication

Na velmi jednoduchém příkladu si ukážeme, jak v naší aplikaci zvedneme příchozí hovor a přehrajeme hlásku.

V dialplánu vytvoříme routing pro telefonní číslo 800 123 456

[infolinka]
exten => 800123456,1,Noop()
same => n,Stasis(aplikace_infolinka,volajici_cislo)
same => n,Hangup()

Naše aplikace běží a je připojena na websocket port Asterisku.

V případě příchozího hovoru vidíme událost, v které přečteme id volajícího kanálu

CHANID=1381870452.0

Pomocí funkce answer můžeme hovor zvednout (answer)

$ curl -v -u aplikace_infolinka:tajneheslo -X POST "http://localhost:8088/ari/channels/$CHANID/answer"

Pomocí funkce play můžeme volajícímu přehrát soubor

$ curl -v -u aplikace_infolinka:tajneheslo -X POST "http://localhost:8088/ari/channels/$CHAN/play?media=sound:hello-world" | jsonpp

Popis ARI by vydal na samostatný článek, takže zájemce odkážeme na dokumentaci na wiki.

SIP – PJSIP

Velkou novinkou, která by také vydala na samostatný článek, je přechod na externí SIP stack. Původní SIP stack vznikl někdy v roce 2002. V té době byl SIP stále ještě relativně mladý standard a nebylo jasné, jakou pozici si na trhu vybojuje. Dnes již víme, že je v oblasti VoIP dominantní. Návrh SIP kanálu chan_sip tedy odpovídal své době. V průběhu času, kdy rozšíření SIP protokolu vznikají jako na běžícím pásu, již úpravy původního chan_sip byly velmi problematické. Na AstriDevConu 2012 bylo tedy rozhodnuto, že je třeba nějaká změna. Proběhla analýza SIP stacků a vybrán byl SIP stack PJSIP, který sponzoruje společnost Teluu. Informace o výběru SIP stacku a argumentech je dostupná v mailinglistu.

Na tomto SIP stacku funguje např. i SW VoIP telefon pro platformu Android – CsipSimple. V Asterisku 12 je pořád dostupný i původní chan_sip. Nový se jmenuje chan_pjsip. Není již ale monolitický, ale modulární, takže funkcionalita je oddělena do jednotlivých samostatných modulů.

Architektura kanálu chan_pjsip

Aby bylo možné chan_pjsip zkompilovat, je třeba mít nainstalované knihovny pjproject, které pjsip obsahují. Současná verze pjprojectu bohužel nepodporovala sdílení knihoven. Firma Digium ve spolupráci s firmou Teluu vytvořily úpravy, které se objeví v příští verzi pjprojectu. Nyní je potřeba použít tuto upravenou verzi na githubu.

Pokud chcete podpořit vydání rpm balíčku pjproject pro Red Hat systémy, tak se připojte na bugzilla.redhat.comPřípadně můžete zatím použít balíčky podporované firmou Digium.

Konfigurace nového SIP kanálu je v souboru pjsip.conf. Existuje konverzní nástroj sip_to_pjsip.py, který vám pomůže převést starou konfiguraci.

Velkou změnou, po které uživatelé dlouho volali, je možnost registrace více zařízení na jeden SIP účet. V původní verzi toto možné nebylo a příchozí hovory fungovaly vždy na poslední zaregistrované zařízení.

Nová verze, stejně jako původní, podporuje fungování z databáze pomocí Realtime architektury. Tzn. že můžete SIP účty jednoduše spravovat bez ruční editace textových souborů. Správa SQL schémat je nově řešena pomocí nástroje Alembic.

V dialplánu se nový SIP kanál používá podobně jako starý

exten => _6XXX,1,Dial(PJSIP/${EXTEN})

ukázková konfigurace SIP telefonu

[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0

[6001]
type = endpoint
transport = simpletrans
context = internal
disallow = all
allow = ulaw
aors = 6001
auth = auth6001

[6001]
type = aor
max_contacts = 1

[auth6001]
type=auth
auth_type=userpass
password=1234
username=6001

Na první pohled je vidět, že konfigurace vypadá složitěji. Je to zejména tím, že se více snaží přiblížit SIP světu a SIP terminologii.

Vztahy jednotlivých objektů

Podrobné vysvětlení pro dychtivé čtenáře je na wiki.

Menší funkce a upgrady ze starších verzí

Pokud budete novou verzi testovat, upozorním vás na pár věcí, s kterými jsem se sám setkal a jsou uvedeny v dokumentu pro upgrade na novou verzi. Samozřejmostí je si vždy udělat zálohu a ponechat si možnost vrátit se k původní osvědčené verzi Asterisku.

Pro převod textové konfigurace sip.conf do nového kanálu chan_pjsip je možné požít nástroj sip_to_pjsip.py.

AMI,CDR,CEL subsystémy prodělaly velké změny. Pečlivě pročtěte dokumentaci.

Stávající modul chan_agent byl nahrazen modulem app_agent_pool. Jedním z dopadů je, že aplikace Agentlogin již neprovádí ověření uživatele. Je třeba ji nahradit v dialplánu např. aplikací Authenticate.

Aplikace NoCDR je deprecated. Používejte funkci CDR_PROP.

Pro podporu ICE/STUN/TURN protokolů při použití Asterisku za NATem je třeba použít knihovny pjproject, viz chan_pjsip.

Některé funkce byly označené jako „nebezpečné“ a je možné je používat pouze z dialplánu. Nelze je používat např. přes AMI. Tato bezpečnostní funkce lze vypnout v asterisk.conf pomocí direktivy „live_dangerously“

res_statsd/res_chan_stats je nový modul, který funguje jako klient statsd a zjednodušuje tvorbu statistik. Konfigurace je obsažena v souboru res_statsd.conf.

Zdroje

https://wiki.asterisk.org/wi­ki/display/AST/New+in+12

https://wiki.asterisk.org/wi­ki/display/AST/Asterisk+12+Pro­jects

https://wiki.asterisk.org/wi­ki/display/AST/Asterisk+12+Do­cumentation

http://svnview.digium.com/svn/as­terisk/branches/12/CHANGES

http://svn.asterisk.org/svn/as­terisk/branches/12/UPGRADE­.txt

root_podpora

http://downloads.asterisk­.org/pub/telephony/asteris­k/releases/ChangeLog-12.0.0

http://astrecipes.net/index­.php?q=AstRecipes/Getting%20star­ted%20with%20ARI

Byl pro vás článek přínosný?

Autor článku

Autor pracuje ve společnosti IPEX a.s. a ve volném čase se zabývá podporou open-source komunikačních projektů.