pyMeet
VideoConferencia sobre JABBER
Javi Palanca
¿ Qué es el proyecto pyMeet ?
• PyMeet, es una aplicación de Mensajería Instantánea basada en el protocolo Jabber con soporte para videoconferencia en tiempo real.
• Soporte del protocolo JABBER de mensajería instantánea • Notificaciones de presencia, actividad, etc...
• Posibilidad de videoconferencia con varias personas simultaneamente
• Diferentes algoritmos de compresión (modulares)
• Implementado en Python (modular y fácilmente portable)
• Preparado soporte de voz (no implementado) mediante el formato de compresión ogg/Speex
3
¿ Porqué pyMeet ?
• No existen programas (libres) que den soporte de
videoconferencia para Mensajería Instantánea sobre Jabber. • GAIM no sigue el modelo de desarrollo de GNOME:
– ciclos de 6 meses – HIG
– no aceptan parches – etc...
• GOSSIP está muy verde aún... (pero le seguimos la pista) • Queríamos hacerlo en PYTHON :-)
¿ Qué es Jabber ?
• Abierto, público y libre
• Estándar
• Probado
• Descentralizado
• Seguro
• Extensible
• Flexible
5
¿ Cómo funciona Jabber ?
Extensiones al Protocolo
• El protocolo Jabber está definido por la Jabber Foundation en una serie de estándares que explican «exactamente» como debe llevarse a cabo el proceso básico de comunicación.
• Las dos especificaciones básicas son el XMPP Core y el XMPP IM.
• El resto de características están definidas en los JEP (Jabber
Enhancement Proposals)
– JEP-0022: Message Events
– JEP-0047: In-Band Bytestreams (IBB)
– JEP-0066: Out of Band Data
– JEP-0095: Stream Initiation
7
message:chat
<message to='[email protected]' from='[email protected]/balcony' type='chat' xml:lang='en'> <body>Wherefore art thou, Romeo?</body> </message>jabber:x:event
<message to='[email protected]' id='message22'> <body> Art thou not Romeo, and a Montague? </body> <x xmlns='jabber:x:event'> <offline/> <delivered/> <composing/> </x> </message>9
message:iq
<iq from='example.com' type='error' id='sess_1'> <session xmlns='urn:ietf:params:xml:ns:xmppsession'/> <error type='cancel'> <conflict xmlns='urn:ietf:params:xml:ns:xmpptanzas'/> </error> </iq>Extendiendo el protocolo Jabber
<message to='[email protected]' id='message22'> <body> Art thou not Romeo, and a Montague? </body> <x xmlns='jabber:x:event'> <offline/> <delivered/> <composing/> <closed/> </x> </message>11
El Protocolo de Videoconferencia
• Es un apoyo visual a la conversación • Debe estar basado en XML
• Interoperable con clientes que no soporten el protocolo
• Es únicamente una prueba de concepto. Ahora falta implementar un protocolo estándar de videoconferencia (¿cual?)
• Protocolo:
– Protocolo de Inicialización
Protocolo de Inicialización
• Basado en el JEP-0095:Stream Initiation.
• Si la comunicación va a ser P2P hay que informar de la dirección y el puerto para establecer la comunicación.
• Se devolverá en todo caso una respuesta afirmativa o negativa indicando si está dispuesto a abrir un canal de comunicación.
13
Stream Initiation
<iq type='set' id='offer1' to='[email protected]/resource'> <si xmlns='http://jabber.org/protocol/si' id='a0' mimetype='binary/octet stream' profile='http://jabber.org/protocol/si/profile/filetransfer'> <profile xmlns='http://jabber.org/protocol/si/profile/filetransfer'> <info>This is info</info> <flag/> </profile> <streamhost jid='[email protected]/PyMeet' host='174.16.1.2' port='7676' /> <feature xmlns='http://jabber.org/protocol/featureneg'> <x xmlns='jabber:x:data' type='form'> <field var='streammethod' type='listsingle'> <option> <value>http://jabber.org/protocol/bytestreams</value> </option> <option><value>jabber:iq:oob</value></option> </field> </x> </feature> </si> </iq>ACK
<iq type='result' to='[email protected]/resource' id='offer1'> <si xmlns='http://jabber.org/protocol/si'> <feature xmlns='http://jabber.org/protocol/feature-neg'> <x xmlns='jabber:x:data' type='submit'> <field var='stream-method'> <value>http://jabber.org/protocol/bytestreams</value> </field> </x> </feature> </si> </iq>
15
ACK
<iq type='error' to='[email protected]/resource' id='offer1'> <error code='400' type='cancel'>
<bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> <no-valid-streams xmlns='http://jabber.org/protocol/si'/>
</error> </iq>
Protocolo de Envio de Datos
• In-Band Bytestreams (IBB)
– JEP-0047
• Out of Band Data
– JEP-0066
• Compresión:
– raw (sin compresión) – gz
– bz2 – sparse
17
In-Band Bytestreams (IBB)
<message from='[email protected]/orchard' to='[email protected]/balcony' id='msg1'> <data xmlns='http://jabber.org/protocol/ibb'sid='mySID' seq='0'> qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA </data> <amp xmlns='http://jabber.org/protocol/amp'>
<rule condition='deliver-at' value='stored' action='error'/>
<rule condition='match-resource' value='exact' action='error'/>
</amp> </message>
In-Band Bytestreams (IBB)
• Ventajas:
– Potente
– Permite enviar mucha información de manera estándar (XML): • sincronización • cabeceras • audio • número de secuencia • identificador de sesión • etc... • Desventajas:
– Los mensajes pasan a través del servidor (no es P2P) – El servidor descarta mensajes muy grandes :(
19
Out of Band Data
• Conexión punto a punto entre los clientes (P2P)
• No es necesario que los mensajes de datos pasen por el servidor • Por el servidor pasan mensajes de control (iq)
Compresión
• raw (sin compresión) • gz
• bz2 • sparse
21
Mejoras al protocolo
• RTP (RealTime Transport Protocol) • RTSP (RealTime Streaming Protocol) • Audio (ogg/Speex)
RealTime Transport Protocol
• Protocolo punto-a-punto para aplicaciones de transmisión de datos en tiempo real (audio, video, simulación...)
• RTP no reserva recursos ni garantiza la calidad de servicio (QoS) • RTCP (Realtime Transport Control Protocol) para monitorización y
control.
• Ver, Version. 2 bits. • P, Padding. 1 bit. • X, Extension. 1 bit. • CC, CSRC count. 4 bits. • M, Marker. 1 bit.
• PT, Payload Type. 7 bits. • Sequence Number. 16 bits. • Timestamp. 32 bits.
• SSRC, Synchronization source. 32 bits.
23
La Interfaz Gráfica
25
Estado de pyMeet
• Desarrollo inicial funcional con la librería wxWidget. • Iniciado el port a pyGTK (casi acabado).
• Videoconferencia sin compresión :-( • No soporte audio
• No envío de ficheros • No multiconferencia
• Soporte completo para conversación interoperable con cualquier otro cliente jabber.
• Multiplataforma salvo por la captura de video ¡¡¡ estado muy inicial !!!