Hlavní navigace

Jabber - komunikačný protokol (4)

Peter Sivák

Viete, čo je presentita? Je to entita, ktorá poskytuje informáciu o svojej dostupnosti (presence) prezenčnej službe. Môžu to byť ľudia, ktorí sú prihlásení pomocou IM klienta. Prostredníctvom neho zverejňujú informáciu o svojej dostupnosti - napr. či sedia v práci pri počítači (...online), alebo sa vyhrievajú na pláži (...dnd). Presentitou však možno nazvať aj veľa iných vecí.

Presentita je entita, ktorá zverejňuje svoju dostupnosť. V sieťovej terminológii nazývame entitou všetko, čo sa dá adresovať (teda má adresu). V kontexte komunikačnej technológie je dostupnosť vo svojej podstate logický indikátor pripravenosti na komunikáciu. Čo, prípadne kto môže komunikovať po sieti? Samozrejme sú to ľudia, ale nielen oni. Sú to tiež roBoty, servery, chatovacie miestnosti, služby, routre, firewally, brány a rôzne iné zariadenia, ktoré môžu byť pripojené na sieť. Beží firewall, router, alebo web server? Je roBot schopný odpovedať? Je v kávovare káva? (predzvesť Coffee mini-howto pre XMPP :) To všetko je dostupnosť. Dostupnosť entity je dôležitá aj pre server. Ak je entita nedostupná, tak všetky správy pre ňu zatiaľ čakajú na serveri.

Aj parkovacie miesto môže byť presentitou. Stačí ho vybaviť senzorom a programom sprostredkovať informáciu, či je miesto voľné alebo obsadené. Podobným spôsobom môžu byť riešené bezpečnostné systémy budov.

Mobilní operátori prevádzkujú tzv. Home Location Register – databázu s informáciami o dostupnosti a umiestnení mobilných telefónov svojich zákazníkov. Bolo by zaujímavé sledovať vývoj mobilných telefónov využívajúcich informácie o dostupnosti. Ešte pred vytočením čísla by sme videli, či je iný používateľ mobilnej siete dostupný, prípadne či si želá byť rušený. Ale späť do reality! Pozrime sa ako situáciu rieši XMPP.

Z názvu protokolu XMPP (eXtensible Messaging and Presence Protokol) vidieť, že je to protokol nielen o posielaní správ, ale aj o sprostredkovávaní infromácii o dostupnosti. XMPP posiela informácie o dostupnosti v Presence paketoch. Tie obsahujú informáciu spracovateľnú počítačmi (napr. online, away) a informáciu pre ľudí. Informácia pre ľudí môže byť akýkoľvek text.

XMPP využíva na zverejňovanie dostupnosti návrhový vzor pozorovateľ (observer, publish/subscribe). Entity sa prihlasujú/od­hlasujú na odber správ o zmene dostupnosti inej entity. Ak entita zmení svoj stav (dostupnosť), tak pošle Presence paket serveru a ten rozošle Presence pakety všetkým entitám, ktoré sú prihlásené na odber týchto správ (sú v rosteri entity). Entita sa môže dostať do rostera inej entity len s jej dovolením.

Dostupnosť môže byť online, alebo offline (available/una­vailable). Ak je entita online, tak je dostupná aj podrobnejšia informácia (away, do not disturb, …) Zmenu dostupnosti JIDu docielime v XMPP odoslaním paketu typu Presence. V Smacku to znamená vytvorenie objektu triedy Presence a odovzdanie vytvoreného objektu metóde sendPacket():

// Vytvorenie paketu a jeho nastavenie na "nedostupný"
Presence presence = new Presence(Presence.Type.UNAVAILABLE);
// Infomácia pre ľudí.
presence.setStatus("Čítam Root.cz");
// Odoslanie paketu.
// con je vytvorený objekt triedy XMPPConnection alebo SSLXMPPConnection
con.sendPacket(presence); 

V prípade, že nastavíme dostupnosť na Presence.Type­.AVAILABLE, tak môžeme upresniť informáciu o dostupnosti na­pr.:

presence.setMode(Presence.Mode.DO_NOT_DISTURB);

Ďalšie možnosti sú:

  • Presence.Mode­.AVAILABLE
  • Presence.Mode.AWAY
  • Presence.Mode.CHAT
  • Presence.Mode­.EXTENDED_AWAY
  • Presence.Mode­.INVISIBLE

Roster

Roster je zoznam kontaktov, ktorý nám umožňuje zisťovať informáciu o dostupnosti iných entít. Najmä v iných IM službách sa môžeme stretnúť s názvami ako contact list, buddy list a pod.

Kontakty sú v rosteri organizované do skupín, ktorým môžeme priradiť mená. Každý kontakt môže patriť žiadnej, jednej, alebo viacerým skupinám. Každá položka rosteru obsahuje JID entity, meno, ktoré jej môžeme ľubovolne priradiť a zoznam skupín, do ktorých patrí. Roster môžeme získať takto:

Roster roster = con.getRoster();

Zrejme najdôležitejšou metódou triedy Roster je metóda umožňujúca získať mená všetkých kontaktov. Nasleduje príklad, ktorý ich vypíše na štandartný výstup.

for (Iterator i=roster.getEntries(); i.hasNext(); ) {
  System.out.println(i.next());

} 

Paket Presence o konkrétnom kontakte v rosteri získame metódou

Presence presence = roster.getPresence("meno");

a následne informáciu o dostupnosti metódami:

Presence.Mode Presence.getMode();
Presence.Type Presence.getType();

V prípade, že getPresence() nenájde kontakt so zadaným menom, vráti null.

Prebrali sme nastavovanie a získavanie informácii o dostupnosti entity. Ešte nás čaká obsluha udalosti vyvolanej zmenou dostupnosti niektorej entity alebo zmenou v samotnom rosteri. To docielime registrovaním metód na obsluhu tých udalostí.

roster.addRosterListener(new RosterListener() {
  (public void rosterModified() {
    // ...
  }

  (public void presenceChanged(String user) {
    // ...
  }
}); 

Tu rozprávanie o presentitách skončíme. O týždeň budeme pokračovať opisom prenášania informácii v IQ paketoch. To sa nám zíde pri vytváraní webových služieb.

Našli jste v článku chybu?