<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1815-5928</journal-id>
<journal-title><![CDATA[Ingeniería Electrónica, Automática y Comunicaciones]]></journal-title>
<abbrev-journal-title><![CDATA[EAC]]></abbrev-journal-title>
<issn>1815-5928</issn>
<publisher>
<publisher-name><![CDATA[Universidad Tecnológica de La Habana José Antonio Echeverría, Cujae]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1815-59282014000300004</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Implementación de los protocolos de comunicación para VoIP: RTP/RTCP, sobre FPGAs de altera]]></article-title>
<article-title xml:lang="en"><![CDATA[Implementation of VoIP Communication Protocols over Altera's FPGAs]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[García Montoya]]></surname>
<given-names><![CDATA[Mario]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[León González]]></surname>
<given-names><![CDATA[Nelia R.]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Marín Contreras]]></surname>
<given-names><![CDATA[Víctor]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Yañez de la Rivera]]></surname>
<given-names><![CDATA[René]]></given-names>
</name>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Empresa Mixta GKT S.A.  ]]></institution>
<addr-line><![CDATA[La Habana ]]></addr-line>
<country>Cuba</country>
</aff>
<aff id="A02">
<institution><![CDATA[,Cujae Centro de Investigaciones en Microelectrónica (CIME) ]]></institution>
<addr-line><![CDATA[La Habana ]]></addr-line>
<country>Cuba</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>12</month>
<year>2014</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>12</month>
<year>2014</year>
</pub-date>
<volume>35</volume>
<numero>3</numero>
<fpage>39</fpage>
<lpage>47</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S1815-59282014000300004&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S1815-59282014000300004&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S1815-59282014000300004&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[Se propone una solución de diseño e implementación de los protocolos RTP/RTCP sobre dispositivos lógicos programables, necesarios para la puesta en marcha de la tecnología Voz sobre IP. El diseño se basa en lenguaje C++ y se recurre a las herramientas: NiosII IDE, Quartus, SOPC Builder, entre otras, del fabricante Altera. Se utiliza el procesador Nios II embebido en un FPGA, con el sistema operativo en tiempo real MicroC/OS-II. La puesta a punto de la propuesta se implementa en la tarjeta «Nios II Development Kit», comprobando los resultados tanto con la consola del Nios II IDE, como con los periféricos del Kit. Finalmente, se prueba la comunicación de dos PC convencionales, en las que se ejecuta la aplicación sobre Windows XP.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[An RTP/RTCP protocol design and implementation solution over programmable logic devices is proposed; those protocols are needed for Voice over IP technology start up. The design is based on C++ language and it employs the Altera tools such as: Nios II IDE, Quartus and SOPC Builder. Nios II embedded processor is used in an FPGA, with the real time operative system MicroC/OS-II. The proposal tuning-up is implemented over the «Nios II Development Kit», which results are checked with the Nios II IDE console and with the Kit peripherals. Finally, the communication between two conventional PCs running the application over Windows XP is tested.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[RTP]]></kwd>
<kwd lng="es"><![CDATA[RTCP]]></kwd>
<kwd lng="es"><![CDATA[Nios II]]></kwd>
<kwd lng="es"><![CDATA[MicroC/OS-II]]></kwd>
<kwd lng="es"><![CDATA[FPGA]]></kwd>
<kwd lng="es"><![CDATA[C++]]></kwd>
<kwd lng="en"><![CDATA[RTP]]></kwd>
<kwd lng="en"><![CDATA[RTCP]]></kwd>
<kwd lng="en"><![CDATA[Nios II]]></kwd>
<kwd lng="en"><![CDATA[MicroC/OS-II]]></kwd>
<kwd lng="en"><![CDATA[FPGA]]></kwd>
<kwd lng="en"><![CDATA[C++]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[   <font size="2" face="verdana">  </font>     <P align="right"><font size="2" face="verdana"><strong>ARTICULO ORIGINAL </strong></font></p>     <p>&nbsp;</p>     <p><font size="4" face="verdana"><B>Implementaci&oacute;n de los protocolos de comunicaci&oacute;n para VoIP:    RTP/RTCP, sobre FPGAs de altera </B></font></p>     <p>&nbsp;</p>     <p><font size="3" face="verdana"><B>Implementation of VoIP Communication Protocols over Altera's FPGAs</B></font></p>     <P>&nbsp;</p>     <P>&nbsp;</p>     <P><font size="2" face="verdana"><strong>Ing. Mario Garc&iacute;a Montoya<SUP>1</SUP>,  Ing. Nelia R. Le&oacute;n    Gonz&aacute;lez<SUP>1</SUP>,  Dr. V&iacute;ctor Mar&iacute;n    Contreras<SUP>1,2</SUP>,  Dr. Ren&eacute; Ya&ntilde;ez de la    Rivera<SUP>1</SUP></strong></font></p>     <P>&nbsp;</p>     ]]></body>
<body><![CDATA[<P><font size="2" face="verdana">1. Empresa Mixta GKT S.A.,</font><font size="2" face="verdana">La Habana, Cuba,  E-mail: <a href="mailto:mayito@gkt.cu">mayito@gkt.cu</a> </font>, <font size="2" face="verdana"><a href="mailto:nelia.rosa@gkt.cu">nelia.rosa@gkt.cu</a></font> , <font size="2" face="verdana"><a href="mailto:yanez@gkt.cu">yanez@gkt.cu</a></font> , <font size="2" face="verdana"><a href="mailto:victor@gkt.cu">victor@gkt.cu</a>    <br>   2. Centro de Investigaciones en Microelectr&oacute;nica  (CIME), Cujae, La Habana, Cuba.</font></p>     <P>&nbsp;</p>     <P>&nbsp;</p> <hr>     <P><font size="2" face="verdana"><B>RESUMEN </B> </font></p>     <P><font size="2" face="verdana">Se propone una soluci&oacute;n de dise&ntilde;o e implementaci&oacute;n de los protocolos RTP/RTCP sobre dispositivos  l&oacute;gicos programables, necesarios para la puesta en marcha de la tecnolog&iacute;a Voz sobre IP. El dise&ntilde;o se basa en lenguaje C++  y se recurre a las herramientas: NiosII IDE, Quartus, SOPC Builder, entre otras, del fabricante Altera. Se utiliza el  procesador Nios II embebido en un FPGA, con el sistema operativo en tiempo real MicroC/OS-II. La puesta a punto de la  propuesta se implementa en la tarjeta &#171;Nios II Development Kit&#187;, comprobando los resultados tanto con la consola del Nios  II IDE, como con los perif&eacute;ricos del Kit. Finalmente, se prueba la comunicaci&oacute;n de dos PC convencionales, en las que  se ejecuta la aplicaci&oacute;n sobre Windows XP. </font></p>     <P><font size="2" face="verdana"><strong>Palabras claves:</strong>   RTP, RTCP, Nios II, MicroC/OS-II, FPGA, C++. </font>    <br> </p> <hr>     <P><font size="2" face="verdana"><B>ABSTRACT</B></font></p>     <P><font size="2" face="verdana">An RTP/RTCP protocol design and implementation solution over programmable logic devices is proposed;  those protocols are needed for Voice over IP technology start up. The design is based on C++ language and it employs  the Altera tools such as: Nios II IDE, Quartus and SOPC Builder. Nios II embedded processor is used in an FPGA,  with the real time operative system MicroC/OS-II. The proposal tuning-up is implemented over the &#171;Nios II  Development Kit&#187;, which results are checked with the Nios II IDE console and with the Kit peripherals. Finally, the  communication between two conventional PCs running the application over Windows XP is tested. </font></p>     ]]></body>
<body><![CDATA[<P><font size="2" face="verdana"><strong>Key words:</strong>   RTP, RTCP, Nios II, MicroC/OS-II, FPGA, C++. </font>    <br> </p> <hr>     <p>&nbsp;</p>     <p>&nbsp;</p>     <p><font size="2"><b><font size="3" face="verdana">INTRODUCCI&Oacute;N</font></b></font></p>     <p>&nbsp;</p>     <P><font size="2" face="verdana">El presente trabajo forma parte del proyecto ramal &#171;Plataforma de Conmutaci&oacute;n de Paquetes&#187; que se lleva a cabo  en el departamento de Investigaci&oacute;n y Desarrollo (I+D) de la empresa Gran Kaiman Teleco (GKT s.a.) apoyado por  el Ministerio de la Inform&aacute;tica y las Comunicaciones (MIC). Dicho proyecto tiene como objetivo fundamental  la implementaci&oacute;n de un <I>Gateway</I> o 04. Implementaci&oacute;n de los protocolos de comunicacion para  VoIP RTPRTCP,  sobre FPGAs de altera.doc(NGN). </font></p>     <P><font size="2" face="verdana">El est&aacute;ndar VoIP utiliza el protocolo UDP <I>(User Datagram Protocol)</I> para la transmisi&oacute;n de voz, pues aunque  no ofrece integridad en los datos, el aprovechamiento del ancho de banda es mayor que con TCP <I>(Transfer Control Protocol)</I>. Por lo que se necesita utilizar el protocolo RTP  <I>(Real-time Transport Protocol)</I>, que maneja los  aspectos relativos a la temporizaci&oacute;n, marcando los paquetes UDP con la informaci&oacute;n necesaria para la correcta entrega  de los mismos en recepci&oacute;n. Paralelamente, se requiere del protocolo de control de RTP (RTCP), que garantiza la  calidad de servicio y porta informaci&oacute;n sobre los participantes de la sesi&oacute;n. [1]  </font></p>     <P><font size="2" face="verdana">Se persigue, adem&aacute;s, la fabricaci&oacute;n de un producto que sea capaz de funcionar con independencia de la  PC, comercializable, que garantice soberan&iacute;a tecnol&oacute;gica. Es por ello que resulta muy factible para implementar el  dise&ntilde;o la utilizaci&oacute;n de dispositivos l&oacute;gicos programables. En este caso, se recurre a la tarjeta  &#171;<I>Nios II Development Kit</I>&#187;, del fabricante Altera. </font></p>     <P><font size="2" face="verdana">Los objetivos de este trabajo son: implementar los protocolos RTP/RTCP, utilizando el FPGA      <I>Cyclone II</I> que proporciona el Kit de desarrollo de Altera, y estandarizar el dise&ntilde;o, de manera que pueda ser compatible con  las plataformas m&aacute;s utilizadas por la comunidad cient&iacute;fica. </font></p>     ]]></body>
<body><![CDATA[<P><font size="2" face="verdana"><B>GENERALIDADES DEL DISE&Ntilde;O</B> </font></p>     <P><font size="2" face="verdana">La realizaci&oacute;n de un <I>Gateway</I>, tiene como prop&oacute;sito la integraci&oacute;n de todas las funcionalidades que se exigen en  un solo equipo. Por lo tanto, para la implementaci&oacute;n del dise&ntilde;o se eligi&oacute; la tarjeta <I>&#171;Nios II Development Kit&#187;,</I> la  cual cuenta con el FPGA EP2C35F672C5N, que contiene 33216 elementos l&oacute;gicos y 483840 bits de memoria <I>&#171;on-chip&#187;</I>, entre otros recursos; que tentativamente puede abarcar el producto final. [2] </font></p>     <P><font size="2" face="verdana">Se utiliz&oacute; para elaborar la aplicaci&oacute;n el lenguaje C++, debido a su compatibilidad con C, lenguaje en el que la  especificaci&oacute;n RTP/RTCP propone algunas implementaciones de algoritmos relacionados con funciones b&aacute;sicas del protocolo  [3]. Este motivo, unido a que C++ es el lenguaje m&aacute;s utilizado para implementar protocolos como &eacute;ste y que adem&aacute;s  existen compiladores para todas las plataformas, conduce a la decisi&oacute;n de su utilizaci&oacute;n. </font></p>     <P><font size="2" face="verdana">El dise&ntilde;o de este programa est&aacute; elaborado sobre la base del paradigma de programaci&oacute;n orientado a objetos  (POO). Esto posibilit&oacute; que durante su realizaci&oacute;n se utilizaran conceptos avanzados de programaci&oacute;n, tales como: el de  objeto, clase, encapsulamiento, polimorfismo y herencia. Vale destacar que estos dan una mayor complejidad al proyecto,  pero brindan a su vez, facilidades asociadas con la optimizaci&oacute;n de los recursos y la disminuci&oacute;n de los tiempos  de modificaci&oacute;n del c&oacute;digo por su nivel de organizaci&oacute;n [9]. Contar con estas potencialidades fue posible gracias a  la utilizaci&oacute;n del compilador para lenguaje C/C++ que acompa&ntilde;a a la plataforma de desarrollo Altera <I>Nios II Integrated Development Enviroment</I> (IDE).  </font></p>     <P><font size="2" face="verdana">Adem&aacute;s, es v&aacute;lido destacar que el fabricante Altera proporciona herramientas de dise&ntilde;o muy amigables, como son:  el <I>Quartus</I> (para los dise&ntilde;os en lenguaje de descripci&oacute;n de hardware y captura esquem&aacute;tica) y el ya mencionado  ambiente de desarrollo integrado (IDE) de Nios II. </font></p>     <P><font size="2" face="verdana">Este &uacute;ltimo, ofrece una s&oacute;lida plataforma  de desarrollo que contiene el sistema operativo MicroC/OS-II, que  proporciona a los dise&ntilde;adores la capacidad de construir r&aacute;pidamente aplicaciones que precisen de procesamiento en tiempo real. [4] </font></p>     <P><font size="2" face="verdana">Es posible tambi&eacute;n, utilizando estas herramientas, la realizaci&oacute;n h&iacute;brida de dise&ntilde;os <I>hardware</I> y <I>software</I>, para luego programarlos directamente en el FPGA. </font></p>     <P><font size="2" face="verdana">MicroC/OS-II, por su parte, constituye un      <I>kernel</I> de sistema operativo completamente portable, escalable,  determinista y multitarea, escrito en ANSI C y que contiene una peque&ntilde;a porci&oacute;n de c&oacute;digo en lenguaje ensamblador, para  adaptarse a diferentes arquitecturas de procesadores. Tiene la posibilidad de manejar hasta 63 tareas y ofrece la opci&oacute;n de uso  de sem&aacute;foros, eventos, exclusi&oacute;n mutua, mensajes, gesti&oacute;n de tareas y gesti&oacute;n de memoria seg&uacute;n se necesite. Con  todas estas condiciones e incluyendo la pila TCP/IP proporcionada dentro del Nios II Development Kit, llamada <I>NicheStack</I>, se pudieron garantizar las condiciones requeridas para el establecimiento de la conexi&oacute;n del sistema elaborado  con cada uno de los destinos a trav&eacute;s de la red <I>Ethernet</I>. [5] </font></p>     <P><font size="2" face="verdana">Se utiliz&oacute; la herramienta <I>SOPC  Builder</I>, que permite conformar el procesador a la medida, especificando la cantidad  de memoria, n&uacute;cleos, y perif&eacute;ricos requeridos. Se utilizaron interfaces paralelas de entrada/salida (PIO), para  realizar pruebas durante la etapa de dise&ntilde;o. Por ejemplo, los LEDs, l&aacute;mparas 7 segmentos y botones [6, 7]. Se  implementaron bloques para acceder a la interfaz de abonados que ser&aacute; conectada mediante hardware, de la cual se adquiere la voz  del abonado local y hacia la que se env&iacute;a la del abonado remoto. [8] </font></p>     <P><font size="2" face="verdana"><B>DESCRIPCION DE LA SOLUCION IMPLEMENTADA</B> </font></p>     ]]></body>
<body><![CDATA[<P><font size="2" face="verdana">El procesamiento de los diferentes canales de multimedia desde su entrada al sistema propuesto, hasta la salida  hacia su destino en forma de flujo &uacute;nico, siguiendo con las normas que imponen los protocolos UDP, IP y Ethernet, puede  ser subdividido en varios procesos (<a href="/img/revistas/eac/v35n3/f0104314.jpg">Figura 1</a>). </font></p>     
<P><font size="2" face="verdana">Algunos de estos procesos son ejecutados por la aplicaci&oacute;n programada utilizando librer&iacute;as de funciones que  se facilitan por Altera y por los creadores del sistema operativo y de <I>NicheStack</I>.[5]   </font></p>     <P><font size="2" face="verdana">Una de las tareas m&aacute;s importantes en el dise&ntilde;o consiste en el procesamiento desde la entrada de la informaci&oacute;n  de audio, sometida previamente a alg&uacute;n algoritmo de compresi&oacute;n de datos (como G729, G711 o LPC), hasta la  obtenci&oacute;n de un paquete RTP/RTCP. Para ello en el programa se utiliza una jerarqu&iacute;a de clases obtenidas de diversas fuentes  que, como parte del trabajo, fue necesario adaptarlas a la plataforma Nios II, para posibilitar la validaci&oacute;n y  procesamiento de los datos obtenidos, culminando sus funciones con la entrega de un paquete de carga &uacute;til con su  respectivo encabezado, seg&uacute;n lo que establece la RFC 3550 para el transporte de se&ntilde;ales en tiempo real.[3] </font></p>     <P><font size="2" face="verdana">La segunda tarea de mayor peso, ocurre desde la formaci&oacute;n del paquete UDP a partir de RTP/RTCP como carga  &uacute;til, hasta la obtenci&oacute;n de un paquete IP que pueda ser enviado al destino mediante una red <I>Ethernet</I> <a href="#f2">(Figura 2)</a>[10]. Esta labor se realiza con la vinculaci&oacute;n al programa de funciones del sistema operativo en tiempo real y otras proporcionadas  por la jerarqu&iacute;a antes mencionada, para agilizar el trabajo con la pila TCP/IP y hacer posible la conexi&oacute;n f&iacute;sica del  sistema a la red. </font></p>     <P align="center"><img src="/img/revistas/eac/v35n3/f0204314.jpg" width="407" height="282"><a name="f2" id="f2"></a></p>                                                     
<P>&nbsp;</p>     <P><font size="2"><b><font face="verdana">FORMACI&Oacute;N DEL PAQUETE RTP/RTCP</font></b></font></p>     <P><font size="2" face="verdana">Los protocolos RTP/RTCP, seg&uacute;n propone la variante m&aacute;s actual de sus est&aacute;ndares, permite la transmisi&oacute;n de  datos multimedia con caracter&iacute;sticas de tiempo real. Es por ello que necesita para su puesta a punto de un conjunto  de operaciones din&aacute;micas que requieren de recursos espec&iacute;ficos, tanto del sistema operativo como del procesador. </font></p>     <P><font size="2" face="verdana">Analizando el encabezado establecido para RTP se puede tener una idea general de algunas de estas operaciones  que son implementadas en el programa propuesto. Dicho encabezado est&aacute; compuesto por tres palabras de 32 bits y  seg&uacute;n corresponda, algunas extensiones formadas igualmente por 4 octetos (<a href="#f3">Figura 3</a>). </font></p>     <P align="center"><img src="/img/revistas/eac/v35n3/f0304314.jpg" width="392" height="208"><a name="f3"></a></p>     
]]></body>
<body><![CDATA[<P><font size="2" face="verdana">En la <a href="#f3">Figura 3</a> el campo V (Version) de dos bits, indica la versi&oacute;n del protocolo RTP que se usa, la &uacute;ltima definida en  la RFC3550 es la n&uacute;mero dos. El bit P  (<I>Padding</I>) indica si hay relleno o no en el paquete. El bit X (Extensi&oacute;n) muestra  si existe luego de la cabecera del paquete, una extensi&oacute;n de cabecera. Los cuatro bits que se representan como  CC (Contadores de contribuyentes) muestran la cantidad de campos que presenta el paquete como identificadores  de fuente de contribuyente.  </font></p>     <P><font size="2" face="verdana">El bit M (<I>Marker</I>) es un marcador que se utiliza para prop&oacute;sitos muy variados y que puede tener  usos definidos por el programador. Por &uacute;ltimo el campo PT  (<I>Payload Type</I>) o tipo de carga &uacute;til  es  un n&uacute;mero de siete bits que se utiliza para determinar el formato de la carga &uacute;til del paquete  RTP. Entre estos formatos se encuentran la clasificaci&oacute;n de audio y de video. </font></p>     <P><font size="2" face="verdana">El resto de los campos resaltan sobre los anteriormente mencionados, si tenemos en cuenta  el consumo de recursos de procesamiento utilizado en su obtenci&oacute;n. Por este motivo se explican  a continuaci&oacute;n con un mayor detalle: </font></p>     <P><font size="2" face="verdana">&#183;     N&uacute;mero de Secuencia: Contador de 16 bits que es incrementado con cada env&iacute;o de un paquete RTP.  Este n&uacute;mero de secuencia es utilizado para permitirle al receptor de un flujo RTP detectar paquetes perdidos o que  no lleguen en orden. El valor inicial de cada secuencia debe ser un n&uacute;mero aleatorio impredecible y de esto  depende en alto grado la seguridad en la transmisi&oacute;n de los datos. </font></p>     <P><font size="2" face="verdana">&#183;     Marca de tiempo RTP: Valor de 32 bits que refleja el instante de tiempo en que fue muestreado el primer  octeto del paquete RTP. La generaci&oacute;n de este valor debe ser garantizado por un reloj que lo incremente de manera  lineal. Este campo permite al receptor reproducir las muestras en los intervalos de tiempo apropiados y posibilita  que diferentes flujos de datos de multimedia puedan ser sincronizados. Tambi&eacute;n hace posible el c&aacute;lculo de  par&aacute;metros asociados con la calidad de servicio. El primer valor de la marca de tiempo de un flujo de datos de RTP debe  ser generado tambi&eacute;n de forma aleatoria al igual que en el caso de los n&uacute;meros de secuencia. </font></p>     <P><font size="2" face="verdana">&#183;     El identificador de fuente de sincronizaci&oacute;n es un campo de 32 bits que identifica de manera &uacute;nica la fuente  de un flujo RTP. Es diferente de la direcci&oacute;n IP o del n&uacute;mero de puerto, que permite, por ejemplo, que un nodo  con m&uacute;ltiples fuentes distinga cada una de ellas. Este identificador debe ser seleccionado aleatoriamente, con  el objetivo de que dos fuentes de sincronizaci&oacute;n dentro de la misma sesi&oacute;n RTP no tengan el mismo  SSRC (<I>Synchronization Source Identifier</I>). Aunque la probabilidad de que se repita el SSRC es muy baja, la  implementaci&oacute;n debe estar preparada para detectar y solucionar colisiones. </font></p>     <P><font size="2" face="verdana">Por su parte, el protocolo de control del transporte en tiempo real (RTCP) tiene como funci&oacute;n principal proporcionar  la calidad de la distribuci&oacute;n de los datos lograda por RTP, as&iacute; como el control de flujo y congesti&oacute;n de la red.  Permite supervisar la calidad de una sesi&oacute;n de llamada siguiendo la p&eacute;rdida de paquetes, latencia (retraso) y otras  preocupaciones claves de VoIP. Las especificaciones recomiendan que la fracci&oacute;n del ancho de banda de la sesi&oacute;n asignada a RTCP  se fije en un cinco por ciento del tr&aacute;fico de RTP, lo cual garantiza el dise&ntilde;o. </font></p>     <P><font size="2" face="verdana">Existen diferentes tipos de paquetes RTCP para garantizar la variedad en el control de la informaci&oacute;n, estos son:  RR (Reporte del Receptor), SR (Reporte del Emisor), SDES (Descripci&oacute;n de la Fuente), APP (funciones espec&iacute;ficas de  la aplicaci&oacute;n) y BYE (fin de la participaci&oacute;n). </font></p>     <P><font size="2" face="verdana">M&uacute;ltiples paquetes RTCP, de diferentes tipos, se concatenan en uno solo (compuesto) que se env&iacute;a en un  paquete acorde al protocolo de nivel m&aacute;s bajo (UDP). Se podr&iacute;an analizar los campos de mayor complejidad de algunos tipos  de encabezado RTCP: </font></p>     <P><font size="2" face="verdana">&#183;     Jitter entre arribos: Estimado de la varianza estad&iacute;stica del tiempo entre arribos de paquetes RTP,  medidos en unidades de marca de tiempo y expresados como un entero sin signo de 32 bits. Permite conocer  la variaci&oacute;n del retardo que existe entre la llegada de los paquetes y la duraci&oacute;n de los mismos. La  variaci&oacute;n de este valor es un &iacute;ndice de la calidad del servicio con que se est&aacute; estableciendo la comunicaci&oacute;n. </font></p>     ]]></body>
<body><![CDATA[<P><font size="2" face="verdana">&#183;     Fracci&oacute;n de paquetes perdidos: Fracci&oacute;n de paquetes de datos RTP perdidos, de una  determinada fuente, desde que fue enviado el paquete RR o SR previo. Se expresa como n&uacute;mero real y se define por  el n&uacute;mero de paquetes perdidos dividido por el n&uacute;mero de paquetes esperados. Si la p&eacute;rdida es  negativa debido a duplicados, la fracci&oacute;n toma valor cero. [3] </font></p>     <P><font size="2" face="verdana">Cada una de estas operaciones se lleva a cabo por m&eacute;todos independientes asociados a diferentes instancias  de clases, que pueden ser reutilizados seg&uacute;n se necesite. </font></p>     <P><font size="2" face="verdana">Se tiene, por ejemplo, que la clase encargada de la generaci&oacute;n de los n&uacute;meros aleatorios facilita un conjunto  de m&eacute;todos, los cuales, acorde a la plataforma en la que est&eacute; corriendo la aplicaci&oacute;n, garantiza la obtenci&oacute;n de una  semilla v&aacute;lida y por ende de una generaci&oacute;n completamente ca&oacute;tica de n&uacute;meros de 16 y 32 bits. </font></p>     <P><font size="2" face="verdana">Por otra parte, tal y como se vio en algunos de los campos asociados a las cabeceras de RTP y RTCP, es  imprescindible que exista una estricta atenci&oacute;n a las variables de temporizaci&oacute;n. De su procesamiento depende, justamente, la  efectividad de transmisi&oacute;n de datos en tiempo real. Por este motivo, existe en la aplicaci&oacute;n una clase que implementa el  protocolo NTP (<I>Network Time Protocol</I>) y otras que permiten la atenci&oacute;n a las variables de tiempo y la conversi&oacute;n  entre diferentes formatos que describen este tipo de variables. Dichas clases se obtuvieron a partir de la modificaci&oacute;n  de  otras con funciones similares que han sido desarrolladas por la comunidad de software libre y que fue  necesario transformarlas teniendo en cuenta las particularidades de la plataforma donde se ejecuta la aplicaci&oacute;n. </font></p>     <P><font size="2" face="verdana">El proceso m&aacute;s importante dentro de la implementaci&oacute;n de RTP/RTCP es la conformaci&oacute;n de los paquetes en s&iacute;.  Esta funcionalidad se hace posible por la colaboraci&oacute;n de las clases que manejan los contenedores de memoria y las  clases conformadoras de los paquetes. </font></p>     <P><font size="2" face="verdana">Los contenedores de memoria son creados y procesados por una clase espec&iacute;fica. La misma permite que cada uno  de los objetos instanciados se almacene de manera consistente en espacios de memoria hasta tanto dejen de ser  necesarios. De esta forma, cada uno de los par&aacute;metros a utilizar en la creaci&oacute;n de los paquetes forma parte independiente de  un objeto almacenado y, una vez que se complete el proceso de elaboraci&oacute;n de la informaci&oacute;n, se crea en memoria  una instancia del objeto paquete RTP/RTCP y se llena cada uno de sus campos partiendo de los objetos  previamente almacenados, los cuales posteriormente se destruyen. </font></p>     <P><font size="2" face="verdana">Cada una de estas operaciones de asignaci&oacute;n y liberaci&oacute;n de espacios de memoria se realiza de manera din&aacute;mica  por una clase cuyo objetivo fundamental es la gesti&oacute;n de los mismos. Dicha clase se concibi&oacute; de manera diferenciada  para adaptarla a cada una de las plataformas que puedan soportar a la aplicaci&oacute;n. Esta gesti&oacute;n se ha realizado de  manera eficiente para evitar la incorrecta utilizaci&oacute;n de las limitadas capacidades de memoria, que puedan aparecer en  los entornos donde deber&aacute; correr el programa. </font></p>     <P><font size="2" face="verdana">Una vez terminado el procesamiento de la carga &uacute;til y del resto de los par&aacute;metros que deben ser agregados a  la cabecera, se conforma el paquete RTP/RTCP. Por &uacute;ltimo, se realiza un an&aacute;lisis del mismo para determinar otros  valores a insertar como miembros de esa estructura y que dependen de la conformaci&oacute;n espec&iacute;fica. Con esto entonces ya  se obtiene un resultado de acuerdo al est&aacute;ndar que pasar&aacute; a ser completado con los requerimientos que imponen   los protocolos de m&aacute;s bajo nivel. </font></p>     <P><font size="2" face="verdana">Este proceso descrito en el sentido que tiene como dato de entrada, el audio proveniente de la interfaz de abonados  y como salida la interfaz a la red IP, funciona de manera an&aacute;loga en la direcci&oacute;n inversa, gracias a que dichas  opciones fueron concebidas en cada una de las clases antes mencionadas. </font></p>     <P><font size="2" face="verdana"><B>FORMACI&Oacute;N DEL PAQUETE <I>ETHERNET</I> Y CONEXI&Oacute;N A LA RED</B> </font></p>     ]]></body>
<body><![CDATA[<P><font size="2" face="verdana">La &uacute;ltima fase a ejecutar por la aplicaci&oacute;n se encarga de conformar con el paquete RTP/RTCP obtenido, un bloque  de informaci&oacute;n que pueda ser enviado a trav&eacute;s de la red <I>Ethernet</I> hacia su destino, cumpliendo adem&aacute;s con los  protocolos UDP e IP. Para ello, primeramente, se instancia una clase cuya funci&oacute;n es construir la estructura de cada uno de  los encabezados que se van a agregar. Esta misma clase controla, adem&aacute;s, otros par&aacute;metros que deben ser tenidos  en cuenta para establecer la conexi&oacute;n y que se agregan en la estructura antes mencionada. </font></p>     <P><font size="2" face="verdana">Paralelamente existe una segunda clase cuya funci&oacute;n principal es garantizar que se establezca una conexi&oacute;n f&iacute;sica  entre los terminales fuente y destino y adem&aacute;s que se establezca un canal de comunicaci&oacute;n entre dos puertos  pertenecientes a cada uno de estos terminales, cuya identificaci&oacute;n estar&aacute; dada por una direcci&oacute;n IP. Esta clase est&aacute;  desarrollada, teniendo en cuenta el uso de las librer&iacute;as de funciones para establecer comunicaci&oacute;n entre terminales que  pertenecen a una red, brindadas por el sistema operativo y que son conocidas como BSD <I>socket</I> API (<I>Berkeley Sockets Application Programming  Interface</I>). </font></p>     <P><font size="2" face="verdana">Entre las modificaciones realizadas vale destacar que fue agregado en las clases el soporte a aquellas conexiones  que sean establecidas por los est&aacute;ndares IPV4 e IPV6. De forma tal que garantice la compatibilidad de la aplicaci&oacute;n  en actuales y futuras implementaciones. </font></p>     <P><font size="2" face="verdana">Otro de los recursos que se utilizan del      <I>NicheStack</I> y que influyen en el establecimiento directo de la conexi&oacute;n  f&iacute;sica, consiste en la posibilidad de que la aplicaci&oacute;n adquiera su direcci&oacute;n IP a partir de un servidor DHCP  (<I>Dynamic Host Configuration Protocol</I>) o en su defecto, que defina una direcci&oacute;n est&aacute;tica. </font></p>     <P><font size="2" face="verdana">Todas estas funcionalidades posibilitan la interacci&oacute;n entre el dise&ntilde;o y la red existente, lo que hace posible que el  flujo de datos transite por los diversos canales de comunicaci&oacute;n y permita el establecimiento de la llamada con una  calidad de servicio aceptable. </font></p>     <P>&nbsp;</p>     <P><font size="3" face="verdana"><B>RESULTADOS Y DISCUSI&Oacute;N</B> </font></p>     <P>&nbsp;</p>     <P><font size="2" face="verdana">Se utiliz&oacute; el FPGA EP2C35F672C5N presente en el <I>NIOS II Development Kit, Cyclone II Edition</I>, de Altera,    emple&aacute;ndose un 37% de los recursos disponibles, de forma que existe virtualmente una reserva de espacio para otros bloques    del <I>Gateway</I>, superior a la mitad del dispositivo.  </font></p>     <P><font size="2" face="verdana">Para comprobar el funcionamiento del dise&ntilde;o, se llevaron a cabo una serie de pruebas. Las primeras se realizaron  con la consola del <I>Nios II IDE</I>, partiendo de paquetes tanto RTP como RTCP cuyos campos fueron  confeccionados manualmente. Los mismos fueron procesados por las clases de validaci&oacute;n de las estructuras correspondientes, y  luego se mostraron los campos identificados, de manera independiente, en la consola de la herramienta (<a href="/img/revistas/eac/v35n3/f0404314.jpg">Figura 4</a>).  </font></p>     
]]></body>
<body><![CDATA[<P><font size="2" face="verdana">De esta misma forma, se probaron dis&iacute;miles paquetes con errores (elementos no permitidos por el est&aacute;ndar).  Por ejemplo: con el campo de longitud mayor o menor que la cantidad de <I>bytes</I> que posee, con un n&uacute;mero de octetos  que no es m&uacute;ltiplo de cuatro, con bits de relleno  (<I>Padding</I>) (activando el bit que lo indica y sin activarlo, colocando en  el &uacute;ltimo octeto un n&uacute;mero diferente de la cantidad que deben ser ignorados), con una versi&oacute;n diferente de dos, y otros. </font></p>     <P><font size="2" face="verdana">En el caso de RTCP, se tuvieron en cuenta casos como: un paquete compuesto cuyo primer tipo difiere de RR o SR,  un paquete RR con el contador de reportes menor o mayor que la cantidad que porta, un paquete BYE con el contador  de SSRC diferente del n&uacute;mero real que presenta el mismo, un paquete SDES  (<I>Source Description Message</I>) sin el  indicador de fin de la lista, entre otros. [3] </font></p>     <P><font size="2" face="verdana">Adem&aacute;s se sometieron a prueba del dise&ntilde;o, paquetes reales, provenientes de capturas en la red, realizadas con  la herramienta <I>WireShark</I>. </font></p>     <P><font size="2" face="verdana">En todos los casos anteriores se comprob&oacute; la eficacia del programa, el cual responde correctamente ante casos que  no cumplen con lo establecido en el est&aacute;ndar y procesa adecuadamente los que s&iacute; est&aacute;n acorde con lo planteado en  la RFC3550. </font></p>     <P><font size="2" face="verdana">En una segunda etapa de pruebas, se analiz&oacute; la interacci&oacute;n con los perif&eacute;ricos del <I>Kit</I> de desarrollo, comenzando con los LEDs, l&aacute;mparas 7 segmentos y otros, como forma de indicar si la recepci&oacute;n de paquetes fue correcta, y qu&eacute; tipo  de error se encontr&oacute;. </font></p>     <P><font size="2" face="verdana">Por otra parte, se tuvo en cuenta c&oacute;mo establecer la comunicaci&oacute;n con la interfaz de abonados que suministra los  flujos de audio ya codificados. Esto se har&aacute; posible mediante  un conector  f&iacute;sico que tiene el <I>Kit</I> de desarrollo y que posibilita el acceso al dispositivo  <I>Cyclone</I> II y a la tarjeta en s&iacute;. </font></p>     <P><font size="2" face="verdana">Unido a esto, y con el objetivo de comprobar cada uno de los m&oacute;dulos de programa que se elaboraron, as&iacute; como  la interacci&oacute;n entre las clases dise&ntilde;adas, se prob&oacute; una transmisi&oacute;n de un flujo RTP entre dos terminales. Estos  estaban interconectados por un elemento activo de la red. Luego se compil&oacute; la aplicaci&oacute;n  en cada una de estas PC  que utilizaban Windows XP como sistema operativo y se estableci&oacute; una comunicaci&oacute;n utilizando dicho protocolo. </font></p>     <P><font size="2" face="verdana">Dicha aplicaci&oacute;n adem&aacute;s recib&iacute;a como par&aacute;metros de entrada la IP asignada para el origen y el destino y los puertos  a utilizar. Una vez establecida la conexi&oacute;n se mostraban los paquetes intercambiados. En todo momento se mantuvo  una supervisi&oacute;n del canal utilizando <I>WireShark</I>, donde fue posible observar a fondo los paquetes de las distintas capas  de la red que intervienen y su correcto manejo y conformaci&oacute;n. </font></p>     <P>&nbsp;</p>     <P><font size="3" face="verdana"><B>CONCLUSIONES</B> </font></p>     ]]></body>
<body><![CDATA[<P>&nbsp;</p>     <P><font size="2" face="verdana">Se obtuvo una implementaci&oacute;n de los protocolos RTP y RTCP siguiendo estrictamente con el est&aacute;ndar m&aacute;s actual    (RFC 3550). Se utiliz&oacute; el 37% de los recursos de un FPGA EP2C35F672C5N de la familia <I>Cyclone</I> II de Altera.  </font></p>     <P><font size="2" face="verdana">El hecho de trabajar con un esquema reconfigurable permite adaptar el dise&ntilde;o o incluirlo como parte de otro  sistema m&aacute;s general, en este caso, para conformar un <I>Gateway</I> de acceso de VoIP.  </font></p>     <P><font size="2" face="verdana">Se logr&oacute; portabilidad en el trabajo, al hacerlo compatible con varios sistemas operativos y plataformas de desarrollo. </font></p>     <P><font size="2" face="verdana">La utilizaci&oacute;n de las herramientas de Altera, conjuntamente con el lenguaje de alto nivel C++, proporcion&oacute; agilidad  y eficiencia en la etapa de dise&ntilde;o. </font></p>     <P><font size="2" face="verdana">Se comprob&oacute; la veracidad del dise&ntilde;o utilizando herramientas <I>software</I> y comunicaci&oacute;n en tiempo real. </font></p>     <P>&nbsp;</p>     <P><strong><font size="3" face="verdana">REFERENCIAS</font></strong></p>     <P>&nbsp;</p>     <!-- ref --><P><font size="2" face="verdana">1.   BLACK, U.: Voice over IP.  Prentice Hall PTR, New  Jersey  USA, 1999.     </font></p>     <P><font size="2" face="verdana">2.  ALTERA CORPORATION.: Nios Development Board. Cyclone II Edition Reference    Manual. (En l&iacute;nea). Disponible en <U><FONT  COLOR="#0000ff"><a href="http://www.altera.com">http://www.altera.com</a></FONT></U>  (Mayo, 2007).   </font></p>     <P><font size="2" face="verdana">3.  SCHULZRINNE H. NETWORK WORKING    GROUP.: RTP: A Transport Protocol for Real-Time      Applications. (En l&iacute;nea). Disponible en <U><FONT  COLOR="#0000ff"><a href="http://tools.ietf.org/pdf">http://tools.ietf.org/pdf</a></FONT></U>   (Julio, 2003)   </font></p>     <P><font size="2" face="verdana">4.   ALTERA CORPORATION.: Using MicroC/OS-II RTOS with the Nios II Processor Tutorial.(En l&iacute;nea). Disponible en <U><FONT COLOR="#0000ff"><a href="http://www.altera.com">http://www.altera.com</a></FONT></U>   (2007) </font></p>     <P><font size="2" face="verdana">5.    LABROSSE,  J. J.:  MicroC/OS-II. The Real Time  Kernel,  2da edici&oacute;n, CMP Books, San  Francisco, California, 2002. </font></p>     <P><font size="2" face="verdana">6. ALTERA CORPORATION.: Nios II Development Kit. Getting Started User Guide.(En l&iacute;nea). Disponible en: <U><FONT  COLOR="#0000ff"><a href="http://www.altera.com">http://www.altera.com</a></FONT></U>  (2007) </font></p>     <P><font size="2" face="verdana">7.  ALTERA CORPORATION.: Embedded Peripherals IP. User Guide.[En l&iacute;nea]. Disponible en <U><FONT  COLOR="#0000ff"><a href="http://www.altera.com">http://www.altera.com</a></FONT></U> (2010). </font></p>     <P><font size="2" face="verdana">8.  MARIN, V., YA&Ntilde;EZ, R.: &#171;Interfaz Digital de Abonados&#187; en Revista Ingenier&iacute;a El&eacute;ctrica Autom&aacute;tica  y Comunicaciones. (En l&iacute;nea). Vol. XXVII No. 1. Disponible en: <U><FONT  COLOR="#0000ff"><a href="www.cujae.edu.cu/ediciones/RElectronica.asp">www.cujae.edu.cu/ediciones/RElectronica.asp</a></FONT></U>   (2007) </font></p>     <!-- ref --><P><font size="2" face="verdana">9.  DEITEL, H. M. , DEITEL, P. J.: Como Programar en C/C++,2da edicion, Editorial Prentice Hall. ISBN:  0-13-226119-7, Julio de 1998.    &#160; </font></p>     ]]></body>
<body><![CDATA[<!-- ref --><P><font size="2" face="verdana">10.  TANENBAUM, A. S.: Computer   Networks. Ep&iacute;grafe 6.4.3.  4<SUP>ta</SUP> Edici&oacute;n. Prentice Hall. USA (2004).     </font></p>     <P>&nbsp;</p>     <P>&nbsp;</p>     <P><font size="2" face="verdana">Recibido: Julio 2014     <br> Aprobado: Septiembre 2014 </font></p>      ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BLACK]]></surname>
<given-names><![CDATA[U.]]></given-names>
</name>
</person-group>
<source><![CDATA[Voice over IP]]></source>
<year>1999</year>
<publisher-loc><![CDATA[New Jersey ]]></publisher-loc>
<publisher-name><![CDATA[Prentice Hall PTR]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BLACK]]></surname>
<given-names><![CDATA[U.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[Nios Development Board]]></source>
<year></year>
<edition>II</edition>
</nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BLACK]]></surname>
<given-names><![CDATA[U.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[RTP: A Transport Protocol for Real-Time Applications.]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BLACK]]></surname>
<given-names><![CDATA[U.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[Using MicroC/OS-II RTOS with the Nios II Processor Tutorial]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LABROSSE]]></surname>
<given-names><![CDATA[J. J.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[MicroC/OS-II]]></article-title>
<source><![CDATA[The Real Time Kernel]]></source>
<year>2002</year>
<edition>2da</edition>
<publisher-loc><![CDATA[San Francisco^eCalifornia California]]></publisher-loc>
<publisher-name><![CDATA[CMP Books]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LABROSSE]]></surname>
<given-names><![CDATA[J. J.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[Nios II Development Kit. Getting Started User Guide]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B7">
<label>7</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LABROSSE]]></surname>
<given-names><![CDATA[J. J.]]></given-names>
</name>
</person-group>
<person-group person-group-type="editor">
<name>
</name>
</person-group>
<source><![CDATA[Embedded Peripherals IP. User Guide.]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B8">
<label>8</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MARIN]]></surname>
<given-names><![CDATA[V.]]></given-names>
</name>
<name>
<surname><![CDATA[YAÑEZ]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<article-title xml:lang="es"><![CDATA[Interfaz Digital de Abonados]]></article-title>
<source><![CDATA[Revista Ingeniería Eléctrica Automática y Comunicaciones]]></source>
<year></year>
<volume>XXVII</volume>
</nlm-citation>
</ref>
<ref id="B9">
<label>9</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[DEITEL]]></surname>
<given-names><![CDATA[H. M.]]></given-names>
</name>
<name>
<surname><![CDATA[DEITEL]]></surname>
<given-names><![CDATA[P. J.]]></given-names>
</name>
</person-group>
<source><![CDATA[Como Programar en C/C++]]></source>
<year>Juli</year>
<month>o </month>
<day>de</day>
<edition>2da</edition>
<publisher-name><![CDATA[Prentice Hall]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B10">
<label>10</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[TANENBAUM]]></surname>
<given-names><![CDATA[A. S.]]></given-names>
</name>
</person-group>
<source><![CDATA[Computer Networks]]></source>
<year>2004</year>
<edition>4ta</edition>
<publisher-name><![CDATA[Prentice Hall]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
