úterý 5. července 2016

Plivo a Odorik - Plně programovatelná ústředna (C#)

Plivo a Odorik

Plivo je služba z kategorie CPaaS (komunikační platforma jako služba). Plivo umožňuje programovaní komunikačních služeb postavených na SIP ve většině moderních programovacích jazyků (Java, Node.js, PHP, Python, Ruby, and C#). Pro základní orientaci v problematice doporučuji následující odkazy

https://www.onsip.com/blog/what-is-cpaas-communications-platform-as-a-service-explained
https://fonolo.com/blog/2016/04/twilio-tropo-nexmo-plivo-zang-what-does-it-all-mean/

A samozřejmě vlastní stránky www.plivo.com

Příchozí a odchozí hovory v rámci České republiky jsou ve zde popisovaném řešení realizovány skrze operátora Odorik, který interoperabilitu s Plivo umožňuje. Propojení s Odorikem samozřejmě není nezbytné a pro volání lze plně používat pouze Plivo, bohužel za nesrovnatelně vyšší ceny.

Možnosti programování samozřejmě nejsou zadarmo a musíte si připravit 0.0060 USD za minutu za odchozí i příchozí SIP hovory (15 haléřů za minutu, tj. 9 kč za hodinu). Tato částka je navíc k ceně hovoru, který zaplatíte u operátora Odorik. 

Seznámení s platformou Plivo

Řízení hovoru je možné provádět dvěma nástroji. Jednodušší přístup je pomocí dynamického řídícího xml, které generuje vámi vystavená webová aplikace. Cílových bodů, které vrací řídící xml může být více a využijete je dle konstrukce vaší aplikace. Také lze použít jeden koncový bod parametrizovaný přímo v url dotazu. Vždy si můžete vybrat jakou webovou metodou od vás řídící xml Plivo získá (GET nebo POST). Druhou možností je na místo vygenerování požadavku provést přímou operaci s hovorem dle jeho UUID skrze definované API.

Příklad řídícího xml (sekvenční vytáčení)


1
2
3
4
5
6
7
8
<Response>
    <Dial timeout="20" action="http://foo.com/dial_action/">
        <Number>18217654321</Number>
    </Dial>
    <Dial>
        <Number>15671234567</Number>
    </Dial>
</Response>


Příchozí hovory z Odoriku

Příchozí hovory můžete z Odoriku přesměrovat na Plivo aplikaci pomocí paralelního vyzvánění sip:{cislo_aplikace}@app.plivo.com. Pokud používáte trunk a máte více čísel než jedno, tak je nutné tento krok provést pro každé číslo. Tento krok lze automatizovat skrze API, které Odorik nabízí. 

Díky tomuto přesměrování je bohužel ztracena informace o čísle, které bylo voláno. Toto číslo je nahrazeno číslem aplikace. Odorik proto přidává do hlavičky SIP požadavku parametr X-PH-target_number. Dle tohoto parametru pak můžete rozhodovat na který telefon (endpoint) budete hovor směrovat a připravit patřičné XML.


Odchozí hovory skrze Odorik

Směrování odchozích hovorů je složitější. Plivo neumožňuje jednoduché volání skrze trunk, jelikož je pro něj vhodné, aby uživatelé platili za zprostředkování hovorů skrze jeho služby.

V tomto případě je tedy nutné použít drobnou obezličku. Hovor přesměrujete na veřejné číslo ze kterého chcete volat sip:{verejne_cislo}@sip.odorik.cz a nastavíte podmíněné přesměrování pomocí API Odoriku. V Plivu v rámci přesměrování odchozího hovoru nastavíte identifikaci volajícího na stejné veřejné číslo. 

Příklad aktualizace směrování skrze API Odoriku

    public class Odorik
    {
        const string odorikAPI = "https://www.odorik.cz/api/v1/public_numbers/{0}/routes.json?user={1}&password={2}";

        public static void UpdateRouting(string publicNumber, string sourceNumber, string ringingNumber)
        {
            var formContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("source_number", sourceNumber),
                new KeyValuePair<string, string>("ringing_number", ringingNumber),
                new KeyValuePair<string, string>("replace_by_source_number", "true")
            });

            string user = WebConfigurationManager.AppSettings["OdorikAPIUser"];
            string password = WebConfigurationManager.AppSettings["OdorikAPIPassword"];

            var httpClient = new HttpClient();
            var response = httpClient.PostAsync(String.Format(odorikAPI, publicNumber, user, password), formContent).Result;
        }
    }

Přidané pravidlo bude říkat následující věc: "Pro veřejné číslo přesměruj hovor na specifické číslo pokud hovor přišel ze sebe sama". Takto definovaným pravidlem je zajištěno, že nedojde k přesměrování v žádné jiné situaci.


Ukázková implementace

Ukázková implementace řeší následující problematiku
  • Možnost základní definice uživatelů a veřejných čísel pomocí xml
  • Webové rozhraní pro přihlašování k určité veřejné lince (například linka podpory)
  • Definovatelné nahrávání hovorů pro každé veřejné číslo
  • Ukázkový script na řešení logiky linky podpory
    • Možnost volby zpětného zavolání mimo provozní hodiny
    • Fronta čekajících zákazníků

Pokud budu mít chvilku tak projekt zveřejním na Githubu a napíšu k němu dokumentaci. Prozatím pouze pro vaši inspiraci v této formě. Pozor v projektu nejsou dostupné audio soubory na které je odkazováno. 

Pokud vás bude cokoliv zajímat, tak stačí napsat.

Žádné komentáře:

Okomentovat