SlideShare a Scribd company logo
1 of 153
Download to read offline
<exploring:xmpp/>
            Jack Moffitt
Why XMPP?
HTTP APIs are great
HTTP polling sucks
Real time is different
XMPP is real time
XMPP basics
XMPP network
XMPP addressing
example.com
jack@example.com
jack@example.com/home
jack@example.com/work
jack@example.com/7a29d835f9c
XMPP protocol
XML
XML streams
XML stanzas
<message/>
<presence/>
<iq/>
<message/>
<message
    from=’juliet@sapo.pt/home’
    to=’romeo@sapo.pt’
    type=’chat’>
 <body>
  Wherefore art thou, Romeo?
 </body>
</message>
<message
    from=’juliet@sapo.pt/home’
    to=’romeo@sapo.pt’
    type=’chat’>
 <body>
  Wherefore art thou, Romeo?
 </body>
</message>
<message
    from=’juliet@sapo.pt/home’
    to=’romeo@sapo.pt’
    type=’chat’>
 <body>
  Wherefore art thou, Romeo?
 </body>
</message>
<message
    from=’juliet@sapo.pt/home’
    to=’romeo@sapo.pt’
    type=’chat’>
 <body>
  Wherefore art thou, Romeo?
 </body>
</message>
<message
   from=’juliet@sapo.pt/home’
   to=’romeo@sapo.pt’
   type=’chat’>
 <body>
  Wherefore art thou, Romeo?
 </body>
</message>
<presence/>
<presence>
 <show>away</show>
 <status>At Codebits</status>
</presence>
<presence
    type=’available’>
 <show>away</show>
 <status>At Codebits</status>
</presence>
<presence
    type=’available’>
 <show>away</show>
 <status>At Codebits</status>
</presence>
<presence
    type=’available’>
 <show>away</show>
 <status>At Codebits</status>
</presence>
<iq/>
<iq
    to=’sapo.pt’
    type=’get’
    id=’disco:1’>
 <query xmlns=’disco#info’/>
</iq>
<iq
    to=’sapo.pt’
    type=’get’
    id=’disco:1’>
 <query xmlns=’disco#info’/>
</iq>
<iq
    to=’sapo.pt’
    type=’get’
    id=’disco:1’>
 <query xmlns=’disco#info’/>
</iq>
<iq
    to=’sapo.pt’
    type=’get’
    id=’disco:1’>
 <query xmlns=’disco#info’/>
</iq>
<iq
    to=’sapo.pt’
    type=’get’
    id=’disco:1’>
 <query xmlns=’disco#info’/>
</iq>
<iq
    to=’romeo@sapo.pt/home’
    from=’sapo.pt’
    type=’result’
    id=’disco:1’>
 <query xmlns=’disco#info’>
   <identity category='server' type='im'
    name='ejabberd'/>
   <feature var='vcard-temp'/>
 </query>
</iq>
<iq
    to=’romeo@sapo.pt/home’
    from=’sapo.pt’
    type=’result’
    id=’disco:1’>
 <query xmlns=’disco#info’>
   <identity category='server' type='im'
    name='ejabberd'/>
   <feature var='vcard-temp'/>
 </query>
</iq>
<iq
    to=’romeo@sapo.pt/home’
    from=’sapo.pt’
    type=’result’
    id=’disco:1’>
 <query xmlns=’disco#info’>
   <identity category='server' type='im'
    name='ejabberd'/>
   <feature var='vcard-temp'/>
 </query>
</iq>
<iq
    to=’romeo@sapo.pt/home’
    from=’sapo.pt’
    type=’result’
    id=’disco:1’>
 <query xmlns=’disco#info’>
   <identity category='server'
    type='im'
    name='ejabberd'/>
   <feature var='vcard-temp'/>
 </query>
</iq>
The application
example
contrived
Server monitoring
Goodbye SNMP
XMPP APIs
Features
Collection hub
Collectors are XMPP bots
Controlled via client
Presence
Discovery
Commands
Notification
No processing
Presence
Communicates status
Subscribing
<presence
  type=’subscribe’
  to=’xmpp@mon.sapo.pt’/>
<presence
  type=’subscribed’
  from=’xmpp@mon...’
  to=’client@mon...’/>
Rosters
<iq
   type=’get’
   id=’roster1’>
 <query
     xmlns=’jabber:iq:roster’/>
</iq>
<iq
   type=’result’
   id=’roster1’>
 <query
     xmlns=’jabber:iq:roster’>
   <item
      jid=’xmpp@mon...’
      subscription=’to’/>
 </query>
</iq>
Initial presence
<presence/>
Starting up
<presence
  from=’xmpp@mon...’/>
Dead server
<presence
  type=’unavailable’
  from=’xmpp@mon...’/>
Busy server
<presence
  type=’available’>
 <show>away</show>
 <status>
  Overloaded. Can’t take
  more jobs.
 </status>
</presence>
Discovery
Meta information
Disco info
<iq
   id=’disco1’
   type=’get’
   to=’xmpp@mon...’>
 <query
     xmlns=’.../disco#info’/>
</iq>
<iq ...>
 <query
    xmlns=’.../disco#info’>
   <identity
       name=’XMPP Monitor’
       category=’monitor’
       type=’server’/>
 </query>
</iq>
Statistics available
Disco items
<iq
   id=’disco2’
   type=’get’
   to=’xmpp@mon...’>
 <query
     xmlns=’.../disco#items’/>
</iq>
<iq ...>
 <query xmlns=’.../disco#items’>
   <item
       name=’CPU Load’
       jid=’xmpp@mon...’
       node=’cpu’/>
   ...
 </query>
</iq>
<iq ...>
 <query xmlns=’.../disco#items’>
   <item
       name=’CPU Load’
       jid=’xmpp@mon...’
       node=’cpu’/>
   ...
 </query>
</iq>
<iq ...>
 <query xmlns=’.../disco#items’>
   <item
       name=’CPU Load’
       jid=’xmpp@mon...’
       node=’cpu’/>
   ...
 </query>
</iq>
Gathering statistics
Disco info again
With a node
<iq
   id=’disco3’
   type=’get’
   to=’xmpp@mon...’>
 <query
     xmlns=’.../disco#info’
     node=’cpu’/>
</iq>
<iq ...>
 <query xmlns=’.../disco#info’
    node=’cpu’>
   <statisic
       xmlns=’codebits’
       name=’5-min’
       value=’0.4’/>
 </query>
</iq>
<statistic/>
Extended stanza
Create your own
Namespace
<iq ...>
 <query xmlns=’.../disco#info’
    node=’cpu’>
   <statisic
       xmlns=’codebits’
       name=’5-min’
       value=’0.4’/>
 </query>
</iq>
Commands
Ad-hoc commands
RPC
Input and output
Data forms
<x xmlns='jabber:x:data' type='...'>
 <field type='hidden'
    var='FORM_TYPE'>
  <value>jabber:bot</value>
 </field>
 <field type='text-single'
    var='botname'>
  <value>Awesome Bot</value>
 </field>
</x>
<x xmlns='jabber:x:data' type='...'>
 <field type='hidden'
    var='FORM_TYPE'>
  <value>jabber:bot</value>
 </field>
 <field type='text-single'
    var='botname'>
  <value>Awesome Bot</value>
 </field>
</x>
<x xmlns='jabber:x:data' type='...'>
 <field type='hidden'
    var='FORM_TYPE'>
  <value>jabber:bot</value>
 </field>
 <field type='text-single'
    var='botname'>
  <value>Awesome Bot</value>
 </field>
</x>
<x xmlns='jabber:x:data' type='...'>
 <field type='hidden'
    var='FORM_TYPE'>
   <value>jabber:bot</value>
 </field>
 <field type='text-single'
    var='botname'>
  <value>Awesome Bot</value>
 </field>
</x>
<x xmlns='jabber:x:data' type='...'>
 <field type='hidden'
    var='FORM_TYPE'>
  <value>jabber:bot</value>
 </field>
 <field type='text-single'
    var='botname'>
   <value>Awesome Bot</value>
 </field>
</x>
Reboot command
<iq ...>
 <command
    xmlns=’.../commands’
    node=’reboot’
    action=’execute’/>
</iq>
<iq ...>
 <command
    xmlns=’.../commands’
     node=’reboot’
    action=’execute’/>
</iq>
<iq ...>
 <command
    xmlns=’.../commands’
    node=’reboot’
    action=’execute’/>
</iq>
<iq ...>
 <command
    xmlns=’.../commands’
    node=’reboot’
    status=’completed’/>
</iq>
Stats reset
Shell commands
Notifications
Important events
Limits exceeded
Publish subscribe
Pubsub
Nodes
Node hierarchy
Leaves
Collections
Bots publish
Client subscribes
PEP
Personal eventing protocol
Profile of pubsub
Simple
Presence
Every JID is a pubsub node
Subscriptions are automatic
Publishing
<iq ...>
 <pubsub xmlns=’.../pubsub’>
   <publish node=’codebits’>
    <item>
       <rebooted
         xmlns=’codebits’/>
    </item>
   </publish>
 </pubsub>
</iq>
<iq ...>
 <pubsub xmlns=’.../pubsub’>
   <publish node=’codebits’>
    <item>
       <rebooted
         xmlns=’codebits’/>
    </item>
   </publish>
 </pubsub>
</iq>
<iq ...>
 <pubsub xmlns=’.../pubsub’>
   <publish node=’codebits’>
    <item>
       <rebooted
         xmlns=’codebits’/>
    </item>
   </publish>
 </pubsub>
</iq>
<iq ...>
 <pubsub xmlns=’.../pubsub’>
   <publish node=’codebits’>
    <item>
       <rebooted
         xmlns=’codebits’/>
    </item>
   </publish>
 </pubsub>
</iq>
<iq ...>
 <pubsub xmlns=’.../pubsub’>
   <publish node=’codebits’>
    <item>
       <rebooted
         xmlns=’codebits’/>
    </item>
   </publish>
 </pubsub>
</iq>
Subscribing
Automatic
Entity capabilities
Caps
Caps extend presence
<presence>
 <c
    xmlns=’.../caps’
    node=’codebits’
    hash=’sha-1’
    ver=’...hash...’/>
</presence>
<presence>
 <c
    xmlns=’.../caps’
    node=’codebits’
    hash=’sha-1’
    ver=’...hash...’/>
</presence>
<presence>
 <c
    xmlns=’.../caps’
    node=’codebits’
    hash=’sha-1’
    ver=’...hash...’/>
</presence>
Interpreted via disco
<feature var=’codebits’/>
<feature var=’codebits+notify’/>
Events
<message ...>
 <event xmlns=’.../pubsub’>
  <items node=’codebits’>
    <item>
     <rebooted xmlns=’codebits’/>
    </item>
  </items>
 </event>
</message>
Just add code
http://www.xmpp.org

 http://metajack.im

 jack@metajack.im

More Related Content

More from codebits

Gis SAPO Hands On
Gis SAPO Hands OnGis SAPO Hands On
Gis SAPO Hands Oncodebits
 
Aplicações Web TV no Meo
Aplicações Web TV no MeoAplicações Web TV no Meo
Aplicações Web TV no Meocodebits
 
Forms Usability 101
Forms Usability 101Forms Usability 101
Forms Usability 101codebits
 
Speak up: como criar Speech-based apps
Speak up: como criar Speech-based appsSpeak up: como criar Speech-based apps
Speak up: como criar Speech-based appscodebits
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-Oncodebits
 
Mitos da Acessibilidade Web
Mitos da Acessibilidade WebMitos da Acessibilidade Web
Mitos da Acessibilidade Webcodebits
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunnercodebits
 
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...codebits
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunnercodebits
 
Sapo BUS Hands-On
Sapo BUS Hands-OnSapo BUS Hands-On
Sapo BUS Hands-Oncodebits
 
Qtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencerQtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencercodebits
 
Making the Chumby
Making the ChumbyMaking the Chumby
Making the Chumbycodebits
 
Globs - Gestão de Glossários
Globs - Gestão de GlossáriosGlobs - Gestão de Glossários
Globs - Gestão de Glossárioscodebits
 
ATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de TraduçõesATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de Traduçõescodebits
 
Alto Desempenho com Java
Alto Desempenho com JavaAlto Desempenho com Java
Alto Desempenho com Javacodebits
 
Sapo GIS Hands-On
Sapo GIS Hands-OnSapo GIS Hands-On
Sapo GIS Hands-Oncodebits
 
Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008codebits
 
Optimização de pesquisas Web utilizando Colónias de Formigas
Optimização de pesquisas Web utilizando Colónias de FormigasOptimização de pesquisas Web utilizando Colónias de Formigas
Optimização de pesquisas Web utilizando Colónias de Formigascodebits
 

More from codebits (20)

Gis SAPO Hands On
Gis SAPO Hands OnGis SAPO Hands On
Gis SAPO Hands On
 
Aplicações Web TV no Meo
Aplicações Web TV no MeoAplicações Web TV no Meo
Aplicações Web TV no Meo
 
Forms Usability 101
Forms Usability 101Forms Usability 101
Forms Usability 101
 
Speak up: como criar Speech-based apps
Speak up: como criar Speech-based appsSpeak up: como criar Speech-based apps
Speak up: como criar Speech-based apps
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-On
 
Mitos da Acessibilidade Web
Mitos da Acessibilidade WebMitos da Acessibilidade Web
Mitos da Acessibilidade Web
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunner
 
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
 
CouchDB
CouchDBCouchDB
CouchDB
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunner
 
Sapo BUS Hands-On
Sapo BUS Hands-OnSapo BUS Hands-On
Sapo BUS Hands-On
 
Qtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencerQtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencer
 
Making the Chumby
Making the ChumbyMaking the Chumby
Making the Chumby
 
Globs - Gestão de Glossários
Globs - Gestão de GlossáriosGlobs - Gestão de Glossários
Globs - Gestão de Glossários
 
ATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de TraduçõesATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de Traduções
 
Alto Desempenho com Java
Alto Desempenho com JavaAlto Desempenho com Java
Alto Desempenho com Java
 
Sapo GIS Hands-On
Sapo GIS Hands-OnSapo GIS Hands-On
Sapo GIS Hands-On
 
Gis@sapo
Gis@sapoGis@sapo
Gis@sapo
 
Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008
 
Optimização de pesquisas Web utilizando Colónias de Formigas
Optimização de pesquisas Web utilizando Colónias de FormigasOptimização de pesquisas Web utilizando Colónias de Formigas
Optimização de pesquisas Web utilizando Colónias de Formigas
 

Exploring XMPP