Proyecto Fin de Carrera - GSyC
Transcripción
Proyecto Fin de Carrera - GSyC
u Universidad Rey Juan Carlos Escuela Técnica Superior de Ingeniería de Telecomunicación Ingeniería de Telecomunicación Licenciatura en Administración y Dirección de Empresas Proyecto Fin de Carrera Implementación de Frame Slotted Aloha para un sistema experimental de RFID Autor: Jesús Pérez Comendador Tutor: Dr. Christoph Ruland Cotutor: Dr. Carlos Figuera Pozuelo Curso Académico 2012/2013 Proyecto Fin de Carrera Implementación de Frame Slotted Aloha para un sistema experimental de RFID Autor Jesús Pérez Comendador Tutor Dr. Christoph Ruland Cotutor Dr. Carlos Figuera Pozuelo La defensa del presente Proyecto Fin de Carrera se realizó el día 11 de enero de 2013, siendo evaluada por el siguiente tribunal: Presidente: Vocal: Secretario: y habiendo obtenido la siguiente Calificación: Fuenlabrada, a 11 de enero de 2013 A mis padres, que pudieron y quisieron darme el privilegio de estudiar esta carrera, y a Carina por estar siempre a mi lado, apoyándome además en los momentos difíciles durante el proyecto. Agradecimientos Sin duda es una de las páginas más difíciles de esta memoria. En el campo académico quiero agradecer profundamente a mi tutor, Christoph Ruland, a mi cotutor, Carlos Figuera, y a Andreas Schantin. A mi tutor por hacer posible disfrutar de una estancia de prácticas en Alemania, aprendiendo no sólo el idioma, aspecto no menos importante hoy en día, sino también el funcionamiento del país. A mi cotutor por la gran labor de apoyo y corrección que ha desarrollado para que esta memoria saliera adelante, además de por ser uno de los mejores profesores que he tenido a lo largo de mis estudios, desde que empecé a trabajar con él en el proyecto Wireless4x4. A Andreas por prestarme la ayuda necesaria durante mi estancia para poder avanzar. Ha sido un gran placer trabajar con él. También a la Universidad Rey Juan Carlos, por haberme ofrecido estudiar esta doble titulación que facilitará mi futura carrera profesional. Además, por haber hecho posible las dos estancias de intercambio realizadas, una en Suecia y otra la que ha servido para elaborar este PFC en Alemania, que han conseguido enriquecerme como persona y proporcionarme diferentes enfoques sobre los que se pueden ver las cosas. En otro plano quiero agradecer, por los grandes momentos en clase y fuera de ella, a mis compañeros de carrera y amigos Mario, Mochilo, Ibra, Pacheco, María, Cristina, Carolina, Fran y, en especial, a Bea, porque estos años nos han convertido en buenos amigos y, con nuestros más y nuestros menos hemos estado juntos desde los primeros meses de la carrera. Por último y no por ello menos importante a mi padre, por haberme enseñado a dar siempre lo mejor de mí; a mi madre por saber siempre poner calma en los momentos difíciles; a mis hermanos Gonzalo y Alicia por obligarme a ir a la biblioteca a estudiar; a Carina por ser una parte muy importante de mi vida; a mis amigos (Adri, Manu, Isra, Jote, Hermo y Yepes) y a mis amigos Erasmus (Coré, Javi, Virgilio y Mikel) porque sin todos ellos no sería como soy ahora. A todos vosotros, gracias. Contenido Índice de figuras xi Índice de tablas xiii Resumen xv Abreviaciones 1. Introducción 1.1. Contexto y justificación . 1.2. Descripción del problema . 1.3. Objetivos . . . . . . . . . 1.4. Estructura de la memoria xvii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Materiales y Métodos 2.1. RFID . . . . . . . . . . . . . . . . . . . . 2.1.1. Introducción. . . . . . . . . . . . . 2.1.2. Control de acceso al medio (MAC) 2.1.3. El Protocolo EPC . . . . . . . . . . 2.2. El lenguaje de programación Python . . . 2.2.1. Utilidad para el proyecto. . . . . . 2.3. GNU Radio . . . . . . . . . . . . . . . . . 2.3.1. Qué es GNU Radio . . . . . . . . . 2.3.2. Los bloques de procesado de señal . 2.3.3. Grafos de flujo . . . . . . . . . . . 2.3.4. GNU Radio Companion . . . . . . 2.3.5. GrExtras . . . . . . . . . . . . . . 2.4. NumPy . . . . . . . . . . . . . . . . . . . 2.4.1. El array en NumPy . . . . . . . . . 2.4.2. Funciones en NumPy . . . . . . . . 2.4.3. Utilidad para el proyecto . . . . . . 2.5. El entorno de desarollo Eclipse . . . . . . . 2.6. Metodología . . . . . . . . . . . . . . . . . ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 3 3 . . . . . . . . . . . . . . . . . . 5 5 5 10 13 26 27 28 28 29 30 30 31 33 34 34 34 35 35 x / CONTENIDO Proyecto Fin de Carrera 3. Resultados 3.1. Proceso de implementación del sistema . . . . . . . . . . 3.1.1. Características del sistema . . . . . . . . . . . . . 3.1.2. Máquina de estados de la etiqueta . . . . . . . . . 3.1.3. Máquina de estados del lector . . . . . . . . . . . 3.1.4. Modelo inicial de clases del sistema . . . . . . . . 3.1.5. Implementación de la clase Tag . . . . . . . . . . 3.1.6. Primera versión . . . . . . . . . . . . . . . . . . . 3.1.7. Implementación de la clase Reader . . . . . . . . 3.1.8. Conexión de etiqueta y lector . . . . . . . . . . . 3.1.9. Versión final . . . . . . . . . . . . . . . . . . . . . 3.2. Modelo de clases del sistema final . . . . . . . . . . . . . 3.3. Características del código Python implementado . . . . . 3.4. Pruebas realizadas . . . . . . . . . . . . . . . . . . . . . 3.4.1. Primer estudio. Influencia del número de etiquetas 3.4.2. Segundo estudio. Influencia de Q . . . . . . . . . 4. Conclusiones 4.1. Logros . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Posibles mejoras . . . . . . . . . . . . . . . . . . . 4.2.1. Despliegue en entorno real . . . . . . . . . 4.2.2. Implementación de la operación de acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 39 39 40 43 46 46 49 52 54 57 62 62 64 65 66 . . . . 71 71 73 73 73 Apéndices A. Descripción de los atributos y métodos de las clases construidas 77 Bibliografía 84 Índice de figuras 2.1. Backscattering en etiquetas pasivas. . . . . . . . . . . . . . . . . . 2.2. Máquina de estados de las etiquetas EPC. . . . . . . . . . . . . . 2.3. Ejemplo de algoritmo para escoger Q. . . . . . . . . . . . . . . . . 16 18 25 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 41 44 47 60 63 67 69 Máquina de estados de la etiqueta a implementar. . . Diagrama de estados UML del lector a implementar. Diagrama inicial de clases UML del sistema. . . . . . Grafo de conexión de los bloques. . . . . . . . . . . . Diagrama de clases UML final. . . . . . . . . . . . . . Número de tramas frente a N para Q fijo. . . . . . . . Número de slots frente a Q para N fijo. . . . . . . . . xi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Índice de tablas 2.1. Comandos genéricos Slotted ALOHA . . . . . . . . . . . . . . . . 2.2. Acciones tras un Select . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Selección de Q para lectores con Q fija . . . . . . . . . . . . . . . 13 20 26 3.1. 3.2. 3.3. 3.4. 66 66 68 68 Resultados Resultados Resultados Resultados para para para para el el el el primer estudio con Q=4 . . primer estudio con Q=5 . . segundo estudio con N=10 segundo estudio con N=45 xiii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resumen En el transcurso de la investigación en el campo de los sistemas RFID de largo alcance (UHF) en la Universidad de Siegen (Alemania), se ha desarrollado un sistema experimental de RFID que debe permitir evaluar una serie de mejoras en los estándares RFID actuales (ISO 18000-6, EPC). El sistema, basado en una radio definida por software (SDR), puede emular la funcionalidad del lector y de las etiquetas. Está construido sobre el entorno de procesado digital de señal GNU Radio y se utiliza en combinación con hardware de propósito general. El protocolo EPC Class-1 Generation-2 (comúnmente llamado estándar EPC) es un estándar reconocido por el ISO 18000-6C. En él se definen los requisitos, tanto físicos como lógicos, de un sistema RFID que opera en la banda UHF. Mientras que el estándar incluye una gran variedad de procedimientos para la comunicación entre lector y etiquetas, la mayor atención se centra sobre la correcta implementación del esquema de acceso al medio Frame Slotted ALOHA (FSA), utilizado por parte del lector durante el inventariado de las etiquetas para seleccionar una de ellas dentro de una población de tamaño desconocido. Este Proyecto Fin de Carrera se enmarca dentro del sistema anteriormente descrito y tiene como objetivo la implementación de los procedimientos recogidos en el estándar EPC que reflejan el funcionamiento de FSA, tanto para el lector RFID como para las etiquetas, y la integración de la misma en GNU Radio. La implementación mantiene compatibilidad con el estándar en la medida de lo posible, pero no necesita incorporar elementos que no están relacionados con los procedimientos de acceso compartido al medio. Durante el transcurso del proyecto se ha desarrollado el sistema utilizando el lenguaje de programación Python y las librerías de GNU Radio, con vistas a su uso en simulación. Tras el proceso de desarrollo se han llevado a cabo pruebas para comprobar que el mismo sigue el funcionamiento de FSA, comparando el sistema con resultados teóricos. Estas pruebas han verificado que el sistema se comporta conforme al estándar y a FSA. xv Abreviaciones ACK API CDMA CRC EAN EPC FDMA FFT FSA GNU GRC IDE IP ISO MAC MATLAB NAK NumPy OCR PC PMT RADAR RFID RN16 SciPy SDMA SDR SL SNR SRCID TCP Acknowledge - Asentimiento Application Programming Interface - Interfaz de programación de aplicaciones Code Division Multiple Access - Acceso múltiple por división en código Código de redundancia cíclica European Article Number - Códigos de barras en artículos (en Europa) Electronic Product Code - Código electrónico de producto Frequency Division Multiple Access - Acceso múltiple por división en frecuencia Fast Fourier Transform - Transformada rápida de Fourier Frame Slotted ALOHA Gnu’s Not Unix GNU Radio Companion - Interfaz gráfica de GNU Radio Integrated Development Environment - Entorno de desarrollo integrado Internet Protocol - Protocolo de Internet Organización internacional de Normalización Medium Access Control - Control de Acceso al Medio MATrix LABoratory - Software matemático de Mathworks Not AcKnowledge - No asentimiento Numerical Python Optical Character Recognition - Reconocimiento óptico de caracteres Protocol Control word - Palabra de control del protocolo PolyMorphic Type, en GNU Radio Radio Detecting and Ranging - Detección y medición de distancias por radio Radio Frequency Identification - Identificación por radiofrecuencia Número aleatorio de 16 bits Librería de algoritmos y herramientas matemáticas (diferente a ScientificPython) Space Division Multiple Access - Acceso múltiple por división en espacio Software Defined Radios - Radios definidas por software Indicador Selected Serial Number - Número serie Source IDentificator - Identificador de fuente Transmission Control Protocol - Protocolo de control de transmisión xvii xviii / Abreviaciones Proyecto Fin de Carrera TDMA Time Division Multiple Access - Acceso múltiple por división en tiempo TID Tag IDentification memory - Memoria de identificación de etiqueta UDP User Datagram Protocol - Protocolo de datagramas de usuario UHF Ultra-High Frequency: Banda de frecuencias de 300MHz a 3GHz UML Unified Modelling Language - Lenguaje Unificado de Modelado USRP Universal Software Radio Peripheral - Periférico universal de radio por software VIP Very Important People XML eXtensible Markup Language - Lenguaje de marcas extensible Capítulo 1 Introducción En este primer capítulo se presenta una breve introducción al presente Proyecto Fin de Carrera. En primer lugar se describe el contexto en el que se ha desarrollado el mismo. En segundo lugar se presenta la descripción del problema abordado. A continuación se expondrán los objetivos y, por último, se describe la estuctura del resto de la memoria. 1.1. Contexto y justificación El presente proyecto ha sido resultado de una estancia de prácticas en la Universidad de Siegen, Alemania, en concreto en la Cátedra de Sistemas Digitales de Comunicación de la Facultad de Ciencia y Tecnología. Esta cátedra está dirigida por el Profesor Christoph Ruland, doctor en Telecomunicación por la Universidad de Bonn. La investigación de la cátedra está centrada en: • Aplicación conjunta de codificación de canal y criptografía para canales ruidosos. • Aplicación de métodos formales en el diseño de protocolos seguros para medida. • Seguridad en sistemas de identificación por radiofrecuencia (RFID, por sus siglas en inglés). • Codificación de canal en sistemas RFID. • Servicios de seguimiento de documentos. Específicamente, el presente proyecto consiste en el diseño e implementación un sistema RFID con la mayoría de características recogidas en el protocolo EPC (Electronic Product Code) uno de los grandes estándares utilizados en el entorno 1 2 / Introducción (C. 1) Proyecto Fin de Carrera de la identificación por radiofrecuencia. Este estándar, promulgado por EPCglobal Inc. [1] y reconocido por ISO (Organización Internacional de Normalización) [2], se basa en la funcionalidad que proporciona RFID para la identificación de productos de manera única (mediante el llamado código de identificación electrónico), proporcionando numerosas ventajas fundamentalmente en el campo de la industria logística, como es el seguimiento de productos en tiempo real. El proyecto ha sido útil para conocer en profundidad dicho estándar. 1.2. Descripción del problema El principal problema que aborda este Proyecto Fin de Carrera es la implementación, conforme a los estándares ya existentes, de un sistema para las comunicaciones de los distintos elementos del sistema RFID. Tal y como se expone en la Sección 2.1, RFID es un sistema de identificación de dispositivos remotos desde otros dispositivos, con la utilización del aire como único canal transmisor, gracias a la radiofrecuencia. Consta de tres elementos, el lector, la etiqueta y el middleware. El lector es el dispositivo local desde el cual se accede a los dispositivos remotos, las etiquetas, que por lo general contienen un identificador único del objeto al que acompaña. El middleware permite gestionar la información que se extrae de las etiquetas, como por ejemplo la identificación del objeto a partir del identificador único contenido en la misma. Frame Slotted ALOHA (FSA por sus siglas), tal y como está descrito en el Capítulo 2, es un esquema para acceder al medio de transmisión cuando existen múltiples interesados en hacerlo. Este esquema es utilizado por los diferentes agentes participantes en la ronda de identificación en el sistema RFID. Dichos agentes, que son las etiquetas y el lector, deberán comportarse según las especificaciones del protocolo EPC Class-1 Gen.-2 [1], que regula las comunicaciones RFID en la banda de frecuencias UHF, tal y como está recogido en el estándar ISO/IEC 18000-6C [2]. El sistema RFID implementado deberá poder ser usado tanto para simulación como para emular las funcionalidades de los diferentes participantes en una transmisión real y, por tanto, poder evaluar las prestaciones en situaciones reales. El diseño abierto utilizado permitirá posteriormente añadir nuevos elementos al sistema RFID para su evaluación y se llevará a cabo mediante el uso de GNU Radio [3]. El framework de código abierto GNU Radio (ver Sección 2.3) es una herramienta utilizada en el campo del procesado de señal para emular una transmisión real con hardware de propósito general, o incluso para simulación. Jesús Pérez Comendador Objetivos / 3 La utilización de GNU Radio implica que la implementación se realice utilizando Python (ver Sección 2.2), o bien Python y C++, como lenguajes de programación. Con todo, el problema que se ha solventado en el presente Proyecto Fin de Carrera es el desarrollo de un sistema RFID que implemente el funcionamiento de FSA y se base en el estándar EPC, con posibilidad de desplegarlo en un entorno real en posteriores trabajos. Para ello se ha diseñado utilizando el lenguaje de programación Python en el marco del conjunto de librerías de GNU Radio. 1.3. Objetivos Tras lo relatado anteriormente se puede concluir que el principal objetivo del Proyecto Fin de Carrera es diseñar un sistema RFID abierto que utilice FSA como esquema de acceso al medio y base su funcionamiento en el estándar EPC. Este objetivo general se compone de los siguentes objetivos específicos: 1. Diseñar un sistema bajo una plataforma de código abierto gratuita que, si bien se utilizará con propósitos de simulación, permita en el futuro el despliegue en un entorno real. 2. Realizar un diseño del sistema centrado en mostrar el funcionamiento de FSA. 3. Implementar dos unidades separadas, el lector y la etiqueta, que serán los participantes del sistema. 4. Realizar una implementación clara y legible en un lenguaje sencillo de interpretar por otros programadores. 5. Implementar un esquema modular que permita la inclusión posterior de otras funcionalidades extra de forma sencilla. 6. Seguir una metodología de desarrollo que permita evaluar paso a paso el cumplimiento parcial de objetivos. 1.4. Estructura de la memoria El resto de la memoria consta de un total de tres capítulos y un apéndice. Los capítulos más importantes son el de Materiales y Métodos (Capítulo 2) —donde se exponen las tecnologías empleadas para acometer el problema, así como la metodología empleada— y el de Resultados (Capítulo 3) —donde se exponen los resultados del trabajo realizado. El Capítulo 4, Conclusiones, resume los logros 4 / Introducción (C. 1) Proyecto Fin de Carrera conseguidos y las posibles mejoras que se puedan llevar a cabo en la implementación. Por último, en el Apéndice A se describen los atributos y los métodos de todas las clases construidas. Capítulo 2 Materiales y Métodos En este segundo capítulo se describen tanto las tecnologías implicadas en la realización del proyecto como las necesidades materiales para realizar el proyecto y la metodología empleada para realizarlo. Muchas de las herramientas son muy conocidas, si bien otras, bien por su novedad o por su especificidad, no lo son tanto. 2.1. RFID Se comenzará con una introducción donde se definirá a grandes rasgos la tecnología RFID, incluyendo una breve historia y unas referencias al campo de la identificación automática, así como ejemplos de uso de la identificación por radiofrecuencia en la vida diaria. Posteriormente se hablará del problema del acceso al medio de transmisión cuando éste es compartido por más de un participante. Para finalizar la sección se describirá a fondo el protocolo EPC Clase 1 Generación 2, estándar de facto para las comunicaciones RFID. 2.1.1. 2.1.1.1. Introducción. ¿Qué es RFID? En el capítulo de Introducción se ofreció una corta definición de RFID. En este apartado se recordará y ampliará la definición del término. RFID es la abreviatura de Radio Frequency IDentification. Se trata de un sistema de acceso a dispositivos remotos llamados etiquetas RFID, mediante el uso de radio frecuencia, desde otros dispositivos, llamados lectores RFID [4]. Las etiquetas contienen, por lo general, un identificador único, de tal forma que, al acceder al mismo, se proporciona una forma de identificar al objeto al que acompaña. De hecho, RFID tiene como principal propósito la identificación de objetos por radio frecuencia, sin necesidad de estar en contacto con el mismo, sino simplemente de estar en el radio de cobertura del lector. 5 6 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Un sistema RFID consta de tres elementos: • Etiqueta RFID • Lector RFID • Middleware RFID Las etiquetas RFID, también llamadas tarjetas, transpondedores RFID o tags en inglés, son dispositivos activos o pasivos que contienen información sobre el objeto al que acompañan. Existen dos tipos de etiquetas, las etiquetas activas y las pasivas. Las activas se acompañan de una batería para el funcionamiento de la circuitería y la transmisión de la respuesta, mientras que las pasivas aprovechan el acoplamiento inductivo para conseguir la energía necesaria desde el lector RFID. Actualmente las etiquetas pasivas son las más utilizadas por su bajo coste —se puede conseguir una etiqueta pasiva conforme con el estándar EPC (ver Sección 2.1.3) por unos $0, 07 [5]— además de ser más pequeñas. Sin embargo las etiquetas activas permiten rangos de acceso mayores, memorias más grandes, e incluso poder almacenar información adicional que envíe el lector, aunque su coste suele ser muchísimo mayor -unos $25 por etiqueta, dependiendo de la funcionalidad deseada. En general el precio de las etiquetas depende de factores como la cantidad de memoria, el empaquetado, si es activa o pasiva y su frecuencia de funcionamiento, entre otros. El lector RFID es un elemento que entra en interacción con las etiquetas cuando éstas se adentran en su área de cobertura. Se encarga de leer los datos necesarios de las etiquetas y transmitírselos al nivel superior, el Middleware RFID. El Middleware RFID es todo aquel software encargado de procesar la información que el lector RFID recopila de las etiquetas. Podrá, por tanto, identificar cada uno de los objetos a los que está asociada cada etiqueta gracias al identificador único que éstas llevan. 2.1.1.2. La identificación automática Los sistemas o procedimientos de identificación automática son ampliamente utilizados en la vida diaria, no sólo en la industria. Por ejemplo, cada vez que se compra en un supermercado las cajas identifican de forma más o menos automática el producto que se pretende comprar y, a raíz de ahí, se pueden extraer numerosas características, como nombre del producto o su precio. La identificación mediante códigos de barras es el procedimiento de identificación automática más extendido durante las últimas décadas. Los códigos Jesús Pérez Comendador RFID / 7 de barras EAN (European Article Number ) son los más conocidos, pues fueron diseñados por la industria alimentaria y están presentes en la práctica totalidad de los productos manufacturados disponibles en cualquier establecimiento. Sin embargo la identificación automática ha avanzado mucho en los últimos años, y tenemos sistemas de identificación automática por Reconocimiento Óptico de Caracteres (OCR), mediante medidas biométricas (como por ejemplo la identificación por huellas dactilares o por voz), por medio de tarjetas inteligentes (smart-cards), o incluso por radiofrecuencia —sistema que nos atañe a nosotros— usando RFID [6]. Las smart-cards son dispositivos electrónicos de almacenamiento que en la mayoría de los casos poseen una pequeña capacidad computacional. Para comodidad son fabricadas en plástico y con tamaño estandarizado, como las tarjetas de crédito. Típicamente contienen uno o varios bancos de memoria que pueden ser encriptados fácilmente, y en algunos casos pueden contener microprocesadores para realizar operaciones concretas. Los sistemas que utilizan smart-cards y los que utilizan RFID están cada vez más relacionados. Esto es debido a que se ha conseguido integrar en las tarjetas inteligentes un transpondedor que es el encargado de recibir y transmitir datos y energía de funcionamiento. Mientras que las smart-cards tradicionales funcionan por contactos, estas nuevas tarjetas reciben el nombre de contactless puesto que no necesitan contacto alguno con el lector, es decir, funcionan por ondas de radio. Dadas las grandes ventajas que el sistema RFID proporciona, y gracias a las tarjetas inteligentes sin contacto, dicho sistema se está implantando en muchos aspectos de la vida cotidiana. Un ejemplo de ello es la aplicación de RFID a la identificación de trabajadores en una empresa utilizando tarjetas inteligentes contactless. 2.1.1.3. Historia de RFID El origen de RFID no es bien conocido, si bien el primer trabajo científico sobre RFID data de 1948, expuesto en un artículo de Harry Stockman titulado Communication by Means of Reflected Power [7]. En dicho documento se explora la comunicación a través de la reflexión de la energía que llega al dispositivo (lo que conocemos como etiquetas pasivas actualmente). Sin embargo postuló que todavía era necesario un considerable trabajo de investigación antes de poder solucionar los problemas que afectaban a este tipo de comunicaciones de potencia reflejada. 8 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Antes de la investigación de Stockman, en la Segunda Guerra Mundial, investigadores británicos diseñaron un sistema capaz de identificar sus aviones para evitar el llamado “fuego amigo”. Dicho sistema consistía en devolver una respuesta a una señal recibida. En función de si la señal recibida era correcta o no, el avión era identificado como amigo o enemigo. Los aparatos instalados en las aeronaves recibían el nombre de transpondedores y eran dispositivos capaces de recibir señales en una frecuencia y transmitir en otras. Sin embargo otros autores señalan que fue la Unión Soviética, también en la Segunda Guerra Mundial, la que diseñó las primeras etiquetas pasivas, pero en realidad eran dispositivos de escucha secretos, con lo que la finalidad de identificación no estaba demostrada. El desarrollo del radar y de RFID ha ido muy de la mano, ya que el fin del segundo es la identificación mediante ondas de radiofrecuencia. La diferencia fundamental radica en que RFID intercambia información entre el lector y el objeto a identificar, mientras que el radar posiciona elementos en el espacio sin que el objeto detectado realice ninguna acción. 2.1.1.4. Aplicaciones prácticas Por la descripción teórica que se ha facilitado se puede pensar que RFID es un sistema que sólo se encuentra en entornos industriales y no tiene ninguna aplicación en otros sectores. Nada más lejos de la realidad, pues RFID está muy presente en varios aspectos de la vida diaria. A continuación se ofrecerá una enumeración de ejemplos de situaciones en las que RFID está presente. Pasaporte biométrico o electrónico. A partir de 2006 en los países de la Unión Europea se fue generalizando la expedición del conocido como pasaporte electrónico. Estos nuevos pasaportes, aparte de su aspecto tradicional, incluyen un chip RFID que contiene, además de los datos personales, otros datos biométricos, como huellas dactilares e incluso la fotografía de la persona [8]. El objetivo de este nuevo pasaporte es combatir las falsificaciones, tanto del documento como de la personalidad, pues este chip en general está equipado con un mecanismo de claves asimétricas que hace que la falsificación sea prácticamente imposible. En la actualidad este tipo de pasaportes es requerido si se pretende viajar a la mayoría de los países del mundo (aquellos que están incluidos en la Organización de Aviación Civil Internacional, unos 185). Medios de pago. Desde hace varios años se viene utilizando tecnología RFID para realizar pagos sin necesidad de contacto. Esto sucede, por ejemplo, en las carreteras de peaje, tanto españolas como de otros países. Este sistema requiere de un transpondedor colocado en el coche que responderá al lector o lectores colocados sobre pórticos en las estaciones de peaje. Jesús Pérez Comendador RFID / 9 También merece especial atención el uso de transpondedores RFID implantados bajo la piel, que son utilizados en bares y parques de atracciones como medio de pago para sus clientes más exclusivos. En España esta tecnología es utilizada, por ejemplo, en el Baja Beach Club de Barcelona, donde se implantan transpondedores de la marca Verichip debajo de la piel de la mano para que los clientes VIP puedan ser identificados y puedan pagar sus consumiciones (esto se consigue asociando el identificador con los datos del cliente en una base de datos y con una cuenta de débito donde se van adeudando las mismas) [4]. Identificación de mascotas. El llamado chip. El conocido microchip es también un sistema RFID que está destinado a la identificación electrónica de animales. Las mascotas, según la legislación española, están obligadas a estar identificadas, incluso aquellas que no salen de casa. La identificación de la mascota con un transpondedor RFID es la manera más eficaz, pues las placas colocadas en el collar pueden desprenderse o ser retiradas con facilidad. El transpondedor se implanta en los animales, normalmente a la altura de la nuca, y al ser identificado por un lector, éste envía un identificador único que, introducido en una base de datos, nos dará la información del propietario. En la Comunidad de Madrid la implantación del chip es obligatoria en perros y gatos y está regulado por la Orden 11/1993 de 12 de Enero. Tarjetas inteligentes sin contacto. Las tarjetas contactless cada vez están ganando más protagonismo en la vida diaria. Introducidas recientemente en el transporte público en la ciudad de Madrid, estas tarjetas se vienen utilizando de manera especial en este sector desde hace algunos años, bien como tarjetas monedero o como tarjetas que contienen abonos temporales. Otros usos de estas tarjetas son la identificación de los trabajadores (en las tarjetas de empleado). RFID en logística. El uso de RFID en el campo industrial para identificación de mercancías es la aplicación más importante actualmente. Mediante este sistema una empresa puede tener constantemente localizados todos los artículos existentes en su almacén, o incluso en la cadena de producción cuando están siendo fabricados. El estándar EPC (ver Sección 2.1.3) define un sistema cuyo principal propósito es la identificación de elementos mediante su identificador único (identificador EPC, de 96 bits), de tal forma que se pueda mantener un control continuo de la ubicación del objeto. EPC es el estándar más ampliamente utilizado en logística [4]. Los nuevos retos que se le plantean a los sistemas RFID en el campo de la logística son: • Grandes distancias de lectura (sistemas RFID de largo alcance). 10 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera • Gran número de etiquetas (por ejemplo para manejar palets con cientos de elementos provistos con etiquetas). • Alta velocidad de lectura (por ejemplo cuando un toro mecánico cargado pasa por un arco lector en un almacén). 2.1.2. Control de acceso al medio (MAC) El Control de acceso al medio (MAC de sus siglas en inglés) es un mecanismo por el cual dos o más interlocutores se ponen de acuerdo para transmitir en un medio de transmisión compartido, de tal forma que todos los mensajes puedan ser entendidos en recepción. Esto no implica necesariamente que sólo un interlocutor transmita en cada instante, como veremos a lo largo de este apartado. RFID es un sistema que funciona con un único medio de transmisión. Por ello RFID debe utilizar un MAC, ya que tendremos una o más etiquetas que quieren comunicar su respuesta al lector, utilizando para ello el aire como medio de transmisión. El aire es compartido por todos ellos y, si se diera el caso en el que todos actuaran sin mecanismo de control, la comunicación sería prácticamente imposible. Todos los mecanismos de acceso al medio se pueden clasificar en cuatro grandes grupos. Estos son: • Acceso múltiple por división en espacio (SDMA) • Acceso múltiple por división en frecuencia (FDMA) • Acceso múltiple por división en tiempo (TDMA) • Acceso múltiple por división en código (CDMA) En la identificación por radiofrecuencia son frecuentes los tres primeros grupos. Pasamos a analizar cada uno de estos tres relacionándolos con RFID. Para finalizar explicaremos en detalle el control de acceso al medio que nuestro sistema RFID (conforme al protocolo EPC) utiliza. 2.1.2.1. Acceso múltiple por división en espacio (SDMA) En este esquema se trata de aprovechar la directividad de las antenas para hacer que sólo le llegue la señal a uno de los transpondedores a la vez y, por tanto, sólo conteste uno de ellos, es decir, dirigir el rayo a cada uno de los elementos por separado. También existen sistemas con SDMA que se componen de arrays de antenas cubriendo una determinada zona, cada una de las antenas con una cobertura mucho menor que en un sistema tradicional [9]. Jesús Pérez Comendador RFID / 11 Este tipo de control de acceso es muy costoso por la complejidad de las antenas que se deben construir, y se utiliza en aplicaciones muy específicas. Más frecuente es encontrar SDMA en combinación con los demás sistemas. 2.1.2.2. Acceso múltiple por división en frecuencia (FDMA) En este caso el canal se divide en diferentes subcanales en frecuencia, uno para cada uno de los participantes, de tal forma que es posible transmitir simultáneamente por todos ellos. El lector transmite en una frecuencia determinada y cada etiqueta responde en el subcanal que se le ha asignado, o bien si la comunicación va destinada a una en concreto, el lector transmitirá en la banda asignada a dicha etiqueta. La complejidad del lector es más que notable, ya que en realidad deberá existir un transceptor de radio para cada canal. Debido a esto y al hecho de que las comunicaciones lector-etiqueta-lector ocurren durante un período de tiempo (una vez que la etiqueta se ha identificado no hay más interacción), este tipo de procedimientos de acceso al medio son utilizados para aplicaciones concretas o, como en SDMA, combinados con otros métodos. 2.1.2.3. Acceso múltiple por división en tiempo (TDMA) Este conjunto de técnicas consigue la comunicación de todas las etiquetas con el lector a través de la asignación total del canal a cada uno de ellas secuencialmente en el tiempo. La asignación de los tiempos de acceso al canal la realiza un agente único de forma centralizada o bien se realiza automáticamente y de forma distribuida por todas las etiquetas. TDMA es el grupo al que pertenecen la mayoría de los esquemas de acceso al medio utilizados en RFID en la actualidad. Los procedimientos de acceso en los que las etiquetas deciden son procedimientos asíncronos, pues no es el lector el que controla la transferencia de datos. Se denominan procedimientos de acceso al medio síncronos cuando el lector es quien asume el control del medio. Por tanto, todas las etiquetas necesitan seguir las órdenes del mismo en todo momento. Estos mecanismos cumplen su función de la siguiente forma: 1. Se selecciona un transpondedor siguiendo un cierto algoritmo. 2. La comunicación tiene lugar exclusivamente entre ese transpondedor y el lector. 3. Una vez terminada la comunicación se repite el proceso seleccionando otro transpondedor. 12 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera La forma de seleccionar un transpondedor puede ser: por polling o encuesta, o por búsqueda binaria. Ambos métodos requieren que los transpondedores utilicen algún tipo de numeración única. El esquema de Polling requiere conocer una lista de identificadores de todas las etiquetas a su alcance. Sin embargo mediante búsqueda binaria el lector es capaz de determinar qué etiquetas están a su alcance provocando que todas las etiquetas transmitan a la vez su identificador único y viendo en qué bits se ha producido colisión. 2.1.2.4. La familia ALOHA, Frame Slotted Aloha y RFID ALOHA es el procedimiento de acceso al medio más sencillo. Es asíncrono y consiste en transmtir en el instante en el que se necesite, sin tener en cuenta que otra etiqueta lo esté haciendo, por lo que el acceso al medio de produce de manera aleatoria. Pertenece a la familia TDMA. Este procedimiento es bastante ineficiente, pues se ha demostrado que puede obtenerse un máximo de un 18,4 % de rendimiento, es decir, en caso de saturación, aproximadamente sólo 1 de cada 5 veces que se transmite se consigue hacerlo correctamente. ALOHA se inventó para la red ALOHAnet, una red creada en 1970 por la Universidad de Hawaii para conectar sus centros entre sí, de una manera similar a ARPANET [6]. La diferencia es que ALOHAnet estaba basada en radioenlaces, pues los centros estaban repartidos por las diferentes islas. Por tanto ALOHA no es un sistema utilizado exclusivamente para RFID. Para conseguir ampliar el rendimiento del sistema se inventó ALOHA ranurado, o en inglés Slotted ALOHA. Este sistema introduce una serie de divisiones en tiempo o slots, de tal forma que cada etiqueta sólo puede emitir en el inicio del mismo. Con ello se consigue elevar el rendimiento al 36,8 %, pero se requiere un esfuerzo grande en sincronización. En concordancia con ALOHA ranurado se desarrolló un sistema para tratar las colisiones que puedan ocurrir cuando existe más de un transpondedor en la zona de cobertura. Para ello los transpondedores están dotados de un número de identificación único, y además se definen una serie de comandos para sincronizar y controlar el funcionamiento de los transpondedores en el radio de acción del lector. Un breve resumen de los comandos genéricos se puede encontrar en la Tabla 2.1. Posteriormente nació FSA. Este sistema, que es el utilizdo para RFID en el estándar EPC (ver Sección 2.1.3), funciona como ALOHA ranurado pero con algunos matices: los slots se agrupan ahora en tramas (en inglés frames), que no tienen longitud prefijada (se fijan por el lector). Todas las comunicaciones deben establecerse en una trama, cuyo tamaño es conocido por las etiquetas cuando el Jesús Pérez Comendador RFID / 13 Tabla 2.1. Comandos de Slotted ALOHA para evitar colisiones. Fuente: [6] REQU EST Sincroniza todos los transpondedores en la zona de cobertura del lector para empezar a transmitir sus números serie al lector (SNR). Los transpondedores decidirán transmitir en uno de los siguientes L slots (L es fijo o bien se establece por medio del REQUEST. SELECT (SN R) Se selecciona un transpondedor en concreto que ha respondido correctamente al REQUEST, reemitiendo su número serie. Las etiquetas que no tienen como número serie SNR ignoran el comando. READ_DAT A El transpondedor que ha sido correctamente identificado envía datos al lector mediante este comando lector inicia la misma (comando genérico Request). Entonces cada etiqueta escoge aleatoriamente uno de los slots y llegado el mismo transmitirá un identificador (el inicio de cada uno de estos slots es indicado por el lector). Si dos etiquetas han elegido el mismo slot para transmitir se producirá una colisión, y provocará que la identificación falle (si el lector no puede o no sabe recuperar alguno de los identificadores). En este caso las etiquetas que han provocado la colisión se silenciarán y deberán esperarse a la siguiente trama para ser identificadas por el lector. Cuando se selecciona una etiqueta determinada, el lector pausa la ronda y efectúa las operaciones que debe realizar antes de continuar con la misma. La etiqueta identificada se silencia —bien de manera explícita mediante un comando del lector o bien implícitamente tras la finalización de las operaciones— y no actúa más en esa identificación. Por tanto, con FSA el lector RFID será el responsable de iniciar y controlar las comunicaciones que se produzcan en el sistema. Este procedimiento de acceso al medio sigue el mismo procedimiento anticolisiones que ALOHA ranurado. 2.1.3. 2.1.3.1. El Protocolo EPC Introducción El protocolo EPC Class-1 Generation-2 para RFID es un estándar publicado por la EPCglobal Inc. [1], y posteriormente reconocido por la Organización Internacional de Estandarización mediante el ISO 18000-6C [2]. En él se definen los requisitos, tanto físicos como lógicos, de un caso concreto de sistema RFID. 14 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Las particularidades de este sistema son: • Consta de etiquetas pasivas. • El primero en establecer la comunicación es el lector RFID (Interrogatortalks-first). • Opera en el rango de frecuencias de 860MHz a 960 MHz (dentro de la banda UHF). El lector transmite información a las etiquetas a través de una señal modulada en el rango descrito. Las etiquetas (que son pasivas y, por ello, no tienen fuente de alimentación) reciben la energía que requieren para funcionar de esta onda de radio, además de procesar la información que ésta transporta y respondiendo con una señal de vuelta al lector. Las comunicaciónes entre lectores y etiquetas son half-duplex, es decir, cuando los lectores transmiten, las etiquetas sólo reciben y viceversa. Por tanto, de todos los posibles sistemas que RFID permite construir, el presente proyecto se centrará en el sistema que el protocolo EPC define. A continuación se detallarán todos los aspectos del protocolo que se necesitan para el presente proyecto. Esto incluye cómo funciona, los comandos que se definen (algunos son obligatorios y otros opcionales), los dos entes principales (la etiqueta y el lector), cómo transcurre el proceso de inventariado y, por último, una recomendación acerca de la elección del tamaño de trama. 2.1.3.2. Funcionamiento: la capa de identificación de etiquetas El Protocolo EPC crea un modelo de dos capas: la capa física y la capa de identificación de etiquetas. Como el objeto de este proyecto es implementar etiquetas y lectores en el entorno GNU Radio, no nos debemos ocupar de las especificaciones de la capa física. Explicamos ahora el funcionamiento de la segunda capa, que podríamos decir que es la lógica del protocolo. El lector RFID, como ya se ha expuesto, es el primero en establecer comunicación con las etiquetas que se encuentran en su radio de acción. Por tanto será el encargado de dirigir la transmisión. El funcionamiento del lector se basa en tres operaciones básicas: Selección, Inventariado y Acceso. En la selección, el lector escoge un conjunto de etiquetas de toda la población que se encuentra en su radio de acción. El comando que utilizará es Select, y provocará que en las etiquetas se cambien determinados indicadores, en inglés flags (ver Sección 2.1.3.3). De esta forma podemos seleccionar para su posterior Jesús Pérez Comendador RFID / 15 identificación ninguna, una o varias etiquetas disponibles dependiendo de si éstas cumplen las condiciones impuestas por el usuario. En el inventariado se utilizan varios comandos. El comando que inicia esta operación es Query, y mediante este procedimiento se pretende identificar una a una las etiquetas en cobertura, siempre y cuando cumplan los parámetros que acompañan al comando (como se estudiará en la Sección 2.1.3.5). Esas condiciones se evalúan sobre el estado de los indicadores de la etiqueta. En la Tabla 2.1 se definieron los comandos genéricos anticolisiones de ALOHA ranurado. La operación de inventariado en el estándar EPC es, en definitiva, una adaptación de estos comandos a FSA y a dicho estándar. Por último, la operación de acceso consiste en leer y/o escribir datos de/en una etiqueta. Para ello se utilizan varios comandos, y requiere que se haya identificado correctamente a la etiqueta en el momento justo anterior. Las etiquetas pueden funcionar en un escenario con un máximo de cuatro lectores. Esta es una limitación necesaria ya que las etiquetas necesitan saber si ya han sido identificadas por cada lector y, a tal efecto, mantienen un indicador para cada uno, como se describe en el siguiente subapartado. Esto se articula a través de un mecanismo de cuatro sesiones en el que los lectores pueden realizar las operaciones de selección, inventariado y acceso de manera secuencial (es decir, no pueden funcionar a la vez pero sí uno a continuación del otro), asignándose a cada uno una sesión distinta. 2.1.3.3. Las etiquetas EPC Las etiquetas EPC son transpondedores RFID que utilizan la llamada backscattermodulation [6]. Esto convierte al sistema RFID en un sistema similar al de radar, en el cual el lector proporciona la señal de RF que se utiliza en ambos sentidos de la comunicación (de lector a etiqueta y viceversa). Las etiquetas responden a los comandos del lector modulando la potencia incidente y reflejando esta señal “al vuelo” de vuelta al lector. Este sistema permite además que la circuitería de las etiquetas EPC pueda ser alimentada por el campo eléctrico incidente que llega desde el lector (etiquetas pasivas), separando la componente continua de dicha señal incidente. También tienen cabida las llamadas etiquetas semi-pasivas o pasivas asistidas, que incorporan una batería para alimentar el circuito, de tal forma que no dependen de la potencia proporcionada por el lector para funcionar, pero se comunican mediante la energía que llega desde el lector. Esto proporciona una respuesta más rápida y aumenta la distancia desde la que se puede identificar respecto a 16 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera las etiquetas pasivas. En cualquier caso el estándar EPC no contempla aquellos transpondedores que contienen fuente generadora de potencia para transmitir, lo que comúnmente se conoce como etiquetas activas. Figura 2.1. Backscattering en etiquetas pasivas. Fuente [4] La Figura 2.1 representa precisamente un sistema que implementa backscattering. El lector envía una señal con un comando, la etiqueta (pasiva) extrae la componente continua de la misma para la alimentación de la circuitería y envía una respuesta de vuelta al lector a través la señal que viene del mismo. El protocolo define los requisitos de memoria, así como todas las posibles respuestas a los comandos obligatorios y opcionales (ver Sección 2.1.3.5), y una máquina de estados que proporciona una buena vista general del funcionamiento de las etiquetas. La memoria de las etiquetas EPC está dividida lógicamente en cuatro bancos, que pueden contener cero o más elementos. Estos son: Reserved, EPC, TID y User. Cada uno de ellos empieza en la dirección 0x00 y contienen cero o más palabras de 16 bits. Los comandos que acceden a memoria deben especificar a qué banco y a qué dirección de ese banco desean acceder (esto último conforme al estándar EBV especificado en el Anexo A de [1]). Para llevar a cabo el funcionamiento del protocolo las etiquetas necesitan una serie de indicadores, almacenados de manera especial y que deben ser persistentes en el tiempo conforme a las especificaciones del protocolo. Esto quiere decir que deberán almacenar su estado previendo cortes de corriente y que éstos valores estén disponibles tras el restablecimiento de la alimentación en la manera en que el protocolo lo requiere (ver Tabla 6.16 de [1]). Dichos indicadores son de dos tipos y los definimos a continuación: 1. Indicadores de inventariado o indicadores de sesión. Las etiquetas pueden ser inventariadas en cuatro sesiones diferentes. Estas sesiones posibilitan que se pueda utilizar más de un lector para inventariar la población Jesús Pérez Comendador RFID / 17 de etiquetas, pero nunca una única etiqueta participará en varias rondas de inventariado a la vez. Para cada una de las sesiones (S0, S1, S2, S3) la etiqueta mantendrá un indicador, que podrá tomar el valor A o B. Al principio de cada ronda el lector decidirá qué sesión utiliza y qué objetivo tiene (si las etiquetas ‘A’ o las etiquetas ‘B’). Cuando una etiqueta está correctamente identificada ésta invierte de forma automática el valor de su indicador de inventariado, silenciándose implícitamente. Este es el único recurso que no comparten las sesiones en las etiquetas. Todo lo demás es compartido entre las sesiones. 2. Indicador SL. Es un único indicador cuyo valor puede cambiar a través del comando Select (ver Sección 2.1.3.5). Los lectores podrán configurar la ronda de identificación para que las etiquetas participen o no en la misma dependiendo del valor de dicho indicador: de esta forma participarán sólo las etiquetas cuyo valor de SL coincida con el especificado y su indicador de inventariado para la sesión deseada se encuentre en la posición adecuada. Sin embargo también puede hacerse caso omiso de este indicador y, por consiguiente, sólo se haga caso al valor del indicador de inventariado para la sesión en concreto. Como se ha comentado ya, en el estándar podemos encontrar una forma de implementación de las etiquetas, basada en una máquina de estados con siete estados. En la Figura 2.2 podemos encontrar el diagrama de la misma, formada por los siguientes estados: Ready, Arbitrate, Reply, Acknowledged, Open, Secured y Killed. Cada uno de ellos se relaciona con una operación diferente. Así, en el estado Ready, la etiqueta se encuentra en reposo y no participa en ninguna ronda de inventariado, en los estados Arbitrate, Reply y Acknowledged la etiqueta participa en la operación de inventariado y en los estados Open y Secured, una vez que el lector dirige los comandos hacia ella en exclusiva, se participa en una operación de acceso. Por último el estado Killed significa que la etiqueta está deshabilitada total y permanentemente. La operación de selección puede producirse en cualquier estado y acarreará siempre la vuelta al estado Ready. 2.1.3.4. El lector EPC EPC proporciona un alto grado de libertad en la implementación del lector, aunque establece algunos requisitos para el mismo. El lector debe implementar los comandos obligatorios y debe implementar toda la señalización necesaria descrita en el protocolo, respetando el funcionamiento que ya se ha explicado en la Sección 2.1.3.2. Además se puede deducir de la especificación que el lector deberá alimentar con potencia suficiente su radio de acción, para que así las etiquetas puedan operar. 18 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Figura 2.2. Máquina de estados de las etiquetas EPC. Fuente [1] Puesto que el estándar no proporciona una implementación cerrada del lector, en el mercado es posible encontrar una gran variedad de tipos de funcionamiento entre los lectores conformes al estándar EPC. Entre las diferencias de funcionamiento se puede destacar, por ejemplo, la selección del tamaño de la trama: mientras que unos lectores tienen un tamaño fijo, otros implementan un algoritmo para variarlo en función de las etiquetas que les rodeen. Jesús Pérez Comendador 2.1.3.5. RFID / 19 Comandos Los comandos son los mensajes emitidos por el lector para poder llevar a cabo las operaciones de selección, inventariado y acceso. Son recibidos por todas las etiquetas presentes en la zona de cobertura, aunque dependiendo de una serie de factores pueden ser ignorados por las mismas. Existen cuatro tipos diferentes de comandos: 1. Comandos obligatorios. Estos comandos están incluidos en el protocolo y deben ser implementados para que el dispositivo sea conforme con el estándar. 2. Comandos opcionales. También están incluidos en el protocolo pero no es necesario implementarlos. Sin embargo si en el lector se implementa un comando opcional, las etiquetas deben ser capaces de interpretarlo y responder conforme al protocolo. 3. Comandos propietarios. Este tipo de comandos no están incluidos en el estándar, al ser definidos por cada fabricante. Sin embargo estos comandos no deben ser utilizados en entornos finales, únicamente con propósitos de fabricación. 4. Comandos personalizados. Por último, este grupo de comandos es el que añade funcionalidad añadida a las etiquetas de un determinado fabricante. No deben ser utilizados antes de identificar a una etiqueta en concreto y saber que dicha etiqueta está elaborada por ese fabricante (mediante el identificador de fabricante contenido en la memoria de la etiqueta, que es transmitida total o parcialmente al lector en la identificación, como ya se verá más adelante). De esta forma se sabrá con certeza que una etiqueta soporta los comandos personalizados. Los comandos personalizados no podrán duplicar la funcionalidad que ya ofrecen los comandos obligatorios y opcionales. Vamos a proceder al análisis de cada uno de los comandos obligatorios que el protocolo describe, centrando nuestra atención en aquellos que están ligados a las operaciones de selección e inventariado, ya que son éstos con los que se ha trabajado en este proyecto. Operación de selección: comando Select. Como ya se ha señalado anteriormente, el comando Select selecciona un conjunto de etiquetas para su posterior identificación. El efecto que produce en las mismas es la variación de uno de cinco posibles indicadores: cuatro de sesión (cada una de las sesiones tiene un indicador en la etiqueta) o el indicador SL (Selected ). Este último es común a todas las sesiones, y su valor puede ser determinante para responder a una ronda de identificación o no. 20 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Si bien el conjunto de cambios en los indicadores está restringido a las acciones explicadas en la Tabla 2.2, transmitiendo sucesivos comandos Select se puede configurar totalmente el conjunto de etiquetas que el usuario desee identificar. Los parámetros de este comando son: • Target. Determina cuál es el indicador que va a cambiar el comando, si procede • Action. Especifica la acción a realizar tras comprobar si se cumple la condición. La Tabla 2.2 expone las posibles acciones. Tabla 2.2. Acciones tras un Select. Fuente: [1] Action 000 001 010 011 100 101 110 111 Coincidente SL a ‘1’ o ind. sesión a ‘A’ SL a ‘1’ o ind. sesión a ‘A’ No hacer nada Negar SL o cambiar ind. sesión SL a ‘0’ o ind. sesión a ‘B’ SL a ‘0’ o ind. sesión a ‘B’ No hacer nada No hacer nada No coincidente SL a ‘0’ o ind. sesión a ‘B’ No hacer nada SL a ‘0’ o ind. sesión a ‘B’ No hacer nada SL a ‘1’ o ind. sesión a ‘A’ No hacer nada SL a ‘1’ o ind. sesión a ‘A’ Negar SL o cambiar ind. sesión • MemBank, Pointer, Length y Mask. Son parámetros que se encargan de localizar el segmento de memoria que va a ser sometido a comparación, así como el patrón con el que hay que comparar. La operación de Select tendrá como resultado coincidente o no coincidente dependiendo de si el parámetro Mask es igual al contenido de la memoria de la etiqueta en las Length posiciones después de la dirección señalada por Pointer, en el banco de memoria que indica MemBank. • Truncate. Es un indicador que muestra a la etiqueta si la respuesta que debe dar tras un comando ACK debe ser truncada (sólo se transmite una parte de la misma) o no. Sin embargo no sólo con activar este indicador es suficiente para que se produzca este cambio de comportamiento. Para que una etiqueta responda de manera truncada se debe dar que: el indicador Truncate haya sido activado en el último Select antes de empezar la ronda, que el destino de ese Select sea el indicador SL y que la máscara esté definida en el rango del banco de memoria EPC. La respuesta truncada puede obtenerse con detalle en [1]. Jesús Pérez Comendador RFID / 21 Aparte de todo ello, el comando lleva un código de redundancia cíclica de 16 bits, que permite comprobar que el comando se ha recibido sin errores, tal y como lo creó el lector. Si el comando tuviera errores, las etiquetas están obligadas a desecharlo. Inicio de la Operación de Inventariado: comando Query. Este comando inicia y configura una trama de FSA (ver Sección 2.1.2.4). En EPC una trama corresponde a una Ronda de inventariado. En esta ronda participarán únicamente aquellas etiquetas que cumplan los requisitos que dentro de este comando se especifican. Los campos que incluye este comando van dirigidos tanto al nivel físico como al de identificación. Los campos del nivel físico son: • DR. Indica la frecuencia de funcionamiento de la comunicación etiquetaslector. • M. Indica el tipo de modulación que se utilizará. • TRext. Indica si las comunicaciones etiqueta-lector requieren un tono piloto. En algunos comandos se emitirá un tono piloto independientemente del valor de este campo. Para la capa de identificación tenemos los campos que hacen relación a la configuración de la trama FSA. Estos son: • Sel. Este campo determina qué etiquetas responden al inventariado en lo que respecta al indicador SL. Se puede elegir que no se tenga en cuenta este indicador o que participen sólo los que lo tengan activado (o desactivado). • Session. Se elige una de las cuatro sesiones disponibles para la ronda de inventariado. • Target. Indica qué etiquetas participan en la ronda, atendiendo al estado de su indicador de sesión. Se puede ordenar una ronda de inventariado sobre las etiquetas cuyo indicador esté en la posición A o sobre las que tengan el mismo en la posición B. No se puede empezar una ronda de inventariado sobre ambos valores del indicador. • Q. Q configura el tamaño de trama (número de slots de cada trama). Es un número de 0 a 15. Las etiquetas tendrán disponibles 2Q slots para responder al lector con un entero (este funcionamiento se explicará más adelante). Continuación de la ronda: comando QueryRep. Este comando indica a las etiquetas el inicio de cada slot de la trama para que éstas respondan. Sólo contiene un campo, la sesión en la que el lector está trabajando (S0, S1, S2 ó S3). En cada ronda de inventariado se utilizarán tantos QueryRep como slots haya definido el lector. 22 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Modificación de la ronda: comando QueryAdjust. Mediante este comando el lector puede interrumpir la ronda de identificación actual e iniciar una nueva con las mismas características pero modificando el tamaño del mismo. Tras la recepción de este comando las etiquetas que participaban en la ronda y no están aún identificadas modifican el valor de Q (o lo dejan intacto, según el campo UpDn) y vuelven a empezar. Aquellas etiquetas ya identificadas no responden ni participan puesto que están silenciadas. Ningún otro parámetro de la ronda se ve alterado. Los campos que contiene un QueryAdjust son: • Session. • UpDn. Establece si el valor de Q debe ser incrementado en una unidad, decrementado en una unidad o, por el contrario debe ser mantenido, con respecto a Q de la trama anterior. Asentimiento de recepción del entero: comando ACK. El lector envía el comando ACK a las etiquetas para asentir a una determinada etiqueta. Lo único que contiene ACK es un identificador temporal de la etiqueta. Error: comando NAK. Cuando el lector no ha podido extraer correctamente la respuesta de una etiqueta (o bien ha habido colisiones) el lector envía un NAK. Ninguna etiqueta responderá a este comando, únicamente las que enviaron su respuesta constatarán que la identificación no ha tenido éxito y deberán esperar a una nueva ronda para ser identificadas. Al no haberse producido la comunicación con éxito no modificarán su indicador de sesión. Comandos de acceso. Estos comandos sólo pueden ser enviados por el lector una vez que una etiqueta ha sido identificada correctamente. Los comandos están dirigidos a dicha etiqueta y todas las demás deberán ignorarlos. A continuación se expone una breve descripción de los mismos. Solicitud de un nuevo entero: comando Req_RN. Este comando solicita a la etiqueta un nuevo número entero para proceder a la lectura de los datos que contiene. Lectura: comando Read. Mediante este comando el lector puede leer parte o todos los datos de uno de los bancos de memoria de los que la etiqueta está formada. Escritura: comando Write. Este comando permite escribir datos en la etiqueta. Jesús Pérez Comendador RFID / 23 Deshabilitación de la etiqueta: comando Kill. Con este comando obligatorio se consigue desactivar una etiqueta para que no pueda volver a responder a ninguna ronda de inventariado. Las etiquetas contienen en su interior una contraseña de Kill, de 32 bits. Para poder desactivar una etiqueta se necesita esta contraseña en el lector y enviarlo hacia la etiqueta de la siguiente forma: El lector deberá enviar dos comandos Kill para que sea ejecutado con éxito, en el primero enviará los primeros 16 bits de la misma aplicando XOR con un número aleatorio (solicitado a la etiqueta previamente) y en el segundo enviará los últimos 16 bits, también aplicando XOR con otro número aleatorio (solicitado entre el primer comando Kill y el segundo). Bloqueo de memoria: comando Lock. Mediante este comando se permite al lector bloquear tanto la contraseña de Kill para que no se pueda leer o cambiar, como un banco de memoria completo para que no se pueda escribir en él. La acción puede ser temporal o permanente. 2.1.3.6. La ronda de inventariado Una vez se conocen los detalles del protocolo, en esta sección se describe cuál es el procedimiento normal de funcionamiento del sistema. La ronda de inventariado como tal no utiliza los comandos de acceso, pues su único objetivo es detectar las etiquetas e identificarlas. La ronda de inventariado necesita previamente de una o varias operaciones de selección para seleccionar un subgrupo de etiquetas de todas las que están dentro del alcance del lector. Esto se lleva a cabo por parte del lector enviando uno o varios comandos Select con las opciones deseadas. El efecto de esta operación es modificar los indicadores de las etiquetas de tal forma que, mediante el comando Query posterior, participen sólo aquellas que deseemos que participen. Si no se efectúa esta operación no sabremos cuáles de ellas participarán en la ronda de inventariado. Una vez que tenemos las etiquetas seleccionadas se puede empezar la operación de inventariado, lo que se conoce como Ronda de Inventariado o, en términos de FSA, trama. Para ello el lector envía un comando Query en una de las cuatro sesiones, especificando si la ronda pretende identificar a las etiquetas cuyo indicador de sesión está en A o en B y, además, si todas las etiquetas participarán o sólo lo harán las que tengan el indicador SL en una posición determinada. En este momento las etiquetas disponen de 2Q slots para responder al lector. Esto se efectúa de la siguiente manera: las etiquetas eligen cada una un número entero aleatoriamente (contador de slots) de 0 a 2Q − 1 siguiendo una distribución uniforme. Si el número elegido es 0 las etiquetas responderán inmediatamente al 24 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera lector, si no cargarán el valor en memoria e irán decrementando dicho valor cada vez que llegue un QueryRep. Cuando el valor del contador es 0 las etiquetas responderán al lector con un número aleatorio de 16 bits. Este número recibe el nombre de RN16. Entonces el lector, tras la recepción de dicho número, envía un comando ACK asintiendo el RN16 recibido. A continuación la etiqueta responde (en el caso normal) con una palabra de control, el contenido del banco de memoria EPC más un CRC de 16 bits. En ese momento la etiqueta se considera inventariada, pues la memoria EPC contiene el identificador único de la misma. Tras la identificación correcta de una etiqueta ésta invierte su indicador de sesión de A a B o de B a A. Además queda silenciada para la ronda actual. Si dos etiquetas eligen el mismo contador de slots y, por tanto, responden a la vez en un slot determinado, se producirá una colisión. Si el lector detecta la colisión y no es capaz de extraer al menos uno de los RN16 de una de las etiquetas, envía un comando NAK. Estas etiquetas no podrán ser identificadas en esta ronda y tendrán que esperar a la siguiente, siguiendo el funcionamiento de FSA. EPC articula dicho funcionamiento obligando a las etiquetas a cargar un valor en el contador de slots tan alto que por más que lo decrementen el fin de la ronda llegará antes de que las etiquetas consigan tener 0 en dicho contador. El valor mínimo que asegura esto es 0x8000, puesto que el valor máximo de Q es 15, con lo que el número máximo de slots será K = 215 = 3276810 = 0x8000. Si una etiqueta está esperando a recibir un ACK y lo recibe pero contiene un RN16 que no se corresponde con el suyo, actuará de la misma forma que si recibiera un NAK. 2.1.3.7. Elección de Q por parte del lector Los lectores EPC deberán presumiblemente efectuar varias rondas de inventariado para identificar correctamente todas las etiquetas que están a su alcance, dependiendo de cuántas sean. Un parámetro que influye directamente en ello es el parámetro Q, que establece el número de slots de la trama, es decir, el número máximo de etiquetas que se podrían identificar (si no hubiera ningún tipo de colisión), en una ronda. Q es un parámetro que se escoge por el lector al inicio de cada ronda y de una ronda a otra puede ser variado a discrección. Mientras que algunos lectores comerciales implementan la longitud de la trama variable, la mayoría opta por escoger un valor al inicio y mantenerlo para todas las rondas siguientes hasta que se han identificado todas las etiquetas alrededor. Jesús Pérez Comendador RFID / 25 En [10] se demuestra que FSA alcanza su máximo rendimiento cuando el número de etiquetas (N ) y el número de slots (K = 2Q : Q = 0, ..., 15) es el mismo, obteniendo en ese caso un rendimiento del 36 % aproximadamente. Saber el número de etiquetas que están en la zona de cobertura del lector no es posible, pues no existe un mecanismo que permita conocer dicho número antes de identificarlas. Sin embargo a través de las respuestas que se obtienen sí se puede estimar la población de etiquetas que el lector debe identificar. Es por ello que existen algoritmos que tratan de estimar el número de etiquetas y modifican Q para la siguiente ronda. Estos algoritmos establecen un Q inicial para la primera ronda y empiezan a funcionar a partir de la segunda ronda. El protocolo EPC contiene en uno de sus anexos un algoritmo para que los lectores puedan variar la longitud de la trama. No es obligatorio implementarlo, sino que se propone como una posible solución. La Figura 2.3 muestra dicho algoritmo. Figura 2.3. Ejemplo de algoritmo para escoger Q. Fuente [1] Las variables en el diagrama son: • Qf p es un número real que representa a Q. Se redondeará para obtener el valor de Q que se utilizará. 26 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera • C es un parámetro que controlará el algoritmo dependiendo del valor de Q. Típicamente 0,1 < C < 0,5, cuanto más grande sea Q menor será C y viceversa. Primeramente se elige Q=4. Al final de la ronda pueden ocurrir tres escenarios: 1. Si no responde ninguna etiqueta se decrementará Q. Si el resultado es negativo se selecciona Q=0 (Es decir, K=1). 2. Si responde exactamente 1 etiqueta el valor de Q no varía. 3. Si responden más de una etiqueta se incrementa Q, sin sobrepasar el valor máximo de Q, que es 15. Bueno-Delgado y Vales-Alonso en [10] analizan el rendimiento de la identificación en los sistemas EPC a través del uso de Cadenas de Markov discretas. En el caso en el que Q es igual para todas las rondas, como resultado de este análisis proponen que, para obtener el máximo rendimiento en todo el proceso (no individualmente en cada trama), se debe seleccionar Q acorde a la Tabla 2.3. Tabla 2.3. Selección de Q para lectores con Q fija. Fuente: [10] N N =1 1<N ≤4 4<N ≤8 8 < N ≤ 19 19 < N ≤ 38 38 < N ≤ 85 85 < N ≤ 165 165 < N ≤ 340 2.2. Q 0 1 2 3 4 5 6 7 N 340 < N ≤ 720 720 < N ≤ 1260 1260 < N ≤ 2855 2855 < N ≤ 5955 5955 < N ≤ 12124 12124 < N ≤ 25225 25225 < N ≤ 57432 57432 < N Q 8 9 10 11 12 13 14 15 El lenguaje de programación Python Una vez que se ha explicado detenidamente qué es RFID y cómo funciona el estándar EPC, se describe qué herramientas se utilizan para llevar a cabo este proyecto. Empezamos con el lenguaje de programación Python. Python es un lenguaje de programación de alto nivel y de código abierto creado por Guido van Rossum y publicado en 1991 [4]. Es un lenguaje interpretado, es decir, el código se ejecuta por un intérprete. Por ello los archivos de código fuente en Jesús Pérez Comendador El lenguaje de programación Python / 27 Python suelen ser llamados comúnmente scripts, si bien estos archivos reciben oficialmente el nombre de módulos. Los módulos pueden ir agrupados en paquetes. Está diseñado para que sea legible y limpio. Además permite programar en varios paradigmas de programación: programación orientada a objetos, funcional, imperativa, etc. Frente a otros lenguajes interpretados, Python destaca por ser fuertemente tipado y de tipado dinámico. Es decir, en Python existen tipos aunque el tipo de dato se decide cuando se crea la variable o cuando se le asigna un nuevo valor. Por tanto podemos tener una variable con un string y asignarle un número entero en la siguiente línea. Según la página web de Python [11] los principios diferenciadores de este lenguaje son: • Sintaxis clara y legible. • Fuerte capacidad de introspección en el funcionamiento del mismo. • Orientación a objetos intuitiva. • Expresión natural de código procedimental. • Modularidad total, soportando jerarquía de paquetes. • Tratamiento de errores mediante excepciones. • Tipos de datos dinámicos de muy alto nivel. • Librerías estándar completas y módulos de terceros para prácticamente cualquier tarea. • Fácilmente extensible mediante código en C/C++ u otros lenguajes. • Empotrable en aplicaciones como una interfaz de scripting. 2.2.1. Utilidad para el proyecto. Python es el lenguaje de programación que se ha utilizado para implementar el sistema experimental de RFID desarrollado en el presente proyecto. La utilización de Python en este proyecto presenta dos ventajas: • La integración de módulos Python en el entorno GNU Radio (ver Sección 2.3) es sencilla mediante el uso del proyecto GrExtras (ver Subsección 2.3.5). 28 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera • Existen gran cantidad de librerías desarrolladas para este lenguaje de programación. La principal desventaja de Python es que la ejecución del código suele ser más lenta que en los lenguajes de programación compilados. Sin embargo para el sistema desarrollado Python no representa ningún inconveniente, pues el tiempo no es un aspecto crítico. Aporta, por tanto, muchas más ventajas que inconvenientes trabajar con dicho lenguaje. 2.3. 2.3.1. GNU Radio Qué es GNU Radio GNU Radio es un conjunto de librerías open-source que proveen diferentes funcionalidades para desarrollar los llamados radios definidos por software (SDR, de sus siglas en inglés) [3]. Se puede utilizar en combinación con hardware o simplemente para simulación en el ordenador. Según [4] “Un sistema de Radio Definido por Software (Software Defined Radio, SDR) es un sistema de radiocomunicaciones donde los componentes típicamente implementados en hardware (mezcladores, filtros, amplificadores, moduladores/demoduladores, detectores, etc) son implementados en software, utilizando una computadora personal (PC) u otros dispositivos de computación embebida”. Los sistemas de radiofrecuencia tradicionales llevan a cabo su función a través de hardware especializado construido ad hoc 1 . Sin embargo GNU Radio permite que, utilizando hardware de propósito general, se puedan llevar a cabo multitud de implementaciones diferentes, adaptando dicho hardware a nuestras necesidades. Dado que los SDR contienen software que funciona en un ordenador, el procesamiento que se realiza es de tipo digital. El harware se encargará de la recepción/emisión de señal, de la conversión A/D y D/A, etc. El software se encargará de los procesos de modulación y demodulación, procesado de la señal digital, etc. El hardware de propósito general que GNU Radio utiliza es el llamado USRP (Universal Software Radio Peripheral ), diseñado y producido por Ettus Research, LLC., filial de National Instruments. Se conectan al ordenador mediante USB o alguna otra conexión de alta velocidad, e incluso hay algunos modelos que contienen un microprocesador que les permite actuar en modo autónomo (programándolo). 1 Últimamente también se está desarrollando hardware específico que funciona con SDR, como algunos lectores RFID, que contienen la mayor parte del procesado de señal en dispositivos programables. Jesús Pérez Comendador GNU Radio / 29 GNU Radio funciona a través de bloques, que procesan ininterrumpidamente señales de entrada y elaboran señales de salida. Estos bloques se escriben normalmente en C++ por cuestiones de velocidad, aunque como se explicará más adelante existen mecanismos que permiten programarlos en Python. GNU Radio proporciona numerosos bloques ya escritos y listos para utilizar. Sin embargo, para nuestra aplicación se necesitan crear todos los bloques utilizados, pues no existen por defecto en GNU Radio. 2.3.2. Los bloques de procesado de señal Empecemos explicando el funcionamiento de los bloques de GNU Radio. Estos bloques hacen procesamiento de señal en un entorno digital, con lo que su unidad de trabajo temporal serán muestras. Estas muestras, que llegarán al bloque con una frecuencia de muestreo determinada, serán procesadas y elaboradas y darán lugar a una muestra de salida. Dentro del bloque puede utilizarse prácticamente cualquier algoritmo deseado, siempre que pueda implementarse en C++ o Python, lenguajes que soporta GNU Radio. Podrán tener memoria, realizar integración, derivación, etc. Gracias a librerías matemáticas especializadas (ver Sección 2.4) los lenguajes de programación pueden ser extendidos fácilmente. Existen diferentes tipos de bloques dependiendo de sus entradas y salidas. Los exponemos a continuación. 1. Bloques con uno o varios puertos de entrada y uno o varios puertos de salida. Este es el tipo más común de bloques, y realizan el procesado intermedio. Reciben muestras de otros bloques, las procesan y generan nuevas muestras que irán a otros bloques. 2. Fuentes. Bloques con ningún puerto de entrada y uno o varios de salida. Este tipo de bloque se coloca al principio de la cadena de procesado de señal y provee de muestras de señal a los demás bloques. Estos bloques son en su mayoría generadores de pulsos, tonos, etc. o incluso bloques que captan la señal del exterior y la introducen en GNU Radio (por ejemplo de la entrada de micrófono de la tarjeta de sonido o de alguna entrada del USRP). 3. Sumideros. Bloques con uno o varios puertos de entrada y ningún puerto de salida. Estos bloques consumen muestras pero no generan ninguna nueva. Sirven para exportar datos fuera de GNU Radio, por ejemplo para escuchar las muestras procesadas por los altavoces o para transmitirlas (con ayuda del USRP) por radiofrecuencia a un receptor. 30 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera Aparte de configurar en un bloque el número de puertos de entrada y salida, deberemos establecer además el tipo de dato que intercabiará ese puerto. Así, los tipos de datos inicialmente soportados por GNU Radio son cualquiera que pueda ser implementado en C++. Los más comunes son complex, float, int y short, entre otros. Si se quiere crear un nuevo bloque, GNU Radio dispone de una clase llamada Block de la que debe heredarse. En el constructor de la clase que representa al nuevo bloque se deberá especificar todas las características del mismo: número de puertos de entrada, número de puertos de salida, tamaño de cada puerto (o relación entre entrada y salida) u, opcionalmente, si el bloque utiliza otro mecanismo diferente de intercambio de datos (como veremos más adelante en la Sección 2.3.5). Además se debe sobreescribir el método work() de la clase madre. El planificador de GNU Radio llamará a work() de cada bloque cuando necesite obtener datos de él. Esta función debe tener como parámetros dos vectores de arrays, uno como entrada y otro como salida de datos, y debe devolver el número de elementos que se han producido. 2.3.3. Grafos de flujo En GNU Radio los sistemas de radio son construidos mediante los conocidos como Grafos de Flujo (flow graphs en inglés). Éstos no son más que grafos en los que los nodos son los bloques que forman parte del sistema y las aristas son las conexiones que existen entre los diferentes bloques. Los grafos de flujo se programan en Python y son, en sí mismos, un tipo especial de bloque de GNU Radio llamado Top Block. Este bloque será lo que se ejecute cuando se desee iniciar el sistema que se ha construido. En los mismos cabe cualquier tipo de implementación de bloques, ya sea en C++ o Python, siempre que hayan sido expresamente diseñados para GNU Radio, o bien se pueden incluir alguno de los bloques que la librería ofrece. Para que un grafo funcione correctamente es necesario que exista, al menos, un bloque fuente y un bloque sumidero. 2.3.4. GNU Radio Companion GNU Radio Companion (GRC) es la interfaz gráfica de GNU Radio. Genera automáticamente el código necesario para interconectar los diferentes bloques que tengamos que utilizar, es decir, el grafo de flujo. Es una interfaz muy parecida a Simulink de Mathworks [12] que funciona mediante drag and drop, con lo que permite generar grafos de manera sencilla y da acceso a todo el potencial que GNU Radio posee. Jesús Pérez Comendador GNU Radio / 31 Todos los bloques que incluye GNU Radio están disponibles para utilizar en GRC. Los bloques creados por el usuario también pueden incluirse escribiendo un archivo XML con la descripción del bloque. Debido a la escasa documentación que existe sobre GRC, incluso en el propio sitio web de GNU Radio [3], este proceso es complicado. Es por esta razón por la que no se ha utilizado GRC en este proyecto, pues la única ventaja que aporta es la creación de grafos de flujo de manera gráfica. 2.3.5. GrExtras: extendiendo GNU Radio El proyecto GrExtras [13] añade características adicionales a GNU Radio. Analizaremos ahora una a una las características que complementan la librería de la que trata esta sección. 2.3.5.1. Escribir bloques en Python GNU Radio está diseñado para ser escrito en C++ y Python. El primero se utiliza para codificar el procesamiento de señal, ya que es más rápido, mientras que el segundo es más sencillo de programar y se utiliza para conectar todas las “piezas” del sistema. Desde este proyecto se propone la idea de escribir todo en Python, pues es un lenguaje cuya programación resulta más rápida e incluye muy buenas librerías con las que trabajar. Si se quiere crear un nuevo bloque utilizando el lenguaje de programación Python, GrExtras dispone de la clase Block de la que debe heredarse. El resto del funcionamiento es igual que para el caso general de GNU Radio. Los arrays que utiliza GrExtras pertenecen a la librería NumPy (ver Sección 2.4). Por supuesto para conseguir el fin deseado el bloque puede utilizar toda la funcionalidad de las librerías oficiales de Python y también aquellas proporcionadas por terceros. 2.3.5.2. PMT. Serialización de objetos PMT, PolyMorphic Type, es, a la vez, un tipo de dato y una librería de serialización incluida en GNU Radio [3]. GrExtras proporciona acceso a la misma y convierte el tipo PMT al objeto PMT en Python. Dicho objeto debe ser utilizado para paso de mensajes de GrExtras, funcionalidad que se explicará en el siguiente apartado. El objeto PMT es un contenedor donde se puede almacenar cualquier variable serializada, sin importar el tipo de dato, pero por defecto se incluyen métodos 32 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera de serialización sólo para los tipos de dato más comunes. Precisamente GrExtras proporciona para Python dicha funcionalidad, existiendo métodos para la mayoría de tipos de dato básicos en Python y para el objeto ndarray de NumPy (que se explicará en la Sección 2.4). Además GrExtras abstrae al usuario del tipo de dato, pues para serializar y deserializar únicamente se deberá llamar a sendos métodos, con independencia del tipo de dato. 2.3.5.3. Paso de mensajes GNU Radio utiliza como unidad temporal las muestras. En su funcionamiento normal, el planificador de GNU Radio ejecuta el método work() del bloque cuando necesita alguna muestra (ver Subsección 2.3.2). Sin embargo para algunas aplicaciones puede resultar muy complicado trabajar con muestras, como en el caso de este proyecto. En este aspecto GrExtras incorpora una nueva funcionalidad: el paso de mensajes. La implementación del paso de mensajes consigue abstraer al usuario del flujo de datos, y lo que los bloques reciben o envían son mensajes, utilizando instancias del objeto PMT. El uso de dicho objeto simplifica el proceso, pues los mensajes que se intercambian contienen únicamente un tipo de dato, el objeto PMT. La información contenida en el mensaje deberá, por tanto, ser deserializada antes de poder utilizarse. Este nuevo mecanismo de intercambio de información utiliza unos puertos diferentes a los utilizados para el intercambio de muestras, por lo que deberán ser declarados aparte. Además si se utilizan exclusivamente mensajes para el intercambio de datos, el método work() sólo será llamado una vez por el planificador. Los mensajes intercambiados son instancias de un objeto definido por GNU Radio y sus tres atributos más importantes son: key, value y srcid (opcional). Los tres campos deben ser objetos PMT que contengan datos serializados con la librería. • El campo key es un identificador único del tipo de contenido. • value es el mensaje en sí que se desea intercambiar. • Opcionalmente se puede indicar un campo srcid que identifica de manera única al emisor del mensaje. Para leer y escribir mensajes existen sendos métodos que el bloque hereda de Block. El de recepción es bloqueante hasta que llega un mensaje, y no tiene en cuenta el puerto de llegada, mientras que el método de envío no detiene la Jesús Pérez Comendador NumPy / 33 ejecución del hilo. Este último recibe como parámetros los atributos descritos anteriormente y el puerto por el que se envía. Este mecanismo de paso de mensajes permite que la implementación del protocolo EPC pueda transmitir los comandos del lector a las etiquetas de una vez y recibir las respuestas de las etiquetas en el lector también de una vez, y de forma similar en las etiquetas. 2.3.5.4. Bloques y API Todas las características anteriores de GrExtras se sustentan sobre su propia interfaz de bloques para GNU Radio. Esta interfaz provee APIs para varios tipos de bloques, para aquellos programadores que no tienen pensado utilizar ninguna de las otras características de GrExtras pero sin embargo quieren implementar en C++ diferentes tipos de funcionamiento en cuanto a generación y consumición de flujos de muestras. Se puede obtener más información sobre los modos de funcionamiento en [13]. Simplemente se debe heredar de uno de estos bloques “plantilla”, especificar qué modo de funcionamiento se desea, especificar el procesado en el método work() y la API será capaz de llevarlo a cabo con el modo de funcionamiento deseado. Aparte de esto, GrExtras proporciona bloques ya construidos para diferentes aplicaciones, la mayoría centrados en explotar el mecanismo de paso de mensajes que esta extensión aporta. Como ejemplo, GrExtras proporciona bloques que permiten crear sockets TCP/UDP y transmitir o recibir paquetes (o datagramas UDP), utilizando el mecanismo de paso de mensajes, con lo que podremos utilizar comunicaciones IP en nuestro procesamiento. 2.4. El paquete NumPy para Python Numerical Python, conocido normalmente mediante su abrebiatura, NumPy, es una extensión de código abierto para Python que proporciona la posibilidad de trabajar con arrays y matrices [14]. Su principal aporte es el tipo de dato ndarray, un array multidimensional. Además proporciona funciones matemáticas para trabajar con dichos arrays. Fue creado en 2005, a partir de los predecesores Numarray y Numeric, por Travis Oliphant y está integrado en SciPy, aunque se puede descargar e instalar por separado. SciPy es un conjunto de librerías que convierten a Python en una herramienta matemática comparable al software MATLAB de Mathworks, con módulos para optimización, álgebra lineal, integración, interpolación, funciones 34 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera especiales (como la de Bessel), FFT, procesado de señal e imágenes, ecuaciones diferenciales ordinarias, entre otros. 2.4.1. El array en NumPy El tipo de dato que NumPy introduce es un array multidimensional con posibilidad de albergar una gran cantidad de elementos. Al ser un array todos los datos que contiene son del mismo tipo. Los elementos se localizan mediante una tupla de enteros positivos empezando en 0. Los arrays contienen, entre otros, los siguientes atributos: • ndarray.ndim - Número de ejes (dimensiones) del array. • ndarray.shape - Dimensiones del array. Por ejemplo (n,m) para una matriz de n x m elementos. • ndarray.size - Número de elementos totales del array. • ndarray.dtype - Tipo de dato de los elementos, bien estándares de Python o de NumPy. Por defecto el array contendrá datos del tipo numpy.float64 (es decir un número de coma flotante de 64 bits de precisión). Sin embargo a la hora de crear el array se puede definir el tipo deseado. Para crear un array de NumPy simplemente debemos instanciar un array que contenga como parámetro una lista. Esta lista contendrá los elementos del array. Si queremos crear un ndarray con más dimensiones la lista contendrá listas, una por cada fila. Opcionalmente, como ya se ha comentado, podremos especificar el tipo de dato en el momento de la creación. 2.4.2. Funciones en NumPy El paquete NumPy contiene, además del tipo de dato ndarray, un conjunto de funciones para poder trabajar con dichos arrays, y un conjunto de funciones matemáticas para álgebra lineal, transformada de Fourier y números aleatorios, para utilizar bien sobre ndarrays o sobre variables escalares. En cuanto a las funciones para trabajar con arrays podemos destacar funciones para reorientar los elementos, operaciones aritméticas, operaciones de comparación entre arrays, o incluso álgebra de matrices. 2.4.3. Utilidad para el proyecto El principal aporte de este paquete es la facilidad con la que se puede trabajar con arrays. Los comandos EPC no son más que colecciones de bits que son empaquetados juntos y se transmiten del lector a las etiquetas. GNU Radio y GrExtras proporcionan soporte para los arrays de NumPy, con especial atención en el uso Jesús Pérez Comendador El entorno de desarollo Eclipse / 35 para el paso de mensajes. Por tanto en este proyecto se utiliza NumPy para representar los comandos EPC y las respuestas de las etiquetas, de tal forma que se pueda utilizar la característica de paso de mensajes que GrExtras proporciona. 2.5. El entorno de desarollo Eclipse Eclipse es un entorno de desarrollo integrado de código abierto. Un entorno de desarrollo integrado, o IDE por sus siglas en inglés, hace referencia a un programa que está compuesto por varias herramientas de programación. Su misión por tanto es proveer de todo lo que necesita el programador para desarrollar nuevos programas. Típicamente se componen de [4]: • “Un editor de texto • Un compilador • Un intérprete • Un depurador • Un cliente • Posibilidad de ofrecer un sistema de control de versiones. • Factibilidad para ayuda en la construcción de interfaces gráficas de usuario.” El entorno de desarrollo puede ser específico para trabajar con un lenguaje de programación o puede contener varios. En el caso de Eclipse se incluye principalmente Java, aunque existen extensiones que permiten trabajar con muchos otros lenguajes. Instalando la extensión PyDev, Eclipse se convierte en un IDE que provee herramientas útiles para trabajar con Python. 2.6. Metodología Antes de finalizar con el presente capítulo se describe la metodología de trabajo que se ha seguido para implementar el sistema experimental de RFID sobre el que el proyecto trata. Como el lector ha podido comprobar a lo largo del capítulo se deberán implementar dos tipos de entidades, el lector EPC y la etiqueta EPC. Entre ellas existe un intercambio de información, con lo que se tendrá que posibilitar un medio por el cual ambos sistemas se puedan comunicar. Todo ello enmarcado en GNU Radio. En el presente Proyecto Fin de Carrera se ha optado por la Metodología de Desarrollo Incremental [4]. Esta metodología propone que el desarrollo se divida 36 / Materiales y Métodos (C. 2) Proyecto Fin de Carrera en varios subproblemas de creciente complejidad, abordando cada uno de los problemas de manera secuencial. Inicialmente se construye un sistema básico que cumpla los objetivos más sencillos. En cada paso siguente se toma el sistema construido en la fase anterior y se actualiza con nuevos requisitos, consiguiendo finalmente cumplir los objetivos totales. En concreto la división que se ha efectuado ha sido: 1. Definición de requisitos y características del sistema. 2. Elaboración de las máquinas de estado de lector y etiquetas. Tras la definición de requisitos, se deberá modificar la máquina de estados de la Figura 2.2 para adaptarla a los mismos. Para el caso del lector se deberá elaborar desde cero la misma, puesto que no existe en el estándar. 3. Elaboración del modelo inicial de clases del sistema. Debido a la envergadura del proyecto, antes de proceder a la implementación del mismo, se debe elaborar un primer modelo de clases que permita cumplir los objetivos de claridad y modularidad establecidos en el Capítulo 1. 4. Implementación de la etiqueta en Python. Con este paso empieza la labor de codificación. Por el momento no se utilizará GNU Radio, simplemente se programará en el lenguaje Python la máquina de estados elaborada en el punto 2 para la etiqueta. 5. Desarrollo de una primera versión del paso de mensajes y comunicación manual con las etiquetas. Para evaluar la implementación de la etiqueta se elaborará una primera versión del programa en la que el usuario puede elaborar y enviar los comandos, así como comprobar la respuesta que se recibe de las mismas. 6. Implementación del lector en Python. El siguiente paso es programar el lector usando el lenguaje Python. De la misma forma que para las etiquetas, la máquina de estados elaborada en el punto 2 se codificará en dicho lenguaje de programación. 7. Conexión de ambas entidades y mejora del paso de mensajes. Funcionamiento en modo automático. Este es el paso necesario para verificar el funcionamiento correcto del lector. Se elaborará una nueva versión del programa en la que se conectarán ambas entidades y podrá ordenarse la realización de rondas de inventariado por parte del usuario, sin tener que elaborar y escribir los comandos manualmente. Jesús Pérez Comendador Metodología / 37 8. Encapsulación de lector y etiqueta en bloques de GNU Radio y desarrollo del nuevo paso de mensajes. Este es el último paso para conseguir el sistema completo. Se introducirá el entorno GNU Radio en este momento, encapsulando ambas entidades en bloques, además de implementar otra funcionalidad necesaria para que el sistema funcione en dicho entorno. El paso de mensajes se hará ahora utilizando las características explicadas en la Sección 2.3.5. Terminado el proceso de implementación se han realizado pruebas y evaluado las prestaciones del sistema construido. El sistema conseguido al final del proceso, tal y como se definió en la Sección 1.3, es una implementación que representa el comportamiento de FSA en el estándar EPC. Como se puede observar la complejidad de los problemas es creciente y cada uno de ellos se apoya sobre el anterior, consiguiendo finalmente el sistema deseado. Capítulo 3 Resultados En este capítulo se encontrará la descripción detallada del proceso de elaboración, siguiendo el guión presentado en la Sección 2.6 del capítulo anterior. Además de la descripción del proceso se recogerán una serie de medidas que se han recogido del sistema para comprobar su funcionamiento. Estas medidas serán comparadas con resultados teóricos y simulaciones del sistema. Por tanto en este capítulo se ofrece una amplia visión de cómo está construida la implementación, de su funcionamiento y de los resultados que aporta. Los diagramas mostrados a lo largo del capítulo complementan la explicación. 3.1. 3.1.1. Proceso de implementación del sistema Características del sistema Como hemos podido comprobar en la Sección 2.1, RFID se compone de tres elementos: lector, etiqueta y middleware RFID. Desde el punto de vista de este proyecto, lo más importante es la implementación particular de FSA en las comunicaciones entre el lector y las etiquetas. Por este motivo no es necesario elaborar el middleware que cualquier sistema RFID posee, pero sí es necesario implementar las otras dos partes de RFID, lector y etiquetas. De toda la funcionalidad que propone EPC, aquella que está estrictamente relacionada con el acceso de múltiples usuarios al medio es la relacionada con la operación de inventariado (ver Sección 2.1.3.2), ya que en la operación de selección únicamente “habla” el lector y en la operación de acceso la comunicación se produce entre el lector y una etiqueta en particular, después de haber tenido éxito una identificación. Por tanto de todo el conjunto de comandos que EPC regula, sólo deberemos implementar aquellos relacionados con la operación de inventariado (en concreto los comandos Query, QueryRep, QueryAdjust, ACK y NAK ). El comando Select escoge una muestra de toda la población de etiquetas al alcance del lector. Aunque no se apoya estrictamente en FSA, se ha creído 39 40 / Resultados (C. 3) Proyecto Fin de Carrera oportuno implementarlo ya que el sistema será objeto de mejoras en posteriores trabajos en la Universidad de Siegen. A modo de resumen de lo descrito hasta ahora, las características de nuestro sistema son: • Implementación de Etiqueta EPC. • Implementación de Lector EPC. • Funcionalidad de lector y etiqueta centrada en la operación de inventariado, si bien se implementa tambien la operación de selección. • Utilización de la librería GNU Radio. • Uso del lenguaje de programación Python. 3.1.2. Máquina de estados de la etiqueta En el Capítulo 2 se ha presentado el diagrama de la máquina de estados que se propone por parte del estándar (Figura 2.2). Sin embargo, esta máquina de estados contiene más funcionalidad de la necesaria, por lo que debe ser adaptada a nuestras necesidades. Utilizando las características definidas en la Sección 3.1.1 y el diagrama de estados de la Figura 2.2 construimos el diagrama de estados de nuestra etiqueta. En la Figura 3.1 se representa su diagrama UML (de las siglas en inglés de Lenguaje Unificado de Modelado). Como se puede observar el diagrama propuesto posee cuatro estados: Ready, Arbitrate, Reply y Acknowledged, que se corresponden con los estados del mismo nombre del diagrama del estándar. A continuación se detalla su funcionamiento. Estado Ready. Después de crear (encender en términos prácticos) la etiqueta, ésta va al estado Ready. Este es el estado inicial y en el que estará cuando esté en reposo y no esté participando en una ronda de inventariado. También será el estado en el que la etiqueta entrará cuando se reciba un comando Select. Las transiciones posibles, con sus correspondientes respuestas, son: • Al estado Arbitrate. Se producirá esta transición cuando se reciba el comando Query con parámetros que coincidan con los de la etiqueta, la etiqueta escoja aleatoriamente el contador de slots y éste sea distinto de 0. Esto significa que no es este el slot que la etiqueta ha elegido para responder. No se produce ninguna respuesta. Jesús Pérez Comendador Proceso de implementación del sistema / 41 [Select] [Query, with not correct SL | inventoried] [others] [power up] Ready [QueryRep, QueryAdjust with same session] invert session flag [Select] Acknowledged [Query, with correct SL & not inventoried & slot counter<>0] [Query, with correct SL & not inventoried & slot counter==0] Generate & send RN16 [QueryRep & (slot counter--)<>0] [others] Arbitrate [QueryRep & (slot counter--) == 0] [QueryAdjust (same session) & slot counter==0] Generate & send RN16 [Select] [ACK matching RN16] Reply with EPC unique id [others] slot counter = 0x8000 [ACK not matching RN16 | NAK | others] slot counter = 0x8000 [QueryAdjust (same session) & (slot counter <> 0] Reply [QueryAdjust (same session) & slot counter==0] Generate & send RN16 Nota 1: En todos los estados se podrá recibir un Query, y su funcionamiento será Ir a Arbitrate si slot counter<>0 o a Reply si slot counter==0, o bien a Ready si el Query no va dirigido a la tag (SL ó flag de sesión no en la posición exigida). Nota 2: Si se recibe un QueryRep o QueryAdjust que no son de la misma sesión se entenderá que es un comando no válido y se ignorará. Figura 3.1. Máquina de estados de la etiqueta a implementar. • Al estado Reply, cuando se reciba un Query para ella (es decir que los parámetros coincidan con los valores actuales de los indicadores), la etiqueta escoja un contador de slots y éste sea 0, es decir, la etiqueta ha elegido este slot para responder. En este caso se produce una respuesta. Ésta será devolver al lector un número aleatorio de 16 bits, llamado RN16 (ver Sección 2.1.3.6 del capítulo 2). • Quedarse en Ready. La etiqueta permanecerá en este estado cuando reciba un Query que no se dirija hacia ella, o cuando se recibe un Select para cambiar sus indicadores en vistas a una ronda de inventariado, u otros comandos. No se producirá respuesta. 42 / Resultados (C. 3) Proyecto Fin de Carrera Estado Arbitrate. Este estado es el de espera. La etiqueta permanece en este estado hasta que llegue el slot que ha elegido aleatoriamente para responder. Mientras tanto, la etiqueta decrementará en una unidad el contador de slots cada vez que llegue un QueryRep de la sesión en la que está trabajando. Las transiciones en este estado son: • Al estado Reply, cuando, tras llegar un QueryRep correcto y decrementar el contador de slots, el valor del mismo sea cero. También se produce cuando se recibe un QueryAdjust y el slot elegido para responder es el actual. En ambos casos se responderá al lector con un RN16. • Quedarse en Arbitrate, cuando, tras llegar un QueryRep con sesión correcta y decrementar el contador de slots, este sea aún distinto de cero. No se producirá respuesta. También ocurre cuando se recibe un QueryAdjust y, tras elegir aleatoriamente un slot, éste no es el actual. • Al estado Ready cuando se reciba un comando Select. No se produce respuesta. Estado Reply. Este estado recibe este nombre por ser cuando se responde al lector. Al conmutar a este estado ya se ha enviado al lector un RN16. Es ahora cuando se espera que el lector asienta la recepción. Pueden ocurrir varias transiciones desde este estado: • Al estado Acknowledged. Si el lector envía un comando ACK asintiendo la recepción del RN16 que la etiqueta envió, la etiqueta conmutará a dicho estado, produciéndose una respuesta. Esta respuesta está basada en el estándar y contiene lo siguiente: — Palabra de control del protocolo (PC). Es fija y está almacenada en la memoria EPC de la etiqueta. Contiene características de la memoria EPC, como la longitud. En nuestro caso es un valor fijo para todas las etiquetas y contiene: 0b0011000000000000. — Contenido de la memoria EPC. Ésta contiene el identificador único de la etiqueta. En nuestro caso está formado por 96 bits, 6 palabras de 16 bits, tal y como indica la palabra de control del protocolo en los primeros cinco bits. El valor de este campo dependerá de la etiqueta. — CRC-16. Es un CRC almacenado en la memoria EPC y está calculado sobre el resto de los campos del mensaje. • Al estado Arbitrate. Si el lector no envía un ACK con el RN16 que la etiqueta ha generado, significa que la etiqueta no ha podido ser seleccionada correctamente y, por tanto, deberá esperar a la siguiente ronda para poder Jesús Pérez Comendador Proceso de implementación del sistema / 43 ser identificada. En este caso el contador de slots se cargará con el valor 0x8000 y no contestará más en esta trama. También puede pasar que el lector ejecute un QueryAdjust, y en este caso, tras escoger aleatoriamente el nuevo slot donde la etiqueta quiere responder (y no es el slot actual), la etiqueta volverá al estado Arbitrate con el valor de contador de slots generado. En ambos casos no se produce respuesta. • Quedarse en Reply, si el lector envía un QueryAdjust y el valor del contador de slots generado indica que se debe contestar en este slot. La respuesta al lector será un RN16 generado por la etiqueta. Estado Acknowledged. Tras enviar la respuesta única descrita en el estado Reply, la etiqueta pasa al estado Acknowledged. Ahora espera a que se confirme la recepción de la respuesta anterior para considerar que está correctamente identificada. La etiqueta se considera correctamente identificada si se ejecuta alguno de los comandos que implica la continuación de la trama FSA (o una nueva), es decir, es una confirmación implícita. La etiqueta puede tener alguna de estas transiciones: • Al estado Ready. Cuando se recibe un comando QueryRep, o Query o QueryAdjust con la misma sesión en la que está trabajando la etiqueta. En este caso la etiqueta asume que ya está identificada y cambia su indicador de sesión al valor contrario (a B si estaba en A y viceversa). No se produce respuesta al lector. • Quedarse en Acknowledged si se recibe un comando ACK con el mismo RN16 anterior. Esto puede ser debido a que el lector no ha podido recibir correctamente (sin errores) la respuesta. En este caso se repetirá la respuesta que se realizó en la transición de Reply a Acknowledged. • Al estado Arbitrate. En otros casos. El proceso de inventariado para esta etiqueta ha fallado y ella no responderá más en esta ronda. Por ello carga su contador de slots con el valor 0x8000. El funcionamiento normal del lector no propiciará esta transición, pues procurará identificar al mayor número de etiquetas posibles y, tras un error, el lector preferiblemente repetirá el comando ACK enviado. 3.1.3. Máquina de estados del lector Al contrario que en el caso de las etiquetas EPC, el estándar no proporciona una máquina de estados que se pueda utilizar. Únicamente señala que el lector podría dividir su funcionamiento en tres operaciones, tal y como se explicó en la Sección 2.1.3.2. Como en el caso de la etiqueta, el lector no debe implementar toda la funcionalidad que el estándar desarrolla. Teniendo en cuenta las especificaciones 44 / Resultados (C. 3) Proyecto Fin de Carrera de la Sección 3.1.1 se ha elaborado una máquina de estados para el lector cuyo diagrama puede encontrarse en la Figura 3.2. [collision] NAK + QueryRep slot counter -- [no order received] (no reply) [no reply] QueryRep slot counter -- [power up] [order: start inventory round] Query + slot counter=2^Q Ready Running [order: send Select] Select [slot counter==0] (no reply) [response from tag & (slot counter--)==0] tagsIdentified++ (no reply) [unique response from a tag with RN16] ACK with RN16 from tag [response from tag & (slot counter --)<>0] tagsIdentified++ QueryRep ACK Nota: En EPC las tags no pueden emitir un mensaje si antes el lector no ha emitido un comando. Figura 3.2. Diagrama de estados UML del lector a implementar. Como se observa en la figura, se ha construido una máquina de estados con tres estados (sin incluir el inicial y final). Está máquina implementa la funcionalidad de una única ronda de inventariado. Estos estados son: Ready, Running y ACK. En breve se analizará cada uno de los estados, incluidas sus transiciones. Se ha decidido elaborar una máquina de estados con tres estados para ser coherente con la máquina de estados de la etiqueta. La operación más importante que la máquina ha de implementar es la de inventariado, con lo que todos los estados están relacionados con la misma. Tal y como se vio en la Sección 2.1.3.6, la correcta identificación de una etiqueta se produce en dos pasos, con lo que el lector EPC que se implemente deberá también tener en cuenta este aspecto. FSA se desarrolla por completo en la transición de Ready a Running y en este último estado. La demás funcionalidad es requerida por el protocolo EPC por el motivo expuesto en el párrafo anterior. Jesús Pérez Comendador Proceso de implementación del sistema / 45 Estado Ready. El lector se inicializa en este estado. Espera entonces órdenes por parte del usuario para llevar a cabo una de las operaciones, bien de selección o bien de inventariado. Las transiciones que pueden ocurrir son: • Al estado Running, cuando se recibe por parte del usuario la orden de empezar una trama FSA. En este momento se enviará a las etiquetas un comando Query con las características que el usuario determine, además de inicializar el contador de slots a 2Q . • Quedarse en Ready, cuando se recibe la orden de emitir un comando Select, es decir, una operación de selección. El lector conformará y enviará dicho comando con las opciones especificadas por el usuario. Además del caso anterior, el lector permanecerá en este estado cuando no se reciba orden alguna por parte del usuario y no producirá comando alguno. Estado Running. Este es el estado fundamental en el que transcurre la operación de inventariado. Será en este estado en el que se permanezca mientras no responda ninguna etiqueta y se abandonará por dos motivos: cuando responda una etiqueta o cuando la trama se acabe. Esto provocará sendas transiciones que se explican a continuación, junto con la permanencia en el mismo: • Al estado ACK. Cuando se produce una única respuesta por parte de una etiqueta exclusivamente, el lector deberá identificarla y, para ello, deberá conmutar a este estado y emitir un comando ACK para asentir la respuesta de la misma. • Quedarse en Running, si se produce una colisión (dos o más etiquetas respondiendo a la vez) o no contesta ninguna etiqueta. En el segundo caso el lector enviará un comando QueryRep para continuar la identificación, aparte de decrementar en una unidad el contador de slots. En el primer caso se enviará un comando NAK para indicar el error y a continuación el mismo funcionamiento que en el segundo caso. La ronda, por tanto, continuará. • Al estado final. Cuando el contador de slots vale cero la trama se ha acabado, con lo cual el lector debe terminar su funcionamiento. En esta transición no se producirá respuesta. Estado ACK. Cuando se accede a este estado es porque una etiqueta ha decidido (aleatoriamente) utilizar este slot para responder al lector. En este caso ya ha sido devuelto el RN16 que la etiqueta creó y ahora se espera (como funcionamiento normal) que la etiqueta envíe su identificación única al lector. Una vez que se recibe la misma el lector deberá anotar que ha identificado una etiqueta más y posteriormente decrementar el contador de slots. Al hacer esta operación pueden ocurrir dos cosas: 46 / Resultados (C. 3) Proyecto Fin de Carrera • Contador de slots distinto de cero. Aún no ha terminado la trama y, por tanto, la ronda deberá continuar. Por tanto se debe volver al estado Running, enviando con ello un comando QueryRep para indicar el inicio de un nuevo slot. • Contador de slots igual a cero. En este caso ha llegado el fin de la trama tras identificar a la etiqueta y el lector terminará su funcionamiento, dirigiéndose al estado final. 3.1.4. Modelo inicial de clases del sistema Hemos de implementar dos entes básicos: la etiqueta y el lector. Debido a que Python soporta el paradigma de la programación orientada a objetos, lector y etiqueta se pueden implementar como sendas clases con sus respectivos atributos. Inicialmente el modelo de clases estará formado por dos clases: Reader y Tag. En la implementación del sistema completo este modelo irá cambiando para adaptarse a los requisitos que se van exigiendo en cada fase. Nuestro modelo de clases inicial se puede encontrar en la Figura 3.3. 3.1.5. Implementación de la clase Tag Tras definir los requisitos del sistema y la máquina de estados que desarrollará la funcionalidad de la etiqueta, es hora de implementar dicha máquina en el lenguaje de programación Python. Esta primera implementación será la base sobre la que se trabaje en una posterior encapsulación en los bloques de GNU Radio. Es por ello que la misma deberá respetar los requisitos para trabajar con dicha librería. Las comunicaciones entre etiquetas y lector deben utilizar alguno de los tipos soportados por GNU Radio para el mecanismo de paso de mensajes. Dado que el lector elabora y envía comandos, que no son más que un conjunto de bits, y la etiqueta responde con el identificador temporal (RN16) o su memoria EPC, que también son un conjunto de bits, el tipo de dato que mejor se adapta de todos ellos es el ndarray de NumPy (ver Sección 2.4) cuyo contenido son números enteros de 8 bits, cada uno de ellos representando un bit. La etiqueta debe ser capaz de interpretar y reaccionar ante los comandos del lector correspondientes a las operaciones de selección e inventariado. Por tanto los comandos que la etiqueta entenderá serán: Select, Query, QueryRep, QueryAdjust, ACK y NAK. Jesús Pérez Comendador Proceso de implementación del sistema / 47 Reader Tag +S: bool[] +SL: bool +state: int +name: str +Q: int +slotCounter: int +session: int +selected: bool +RN16: int[] +EPCbank: int[] +truncate: bool +pointer: int +ACTION:function[] +noAction(int[]):None +select(int[]): None +query(int[]): int[] +newRound(): int[] +acknQuery(int[]):int[] +replyQuery():int[] +queryRep(int[]):int[] +toReady(int[]): None +qAdjToReady(int[]):None +returnArbitrate(int[]):None +queryAdjust(int[]): int[] +ack(int[]):int[] +nak(int[]):int[] +receive(int[]):int[] +Q: int +session: int +slotCounter: int +state: int +select: int[] +target: bool tagsIdentified: int ACTION: function[] +getTagsIdentified(): int +selectCommand (int,int[],int[],int[],int,int[],bool): int[] +query(): int[] +queryRep(): int[] +queryAdjust(int,int,int): int[] +ack(int[]):int[] +nak(): int[] +noAction() +state_Ack(int[]): int[] +continueRound(): int[] +start(int[]): int[] +receive(int[]): int[] Figura 3.3. Diagrama inicial de clases UML del sistema. Para llevar a cabo su funcionamiento, la etiqueta necesita una serie de atributos que guarden algún dato importante entre interacciones, así como datos de la ronda en la que se está participando. Estos son: • Nombre de la etiqueta. Dato importante para el mecanismo de paso de mensajes de GNU Radio, como identificador del mensaje. • Indicadores de sesión. Descrito en el estándar. • Indicadores SL. También descrito en el estándar. 48 / Resultados (C. 3) Proyecto Fin de Carrera • Participación o no en esta ronda. Mediante este indicador la etiqueta recordará si cumple las condiciones impuestas por el lector para participar en esta ronda. • Sesión actual. Si se está participando en una ronda de inventariado, la etiqueta necesita saber en todo momento en qué sesión está trabajando, para así comprobar el indicador de la sesión correspondiente. • Q. El parámetro que configura el tamaño de la trama FSA debe ser guardado por si se recibe un comando QueryAdjust y se necesita modificarlo. • Contador de slots. Contiene el número de slots restantes para que la etiqueta responda. • RN16. Cada vez que se genera un RN16 y se envía debemos guardarlo para compararlo con el asentimiento por parte del lector. • Memoria EPC. Contiene el identificador único de la etiqueta, según indica el estándar. • Mecanismo de truncado de la respuesta. Si se ha activado el truncado de la respuesta por parte del lector hará falta recordar que así ha sido, además de la dirección a partir de la cual se enviará el contenido de la memoria EPC. • Estado actual de la etiqueta. Como en toda máquina de estados la respuesta dependerá, entre otros, del estado en el que se encuentra. Según puede observarse en la Figura 3.3 las etiquetas disponen de un método receive, que requiere como parámetro un ndarray de enteros y devuelve otro ndarray de enteros. Este método es el único encargado de procesar los comandos que llegan a la etiqueta y realizar la acción necesaria tras comprobar, entre otras cosas, el estado en que se encuentra y qué comando ha llegado, así como devolver una respuesta si procede. Por tanto podríamos decir que es el método más importante porque dirige el funcionamiento de toda la etiqueta. El método devuelve un ndarray con la respuesta que deberá ser redirigida al lector, o bien None para indicar que no se quiere comunicar nada al lector (es decir, no ha llegado el slot elegido para responder). El funcionamiento del método es el siguiente. En primer lugar se identifica y valida (comprobando el CRC, si procede) el comando recibido. En el caso de haber podido identificar y validar correctamente el comando se llama al método específico que procesa ese comando en el estado en el que la etiqueta se encuentra. Los métodos encargados de cada uno de los casos están listados en un atributo de la clase, una matriz NumPy llamada ACTION, de tal forma que cada fila representa un estado y cada columna un comando (ACTION es una matriz con Jesús Pérez Comendador Proceso de implementación del sistema / 49 punteros a funciones, mecanismo ampliamente utilizado en Python). Para hacer este mecanismo posible a cada uno de los estados se le asigna un identificador numérico correlativo de manera que puedan servir de índices de las filas (de la misma forma se procede con los comandos para las columnas). Por último se recoge la respuesta que se ha obtenido del método y se devuelve al llamante de receive. 3.1.6. Desarrollo de una primera versión del paso de mensajes y comunicación manual con las etiquetas En este quinto punto del proceso de implementación ya se tiene una etiqueta programada siguiendo el estándar y las características descritas en la Sección 3.1.1. Sin embargo, sus funciones no pueden ser ejecutadas en solitario. Esto es así por dos motivos: primeramente porque están programadas en una clase Python que no es posible ejecutar; segundo, por especificación del estándar, las etiquetas esperan continuamente a recibir comandos desde el lector, con lo que no efectuarán ninguna operación a no ser que sea precedida por la recepción de un comando. Llegados a este punto, para probar el funcionamiento de las etiquetas es necesario construir un programa en el que se desarrolle un primer paso de mensajes a todas las etiquetas que se creen. Los comandos serán creados por el usuario mediante la línea de comandos y enviados tal cual hacia las etiquetas, que responderán (si procede) y este sistema devolverá por pantalla la respuesta al comando. En concreto esta primera versión del programa tendrá el siguiente funcionamiento: 1. Creación de las etiquetas. Se pregunta al usuario por el número de etiquetas que desean ser creadas y son instanciados los objetos Tag. 2. Se entra en un bucle infinito en el que se solicitará un comando. 3. Cuando el usuario introduzca un comando, éste se enviará secuencialmente a cada Tag para que sea procesado y devuelva una respuesta (si procede). 4. Cuando se termina de enviar el comando y recibir las respuestas, se analizan las mismas. Si ha habido una respuesta única, ésta se muestra por pantalla. Si ha habido colisión se le hace saber al usuario que así ha ocurrido, mediante un comando genérico indicador de colisión. Si no ha habido ninguna respuesta también se mostrará por pantalla. 5. Se vuelve al punto 3. 50 / Resultados (C. 3) Proyecto Fin de Carrera Como se puede observar en el esquema de funcionamiento anterior no utilizamos ningún tipo de mecanismo de paralelización, sino que las etiquetas son objetos residentes en memoria y el hilo de ejecución entra en cada una de ellas, efectúa las operaciones necesarias y se dirige a otra etiqueta. Esto será una de las diferencias básicas de funcionamiento interno cuando se encapsule en bloques de la librería GNU Radio. A continuación se presenta un ejemplo de uso de esta primera versión del programa. Type the number of tags: 3 Tags ready Please input a command (Ctrl+C to end): 1000000000000000111001 Tag 0 received QUERY Tag 0 participates now in session S0 with slotCounter=0 Tag 0 slotCounter==0!! Entering reply state. RN16 Response from: Tag 0 [1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1] Tag 1 received QUERY Tag 1 participates now in session S0 with slotCounter=1 Tag 1 slotCounter==1 Response from: Tag 1 None Tag 2 received QUERY Tag 2 participates now in session S0 with slotCounter=1 Tag 2 slotCounter==1 Response from: Tag 2 None Response to command ->> [1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1] Please input a command (Ctrl+C to end): 011100101110001001 Tag 0 received ACK Tag 0 sending EPC memory... Response from: Tag 0 [0 0 1 1 0 0 0 (...) 0 0 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1] Tag 1 received ACK Tag 1 ignoring ACK... Response from: Tag 1 None Tag 2 received ACK Tag 2 ignoring ACK... Response from: Tag 2 None Response to command ->> [0 0 1 1 0 0 0 (...) 0 0 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1] Please input a command (Ctrl+C to end): 0000 Tag 0 received QUERYREP Tag 0 returning to ready [1] [2] [3] [4] Jesús Pérez Comendador Proceso de implementación del sistema / 51 Response from: Tag 0 None Tag 1 received QUERYREP Tag 1 slotCounter==0!! Entering reply state. RN16 Response from: Tag 1 [1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1] Tag 2 received QUERYREP Tag 2 slotCounter==0!! Entering reply state. RN16 Response from: Tag 2 [1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0] Response to command ->> [1 1 1 1 1 1 1 1] Please input a command (Ctrl+C to end): 1000000000000000111001 Tag 0 received QUERY Tag 0 does not participate Response from: Tag 0 None Tag 1 received QUERY Tag 1 participates now in session S0 with slotCounter=0 Tag 1 slotCounter==0!! Entering reply state. RN16 Response from: Tag 1 [1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1] Tag 2 received QUERY Tag 2 participates now in session S0 with slotCounter=1 Tag 2 slotCounter==1 Response from: Tag 2 None Response to command ->> [1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1] (...) Please input a command (Ctrl+C to end): ^CEnding program... [5] [9] Las interacciones con el usuario están marcadas con un número entre corchetes a la derecha. Este ejemplo reproduce una identificación satisfactoria de tres etiquetas en dos tramas (como se ordena en la primera interacción), hecha de forma manual, pues el usuario es el encargado de la creación y conformación de los comandos. Una vez creadas las 3 etiquetas, el programa pide un comando. El primer comando emitido por el usuario (en la interacción 2) es un comando Query, con estos parámetros: Sel Session No importa SL S0 Target A Q 1 Con lo que las etiquetas habrán recibido la orden de empezar una ronda de inventariado con un tamaño 2Q = 21 = 2 slots, en la que participarán todas aquellas cuyo indicador de sesión S0 esté en la posición ‘A’. La Tag 0 ha decidido contestar en este mismo slot (puesto que su contador de slots es igual a 0), mientras que las otras dos han elegido el otro slot. El usuario recibe como respuesta un RN16 de la Tag 0. 52 / Resultados (C. 3) Proyecto Fin de Carrera A continuación el programa pide otro comando en la interacción 3. Para seguir el funcionamiento del estándar el usuario ha decidido asentir el RN16 que le ha llegado. En este caso la Tag 0 responde con el contenido de su memoria EPC, mientras que las demás ignoran el comando. Esta etiqueta se silenciará y no participará más en la ronda. En la interacción cuarta con el usuario, éste decide enviar un comando QueryRep en la sesión S0. La etiqueta 0 no responderá, pues está correctamente inventariada, pero sí que internamente cambiará su indicador de sesión a ‘B’. Las etiquetas 1 y 2 aún están sin inventariar, con lo que decrementarán el contador de slot y responderán a este comando. Como lo hacen a la vez se produce una colisión, con lo que el usuario no puede recibir nada coherente. En este momento la trama se ha acabado. Si el usuario desea puede volver a empezar una nueva. Es esto precisamente lo que hace el usuario en la interacción quinta. Se vuelve a lanzar un comando Query con los mismos parámetros. Podemos observar que la etiqueta 0 no participa en la nueva ronda, pues su indicador de inventariado está en la posición ‘B’y el comando se dirige a las que lo tienen en ‘A’. El programa termina a petición del usuario en la interacción 9. Por sencillez se ha decidido cortar los mensajes hasta esta interacción, pues sólo se pretende dar una visión general del programa. El proceso que tiene lugar entre medias es la correcta identificación de ambas etiquetas, de manera análoga a la identificación de la Tag 0. 3.1.7. Implementación de la clase Reader La interacción manual con las etiquetas no es suficiente para cumplir los requisitos del sistema, pero es una buena aproximación del usuario al funcionamiento del estándar EPC. Según la metodología del presente proyecto, el siguiente paso es implementar el lector EPC, de manera que el sistema pueda funcionar sin la acción del usuario. El diagrama de estados que se diseñó para el lector EPC (Fig. 3.2) sólo es capaz de implementar una ronda de inventariado. Es misión del control de la aplicación empezar las rondas de inventariado según se considere oportuno. Como se puede observar en el diagrama de clases de la Figura 3.3, el lector contiene también atributos, ya que debe guardar algunos datos necesarios entre interacciones, dentro de la misma ronda. Estos atributos consiguen guardar información tan importante como: Jesús Pérez Comendador Proceso de implementación del sistema / 53 • Parámetros de la trama FSA, como Q, la sesión en la que el lector actuará, la posición del indicador de sesión al que se dirige, o cómo se tiene en cuenta el indicador SL. Todos ellos servirán para crear el comando Query que empezará la trama. Además Q se guarda por un posible QueryAdjust (además de para poder inicializar el contador de slots) y la sesión para marcar el inicio de cada slot con QueryRep. • Contador de slots. La trama tiene un tamaño de 2Q slots. El lector deberá saber cuándo ésta se acaba para no seguir mandando QueryRep. • Estado actual. Se debe recordar el estado en el que el lector está porque el comando que se ejecute y el procesado de las respuestas que llegan dependen de dicho estado. • Número de etiquetas identificadas. Con el propósito de informar al usuario de cuántas etiquetas han sido identificadas en la ronda, el lector mantendrá un contador que incrementará en una unidad cada vez que se reciba el identificador único de una etiqueta. Como en el caso de la etiqueta, el lector EPC debe utilizar para los mensajes alguno de los tipos de dato que GNU Radio soporta para el paso de mensajes. Para respetar la implementación que se ha hecho de la etiqueta, el lector utilizará también ndarrays para contener los bits del comando que se desee enviar. Del mismo modo también esperará respuestas basadas en este mismo tipo de array. El lector debe ser capaz de construir y enviar los comandos Select, Query, QueryRep, QueryAdjust, ACK y NAK, correspondientes a las operaciones de selección e inventariado del estándar EPC —como se definió en la Sección 3.1.1— así como saber procesar las respuestas que recibirá de las etiquetas. El funcionamiento del lector sigue un esquema muy parecido al de las etiquetas. Como se puede ver en la Figura 3.3 también dispone de un método receive. Cada vez que el control tenga un mensaje que entregar al lector invocará este método. Dependiendo del estado en el que el lector se encuentre procesará la respuesta (el comando que corresponda) y la devolverá a través de dicha función. Cuando no se ha recibido ninguna respuesta de las etiquetas, o bien es el inicio de la ronda, el control llamará a la función receive con el mensaje igual a None. El control de la acción que debe ejecutar el lector cuando recibe una respuesta (o None) dependiendo del estado en que se encuentre reside en el atributo ACTION , un vector NumPy cuyo contenido son punteros a funciones, de manera análoga al caso de la etiqueta. 54 / Resultados (C. 3) 3.1.8. Proyecto Fin de Carrera Conexión de etiqueta y lector. Funcionamiento en modo automático El lector, en teoría, puede funcionar aunque no existan etiquetas, pues lanzará sus comandos pero no recibirá respuestas. Sin embargo la implementación realizada en este proyecto precisa de un control externo que le indique al lector cuándo empezar y le entregue las respuestas de las etiquetas. En este paso se creará dicho control y además se unirá el sistema para tener un lector y un número variable de etiquetas con posibilidad de comunicación entre ellos. Podríamos decir que una vez implementado dicho control, se obtiene un sistema completamente funcional y totalmente conforme con los requerimientos (salvo en un aspecto, ya que no utiliza la librería de GNU Radio). A continuación se describe el funcionamiento del control de la aplicación. En la anterior versión del programa no se habló de control pero existía uno, al menos implícitamente, dentro del programa principal. Se encargaba de la creación de las etiquetas, así como de “enviar” el mensaje que el usuario escribía a las etiquetas de forma secuencial. En esta versión se añade el lector, que permite identificar las etiquetas de forma automática (el usuario sólo tendrá que ejecutar el programa principal y elegir el número de etiquetas). El control incorporará una nueva característica: será el encargado de decidir cuándo acabar el proceso, pues será el encargado de iniciar el lector cada vez que se necesite una ronda de inventariado. El control no guardará información sobre el número de etiquetas que existen, implementará un algoritmo de parada que consiste en evaluar las colisiones producidas en cada ronda. Si se produce una o varias colisiones, mandará iniciar otra ronda, puesto que existen etiquetas que quieren responder y no han podido. Sin embargo, si no se produce ninguna, significa que todas las etiquetas presentes han contestado ya satisfactoriamente y están silenciadas. Adicionalmente en esta versión se da la posibilidad al usuario de desactivar este algoritmo, de tal forma que él sea quien ejecute el control del inventariado de las etiquetas. Esta opción recibe el nombre de semiautomática, pues el usuario no tiene que elaborar los comandos, pero decidirá cuándo se empieza una nueva trama y cuándo se interrumpe el proceso. A continuación se ofrece un ejemplo de uso del programa en su modo automático. Jesús Pérez Comendador Proceso de implementación del sistema / 55 Type the number of tags: 3 Tags ready Select one option 1.-Manual 2.-Semi-Automatic 3.-Full Automatic 4.-Select ---> 3 Reader ready for new round ------------------------>Reader is in state: 0 Loop with command: [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1] Tag 0 received QUERY Tag 0 participates now in session S0 with slotCounter=1 Tag 0 slotCounter==1 Response from: Tag 0 None Tag 1 received QUERY Tag 1 participates now in session S0 with slotCounter=0 Tag 1 slotCounter==0!! Entering reply state. RN16 Response from: Tag 1 [1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0] Tag 2 received QUERY Tag 2 participates now in session S0 with slotCounter=0 Tag 2 slotCounter==0!! Entering reply state. RN16 Response from: Tag 2 [1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1] Response to command ->> [1 1 1 1 1 1 1 1] ------------------------>Reader is in state: 1 Loop with command: [1 1 0 0 0 0 0 0] Tag 0 received NAK Tag 0 ignoring command... Response from: Tag 0 None Tag 1 received NAK Tag 1 ACK not received. Returning to arbitrate... Response from: Tag 1 None Tag 2 received NAK Tag 2 ACK not received. Returning to arbitrate... Response from: Tag 2 None Response to command ->> None ------------------------>Reader is in state: 1 Loop with command: [0 0 0 0] Tag 0 received QUERYREP Tag 0 slotCounter==0!! Entering reply state. RN16 Response from: Tag 0 [0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1] Tag 1 received QUERYREP 56 / Resultados (C. 3) Proyecto Fin de Carrera Tag 1 slotCounter==32767 Response from: Tag 1 None Tag 2 received QUERYREP Tag 2 slotCounter==32767 Response from: Tag 2 None Response to command ->> [0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1] ------------------------>Reader is in state: 1 Loop with command: [0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1] Tag 0 received ACK Response from: Tag 0 [0 0 1 1 0 0 0 (...) 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1] Tag 1 received ACK Tag 1 ignoring ACK... Response from: Tag 1 None Tag 2 received ACK Tag 2 ignoring ACK... Response from: Tag 2 None Response to command ->> [0 0 1 1 0 0 0 (...) 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1] ------------------------>Reader is in state: 2 ------------------------>1 more tag identified ------------------------>1 tags identified this round Reader ready for new round (...) ------------------------>2 tags identified this round Control ending process... No collisions occured 3 TAGS IDENTIFIED IN 2 ROUNDS. Se puede comparar la ejecución de esta versión con la mostrada en la Sección 3.1.6. También se trata del proceso de identificación de 3 etiquetas con los mismos parámetros de la trama que en la ejecución pasada (Sesión 0, no importa el valor de SL, Q=1 y estado del indicador de sesión ‘A’), pero esta vez de forma automática, es decir, sin intervención del usuario en la ronda. Si se observa esta ejecución se comprobará que las etiquetas se comportan de la misma forma (puesto que ya estaban implementadas anteriormente) pero ahora el usuario no teclea los comandos, sino que la nueva clase Reader se encarga de ello. Además el control se encarga de la ejecución del algoritmo de parada. En la primera trama se producen colisiones, con lo que el control decide llevar a cabo otra ronda. Sin embargo al terminar la segunda el control ha decidido finalizar el proceso, ya que no se ha producido niguna colisión. Jesús Pérez Comendador 3.1.9. Proceso de implementación del sistema / 57 Versión final: encapsulación en GNU Radio y nuevo paso de mensajes La versión del programa propuesta en la Sección 3.1.8 consigue mostrar el funcionamiento de la capa de identificación de las etiquetas descrito en el protocolo EPC, sin la operación de acceso (pues no es relevante para demostrar el funcionamiento de FSA). El lector es capaz de empezar una trama y desarrollarla emitiendo los inicios de slots correspondientes. Podemos decir que la lógica del programa está concluida. El trabajo llevado a cabo en este paso consiste en adaptar la lógica desarrollada a GNU Radio, con vistas a futuras ampliaciones, según se explica en el capítulo de Conclusiones. Para convertir el programa en una aplicación que utilice las ventajas de la librería de GNU Radio debemos cambiar la estructura del mismo, al menos en lo que respecta al diagrama de clases. Además supondrá un cambio en la forma de ejecución, pues antes existía un único hilo que se encargaba de todo, mientras que ahora las entidades se ejecutarán en hilos separados. La unidad básica de GNU Radio es el bloque. Para poder utilizar la librería el lector y las etiquetas deberán ser, por tanto, bloques de GNU Radio. El sistema en su conjunto deberá representar un grafo de flujo, indicando a GNU Radio los bloques que existirán y las conexiones entre ellos (ver Sección 2.3.3). Existen una serie de problemas a los que nos tenemos que enfrentar en esta fase del desarrollo: • Encapsular lector y etiqueta en sendos bloques de GNU Radio. • Adaptar ambos a un nuevo mecanismo de paso de mensajes. • GNU Radio no permite la conexión de múltiples salidas a una única entrada. • Elaboración del grafo. En la primera tarea debemos cambiar la definición de cada una de las clases. Para que lector y etiqueta se conviertan en un bloque de GNU Radio cada una éstas deberán heredar de Block, la clase que proporciona GrExtras para poder escribir bloques en Python. Además de heredar de Block, lector y etiqueta deberán llamar al constructor de la clase madre con los siguientes parámetros: • Nombre del bloque. Servirá como identificador de la instancia del bloque. • Número de entradas y salidas tradicionales. Para comunicación mediante muestras, a la manera tradicional de GNU Radio. 58 / Resultados (C. 3) Proyecto Fin de Carrera • Número de puertos de entrada y de salida para mensajes. Para la comunicación mediante mensajes, tal y como introduce GrExtras. El último requisito es que el bloque sobreescriba el método work() de la clase madre. Este método work() deberá ser el “método principal”, es decir, quien controle el funcionamiento del bloque. Tal y como explicamos en la Sección 2.3.5.3, el mecanismo de paso de mensajes que GrExtras proporciona permite comunicaciones entre dos bloques abstrayendo al usuario del flujo de datos, pudiendo enviar objetos completos entre bloques y no sólo muestras (el funcionamiento tradicional de GNU Radio). Los mensajes contienen estos campos: • El campo key es un identificador único del tipo de contenido. • value es el mensaje en sí que se desea intercambiar. • Opcionalmente se puede indicar un campo srcid que identifica de manera única al emisor del mensaje. El bloque dispone de dos métodos (heredados de la clase madre) que son pop_msg_queue() y post_msg(). El primero recibirá un mensaje y el segundo lo enviará. En GrExtras la acción de recibir es bloqueante, no así la de envío. Englobando las dos tareas, el incluir GNU Radio influirá en el funcionamiento de los bloques en buena medida. Actualmente el control era el encargado de entregar los mensajes a cada entidad, si bien ahora los bloques deberán recoger los mensajes por sí mismos, procesarlos y enviarlos también por sus propios medios. Se ha decidido que el método work() de cada bloque incluya la funcionalidad que antes se reservaba al control del programa. De esta forma el método work de la etiqueta tendrá el siguiente funcionamiento dentro de un bucle infinito: 1. Se recibe un mensaje. Hasta que no se reciba un mensaje la etiqueta se queda bloqueada. 2. Se deserializa el mensaje y se llama al método receive con el comando. 3. La respuesta obtenida de dicho método se mete en un mensaje. 4. El mensaje se envía de vuelta. Jesús Pérez Comendador Proceso de implementación del sistema / 59 El proceso se repite hasta que se reciba desde el lector un mensaje de finalización, simulando la pérdida de corriente que ocurriría cuando el lector se desconectara en el sistema real (y por consiguiente dejara sin alimentación a las etiquetas). Para el caso del lector, el método work incluirá la funcionalidad siguiente en un bucle: 1. Si está en el estado Ready, iniciar la ronda sin recibir mensaje. 2. Si está en otro estado menos End, recibir mensaje. 3. Llamar al método receive con la respuesta, o bien con None si se está empezando la ronda. 4. La respuesta obtenida de receive se mete en un mensaje. 5. El mensaje se envía a las etiquetas. Cuando el estado es End, se saldrá del bucle y se enviará a las etiquetas el mensaje de finalización. La ronda se considerará entonces terminada. El tercer aspecto que se debe resolver es que GNU Radio no soporta que múltiples salidas se conecten a una misma entrada (una salida en varias entradas de varios bloques sí es posible). Este problema ocurre cuando se tiene que conectar el puerto de salida de todas las etiquetas al puerto de entrada del lector. Para resolver esta situación se ha optado por implementar un bloque llamado Control que combine las respuestas de todas las etiquetas y envíe al lector por un único puerto la respuesta apropiada a cada comando. La solución se ha planteado de esta forma para que el lector no dependa del número de etiquetas que se hayan creado. Dicho bloque tendrá tantas entradas como etiquetas más una para recibir los comandos del lector. El bloque estará sincronizado con el lector, de tal forma que conozca el inicio de cada slot. En cada slot dicho bloque esperará la recepción de las respuestas por parte de las etiquetas: si se ha producido más de una avisará con el mensaje de colisión al lector; si sólo ha habido una respuesta se la enviará al lector sin cambios. El último detalle que se debe resolver es elaborar el grafo de flujo de GNU Radio, es decir, el grafo de conexión de los bloques entre sí. En la Figura 3.4 se representa cómo debe ser la conexión para que el sistema funcione. En dicho grafo existen N bloques representando a N etiquetas, un bloque de control y un bloque que representa al lector. Los puertos de salida de todas 60 / Resultados (C. 3) Proyecto Fin de Carrera Control Reader . . . Tag 0 . . . Tag 1 . . . Tag N-1 Figura 3.4. Grafo de conexión de los bloques. las etiquetas están conectados al bloque de control. El bloque de control se conectará al puerto de entrada del lector. La salida del lector debe conectarse con las entradas de las N etiquetas y con una de las entradas del bloque de control. El grafo de GNU Radio debe estar escrito en Python. Para que incluya la funcionalidad de la librería debe heredar de una clase llamada top_block, una especie de bloque superior que englobará los bloques que se deseen instanciar en el diseño. Dentro del constructor de la subclase se deberán instanciar los diferentes bloques y se deberán conectar mediante el método connect las diferentes instancias creadas, de la manera deseada. El grafo creado es la unidad ejecutable de GNU Radio. La ejecución puede ser controlada por el programa principal en todo momento, mediante llamadas bloqueantes o no bloqueantes. El programa principal implementará la lógica de parada del sistema siguiendo el algoritmo expresado en la Sección 3.1.8. Además se ha hecho uso de la librería estándar de Python para que el usuario pueda pasar las opciones por línea de comandos, directamente en la llamada al programa. Las opciones que puede elegir son: número de etiquetas, Q, sesión, Target y si se debe tener en cuenta el indicador SL (y cómo) o no. En definitiva Jesús Pérez Comendador Proceso de implementación del sistema / 61 puede configurar la ronda de inventariado según sus necesidades. También puede elegir si el programa debe mostrar por pantalla más información (opción --verbose) o no (opción --quiet). La opción --help muestra un mensaje de ayuda sobre cómo utilizar el programa. A continuación reproducimos un ejemplo de uso del programa en esta versión final. Como en los ejemplos de las versiones anteriores, se trata de un sistema formado por tres etiquetas y un lector en el que se pretenden identificar todas ellas utilizando tramas de tamaño 2. Se incluye también la línea del intérprete de comandos donde se llama al programa para que se pueda comprobar la funcionalidad explicada en el párrafo anterior. jesuspc@jesuspc-linux:~$ ./main.py -Q1 -n3 linux; GNU C++ version 4.6.3; Boost_104601; UHD_003.004.002-128-g12f7a5c9 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + Proyecto Fin de Carrera - Jesús Pérez Comendador + + Ing. Telecomunicación-LADE + + Universidad Rey Juan Carlos - Universität Siegen + + Welcome to the program + ++++++++++++++++++++++++++++++++++++++++++++++++++++ Top block: Starting inventory rounds 1 tags identified this round. Top block: Starting new round 2 tags identified this round. No collisions... Ending... Summary: -------------------------------Tags identified: 3 in 2 rounds Number of slots: 4 En el resumen del final podemos ver que se han identificado las tres etiquetas en dos rondas, cada una de dos slots, lo que hacen cuatro slots en total. La primera línea es mostrada por la librería GNU Radio en el momento de importarla. Los mensajes en el medio muestran la evolución de cada ronda, cuántas etiquetas se han identificado en cada una. Si se desea se puede activar la opción --verbose y se mostrarán los mensajes que se mostraban en las anteriores versiones. Tras un largo proceso de implementación se puede concluir que la funcionalidad deseada está ya implementada. En las próximas secciones de este capítulo se 62 / Resultados (C. 3) Proyecto Fin de Carrera describirá el modelo de clases final resultante, la estructura del código Python, así como los resultados de las pruebas realizadas para comprobar el funcionamiento de FSA. 3.2. Modelo de clases del sistema final Con respecto al diagrama de clases inicial (expuesto en la Figura 3.3) se han producido numerosas diferencias, provocadas en mayor medida por la introducción de GNU Radio en la última fase de la implementación. El nuevo diagrama de clases se puede encontrar en la Figura 3.5. El programa lleva a cabo su funcionamiento mediante cinco clases. Estas clases son: Tag, Reader, ControlBlock, TopBlock y MyProject. La ejecución del programa empieza por instanciar la última de ellas, MyProject, con los parámetros que configurarán las tramas FSA, así como el número de etiquetas que se desean crear. Su método main() se encargará de desarrollar el algoritmo de control que regulará las rondas de inventariado, actuando sobre el funcionamiento de TopBlock. La clase TopBlock representa el grafo de GNU Radio. Contiene métodos heredados que posibilitan el control de la ejecución del mismo, como puede ser arrancar el grafo, pararlo, esperar a que todos los bloques estén listos, etc. Las clases Tag, Reader y ControlBlock representan los tres tipos de bloques que se encuentran en nuestro programa. Serán instanciados por TopBlock y conectados según marca el grafo de la Figura 3.4. Las tres clases están relacionadas entre sí puesto que todas envían y reciben clases de las demás, como explicamos en la sección anterior. En el Apéndice A se puede encontrar una descripción detallada de cada atributo y método de todas las clases. 3.3. Características del código Python implementado Al describir el lenguaje de programación Python en el Capítulo 2, una de las características que se describió es que es multiparadigma, permitiendo al programador utilizar varios estilos. En este proyecto la mayoría de la implementación se lleva a cabo mediante objetos, si bien alguna otra característica se ha programado utilizando programación imperativa. Jesús Pérez Comendador Características del código Python implementado / 63 gr.top_block TopBlock MyProject +Q: int +SESSION_READER:int +SEL: int[] +target: bool +ntags: int +verbose: bool +lock: Lock +reader_instance: Reader +controlModule: ControlBlock +tags: Tag[] +main() gr.block ControlBlock Reader Tag +Q: int +session: int +slotCounter: int +state: int +select: int[] +target: bool +tagsIdentified: int +collisions: bool +lock: Lock +verbose: bool ACTION: function[] +S: bool[] +SL: bool +state: int +name: str +Q: int +slotCounter: int +session: int +selected: bool +RN16: int[] +EPCbank: int[] +truncate: bool +pointer: int +lock: Lock +verbose: bool +ACTION:function[] +noAction(int[]):None +select(int[]): None +query(int[]): int[] +newRound(): int[] +acknQuery(int[]):int[] +replyQuery():int[] +queryRep(int[]):int[] +toReady(int[]): None +qAdjToReady(int[]):None +returnArbitrate(int[]):None +queryAdjust(int[]): int[] +ack(int[]):int[] +nak(int[]):int[] +receive(int[]):int[] +work(int[],int[]):int +n: bool[] +lock: Lock +verbose: boolean +messages: dict +isUniqueResponse(): bool +reset_control() +work(int[],int[]):int +isReaderFinished(): bool +wereCollisions(): bool +getTagsIdentified(): int +getStateReader(): int +selectCommand (int,int[],int[],int[],int,int[],bool): int[] +query(): int[] +queryRep(): int[] +queryAdjust(int,int,int): int[] +ack(int[]):int[] +nak(): int[] +noAction() +state_Ack(int[]): int[] +continueRound(): int[] +start_inventory(int[]): int[] +receive(int[]): int[] +reset_reader() +work(int[],int[]):int Figura 3.5. Diagrama de clases UML final. (La explicación del mismo se puede encontrar en el Apéndice A). 64 / Resultados (C. 3) Proyecto Fin de Carrera El código Python resultante está estructurado en seis módulos: 1. main. Contiene las clases TopBlock y MyProject, además del código necesario para incorporar los argumentos que se indican por línea de comandos. 2. tag. Contiene la clase Tag, la etiqueta. 3. reader. Contiene la clase Reader, el lector. 4. control. Contiene la clase ControlBlock. 5. utils. Contiene funciones auxiliares que aportan funcionalidad necesaria para Tag y Reader, relacionadas con el CRC (cálculo y chequeo del CRC de los comandos) y la conversión de enteros a arrays de NumPy (y viceversa). 6. constants. Contiene constantes utilizadas por todos los módulos y clases. La implementación necesita adicionalmente de la librería estándar de Python, así como de las librerías NumPy, GNU Radio y GrExtras para su funcionamiento. 3.4. Pruebas realizadas Para concluir con este capítulo de Resultados, procedemos a analizar precisamente los resultados de la implementación. Según se describe en la Sección 3.1.9, la versión final del programa muestra por pantalla datos sobre el proceso de identificación de las etiquetas, como son el número de etiquetas identificadas y el número de rondas completadas, incluso el número de slots marcados. Estos datos son de interés para evaluar el comportamiento de FSA en el transcurso de la operación de inventariado. La medida de los resultados de la implementación supondrá contrastar el funcionamiento de la misma con el modelo teórico de este esquema de acceso al medio. Tal y como se describió en el Capítulo 2, FSA establece que las etiquetas no respondan inmediatamente al lector, sino que se escoge aleatoriamente un slot para emitir la respuesta. Para evaluar nuestra implementación del estándar EPC en términos de cumplimiento del esquema FSA debemos simular este comportamiento mediante algún software matemático, como MATLAB. La simulación realiza un procedimiento muy sencillo: dado un determinado número de etiquetas (N) y un determinado Q, tal que el tamaño de la trama es 2Q , el script deberá generar tantos números aleatorios como etiquetas haya. Posteriormente deberá contar los números que hayan aparecido una única vez (es decir, respuestas únicas) y restar el resultado a N (sería como silenciar las etiquetas que hayan sido correctamente identificadas). Se repetirá el proceso Jesús Pérez Comendador Pruebas realizadas / 65 hasta que N sea igual a cero, puesto que se ha llegado al final del proceso y no hay más etiquetas pendientes de identificación. De este proceso se obtendrá el número de iteraciones que se han debido realizar hasta que no han quedado más etiquetas por identificar, es decir, el número de tramas en términos de FSA. El resultado del sistema, y también de la simulación, depende de dos parámetros: cuántos participantes haya (es decir, número de etiquetas) y cómo de grande sea el intervalo para responder (es decir, tamaño de la trama). Cabe esperar que con un tamaño de trama fijo, a más etiquetas mayor número de colisiones, pues más etiquetas se reparten el mismo número de slots, con lo que el número de tramas necesarias aumentará. Por otro lado si mantenemos el número de etiquetas constante, a mayor tamaño de trama esperaremos menor número de colisiones, pues las etiquetas tendrán más slots para elegir, con lo que el número de ellas disminuirá. Para comprobar ambos comportamientos se ha estudiado la dependencia del resultado para cada una de las variables. Es decir, se han llevado a cabo dos estudios independientes cuyos fines son: 1. Estudio de la influencia del número de etiquetas en el número de tramas para un tamaño de trama constante. 2. Estudio de la influencia del tamaño de la trama en el número de tramas para identificar una población de etiquetas fija. 3.4.1. Primer estudio. Influencia del número de etiquetas En el primer estudio se analizará la evolución del número de tramas variando el número de etiquetas existentes, con un valor fijo del tamaño de la misma. Se han recogido resultados para dos valores de Q, 4 y 5. En las Tablas 3.1 y 3.2 se pueden observar los resultados obtenidos. En ambas tablas se muestran los valores de la simulación con MATLAB y los obtenidos con el programa implementado. Se ofrece una representación gráfica de ambas tablas en la Figura 3.6. En la figura se puede observar que ambos resultados son similares. Esto implica que la implementación desarrollada en este proyecto describe el comportamiento de FSA. Las diferencias entre ambas gráficas responden a la aleatoriedad de ocurrencia de las respuestas en las etiquetas. Las colisiones, que ocurren aleatoriamente porque las etiquetas escogieron el mismo slot para responder, supondrán el uso de tramas adicionales para identificar todas las etiquetas. También se puede analizar la dependencia de tramas y número de etiquetas en la figura. En ambas representaciones se puede observar una dependencia 66 / Resultados (C. 3) Proyecto Fin de Carrera Tabla 3.1. Resultados para el primer estudio con Q=4 Valores expresados en tramas. Número de etiquetas Simulación Implementación 1 1 1 5 2 1 10 2 2 15 4 3 20 4 3 25 4 5 30 6 6 35 8 7 40 10 9 45 11 11 50 14 14 55 17 16 60 21 17 65 29 26 70 30 28 55 6 6 60 6 7 65 7 7 70 7 7 Tabla 3.2. Resultados para el primer estudio con Q=5 Valores expresados en tramas. Número de etiquetas Simulación Implementación 1 1 1 5 1 1 10 2 2 15 2 2 20 3 3 25 4 4 30 4 4 35 4 4 40 5 4 45 5 5 50 6 5 directa entre ambos parámetros. Es decir, a mayor número de etiquetas el lector necesitará más tramas para identificar todas ellas. Este es el comportamiento que se predijo al inicio de esta sección. 3.4.2. Segundo estudio. Influencia de Q En este segundo estudio se analizará la influencia de Q sobre el número de tramas necesarias para identificar las etiquetas, suponiendo un número de etiquetas fijo. De cada sistema se obtendrá el número de tramas que se han necesitado para identificar todas las etiquetas. Se han efectuado dos recogidas de resultados, una para el caso de 10 etiquetas y otra para el caso de 45 etiquetas. Los valores se encuentran en las Tablas 3.3 y 3.4. Los guiones en los primeros resultados de las tablas representan la imposibilidad de identificar tantas etiquetas con un tamaño de trama tan pequeño. Por ejemplo, para el caso de Q=0, existiría únicamente un slot para identificar 10 (ó 45) etiquetas, con lo que todas las etiquetas escogerán un número aleatorio entre 0 y 20 − 1 = 0, es decir, todas escogerán 0, haciendo imposible la identificación de más de una etiqueta con un tamaño de trama tan pequeño. Se puede observar en ambas tablas la tendencia descendente del número de tramas cuando se aumenta Q. El número de slots, es decir el número de posibilidades de responder para las etiquetas, se multiplica por dos si se aumenta Q en una unidad, puesto que K (el número de slots) se calcula como K = 2Q . Se confirma pues la suposición del principio de la sección de la dependencia inversa del número de tramas con respecto a Q. Jesús Pérez Comendador Pruebas realizadas / 67 (a) Q=4 (b) Q=5 Figura 3.6. Número de tramas frente a N para Q fijo. 68 / Resultados (C. 3) Proyecto Fin de Carrera Tabla 3.3. Resultados para el segundo estudio con N=10 Valores expresados en tramas. Q Simulación Implementación 0 - 1 117 108 2 8 7 3 3 3 4 2 2 5 2 2 6 1 1 7 1 1 8 1 2 9 2 1 10 1 1 11 1 1 12 1 1 13 1 1 14 1 1 15 1 1 Tabla 3.4. Resultados para el segundo estudio con N=45 Valores expresados en tramas. Q Simulación Implementación 0 - 1 - 2 43316 - 3 106 83 4 11 12 5 5 4 6 4 4 7 2 2 8 2 2 9 2 2 10 2 1 11 1 1 12 1 1 13 1 1 14 1 1 15 1 1 Si bien se ha confirmado la suposición al principio de esta sección, los resultados de cada ejecución no son comparables entre sí, pues trabajan con tamaños de trama diferentes. Para dibujar un gráfico como en la sección anterior se deben representar los slots necesarios, en lugar de las tramas. Así, la Figura 3.7 representa los slots necesarios para identificar todas las etiquetas en cada ejecución. Además se representarán únicamente los valores centrales, pues son los que nos aportan resultados más interesantes. En ambas gráficas de la Figura 3.7 se puede comprobar que el comportamiento de la simulación en MATLAB y del programa implementado es similar, las únicas diferencias se deben a la aleatoriedad de las respuestas. Además se pueden ver sendos mínimos en cada gráfica, por lo que se puede concluir que ambos valores de Q son los óptimos para 10 y 45 etiquetas, puesto que minimizan el número de slots utilizados. Llegados a este punto se deben contrastar los resultados con los postulados teóricos de Bueno-Delgado y Vales-Alonso [10]. En su artículo exponían la Tabla 2.3, conclusión de su estudio sobre el tamaño de trama óptimo en función de las etiquetas que se encuentran al alcance del lector. Si se acude a esta tabla se tiene que, para 10 etiquetas, el valor óptimo de Q es 3, exactamente el valor en el que se produce el mínimo en la Figura 3.7.a. De la misma forma, para 45 etiquetas el valor óptimo es 5, coincidiendo con el valor de Q en donde se produce el mínimo en la Figura 3.7.b. Jesús Pérez Comendador Pruebas realizadas / 69 (a) N=10 (b) N=45 Figura 3.7. Número de slots frente a Q para N fijo. 70 / Resultados (C. 3) Proyecto Fin de Carrera Bueno-Delgado y Vales-Alonso buscan la optimización del valor de Q con respecto al número de slots utilizados. Los resultados de las Tablas 3.3 y 3.4 podrían hacer pensar que es indiferente utilizar un valor de Q=13 ó Q=15, o incluso cabe pensar que es mejor siempre un valor alto, ya que se necesitan menos tramas. Pero no es así, puesto que ejecutar una trama con 215 slots es mucho más lento que ejecutar varias de 23 slots. Se deberá buscar, por tanto, el valor óptimo que minimice el tiempo de identificación de las etiquetas. Capítulo 4 Conclusiones Este último capítulo presenta, a modo de conclusión, los logros alcanzados en el transcurso del proyecto, así como los posibles trabajos futuros y mejoras que se pueden llevar a cabo. 4.1. Logros Al principio de esta memoria, en el capítulo de Introducción, se establecieron los objetivos que se deberían llevar a cabo en el Proyecto Fin de Carrera. A partir de lo expuesto en el capítulo de Resultados se pueden extraer cómo y en qué medida se han cumplido cada uno de los objetivos. El objetivo principal era diseñar un sistema RFID abierto que utilice FSA como esquema de acceso al medio y base su funcionamiento en el estándar EPC en lo que respecta al acceso al medio. Como puede comprobarse, este sistema se ha construido a lo largo del proceso de implementación descrito en la Sección 3.1. Incluso se ha conseguido medir su eficacia comparándolo con una simulación del comportamiento de FSA en la Sección 3.4. El grado de cumplimiento de los objetivos específicos se expone a continuación: 1. Diseñar un sistema bajo una plataforma de código abierto gratuita que, si bien se utilizará con propósitos de simulación, permita en el futuro el despliegue en un entorno real. El sistema se ha desarrollado en el marco de GNU Radio. El código implementado está dirigido a simulación, pero añadiendo nuevos bloques de procesado permite que se despliegue en un entorno real (ver Sección 4.2). Además, este framework es una plataforma de código abierto y gratuita. Se puede concluir, por tanto, que este objetivo se ha cumplido en su totalidad. 71 72 / Conclusiones (C. 4) Proyecto Fin de Carrera 2. Realizar un diseño del sistema centrado en mostrar el funcionamiento de Frame-Slotted ALOHA. De todas las posibles características del estándar EPC se ha decidido implementar las operaciones de inventariado y selección, prestando un especial interés en la primera de ellas. Como ya se analizó en el capítulo de Materiales y Métodos, la operación de inventariado se corresponde con un frame de FSA, en el que las múltiples etiquetas acceden al medio para responder al lector en la ronda de inventariado. Este objetivo también se puede dar por cumplido. 3. Implementar dos unidades separadas, el lector y la etiqueta, que serán los participantes del sistema. El lector y las etiquetas funcionan totalmente por separado, habiéndose elaborado e implementado sendas máquinas de estado independientes. La única restricción (impuesta por el estándar EPC) es que las etiquetas no responden si antes no han recibido un comando por parte del lector, pero su funcionamiento no está controlado por ningún otro ente, más que por los comandos que el lector envía. Este diseño hace cumplir el objetivo en su totalidad. 4. Realizar una implementación clara y legible en un lenguaje sencillo de interpretar por otros programadores. El lenguaje de programación Python ha sido el elegido para realizar la implementación. La decisión responde al cumplimiento de este objetivo, ya que como se expone en la página web de Python [11] y en la Sección 2.2, éste es un lenguaje de sintaxis clara y legible. Una ventaja añadida de este lenguaje es que es soportado por GNU Radio, con lo que no se debe portar el código una vez implementado a un lenguaje que entienda este framework. 5. Implementar un esquema modular que permita la inclusión posterior de otras funcionalidades extra de forma sencilla. La estructura modular viene impuesta por GNU Radio, al ser los bloques la unidad básica de procesado de señal en el mismo. Internamente los bloques también presentan una estructura modular, tal y como se puede observar en el Apéndice A. Este esquema facilita la inclusión de nueva funcionalidad, pues sólo es necesario añadir nuevos métodos y modificar el atributo que apunta a las acciones a realizar en cada caso. Además, también facilita la corrección de errores. Por tanto también se puede dar como cumplido este objetivo. 6. Seguir una metodología de desarrollo que permita evaluar paso a paso el cumplimiento parcial de objetivos. Jesús Pérez Comendador Posibles mejoras / 73 La metodología seguida está relatada en la Sección 2.6, y corresponde con una metodología incremental divida en ocho fases. En cada una de las fases se controla que lo implementado cumple los objetivos, además de realizar el trabajo deseado. Dicha metodología posibilita el cumplimiento de este último objetivo específico. Con todo ello, se puede concluir que el sistema creado cumple en su totalidad con lo que se pretendía obtener de él, una simulación del comportamiento de FSA enmarcado en un estándar RFID importante como es el estándar de EPCglobal. Los resultados medidos en el Capítulo 3 así lo corroboran. Todo ello sin perjuicio de las posibles ampliaciones y mejoras que se analizarán en la siguiente sección. 4.2. Posibles mejoras Según los objetivos establecidos para este proyecto, el sistema permite la inclusión de funcionalidad de forma sencilla, destinado a que se produzcan mejoras sobre el mismo. A continuación se exponen algunas de las posibles mejoras que pueden ser llevadas a cabo en trabajos posteriores. 4.2.1. Despliegue en entorno real Una de las posibles mejoras que se pueden efectuar es la del despliegue en un entorno real mediante hardware de propósito general. En el presente sistema sólo se contempla la simulación utilizando GNU Radio, aunque con vistas a esta posible mejora. En este sentido, GNU Radio proporciona la funcionalidad necesaria para trabajar con el hardware USRP de Ettus Research. El entorno real corresponderá a la emisión y recepción de comandos y respuestas utilizando el aire como canal de transmisión. Trabajo adicional necesario será la implementación de la capa física según establece el estándar EPC. De esta forma, bien mediante el uso de un único ordenador y un único USRP, o bien una implementación descentralizada del sistema, se podrá comprobar el funcionamiento del estándar en condiciones reales. Su uso en condiciones reales podrá comprobar, por ejemplo, la robustez del sistema a los errores de transmisión que pudieran ocurrir. 4.2.2. Implementación de la operación de acceso Los objetivos del presente proyecto concedían el protagonismo a la operación de inventariado, puesto que es aquella que desarrolla FSA. Sin embargo las demás operaciones son interesantes desde el punto de vista del funcionamiento del estándar EPC. La operación de selección ha sido implementada, no así la de acceso. 74 / Conclusiones (C. 4) Proyecto Fin de Carrera Como se explicó en la Sección 2.1.3, la operación de acceso consigue acciones como escribir datos en la etiqueta, leerlos o incluso desactivar permanentemente la misma. En concreto, los comandos que el lector deberá implementar serán Req_RN, Read, Write, Kill y Lock, y los mismos deberán ser entendidos y procesados por las etiquetas. La implementación de dicha operación permitirá tener un sistema totalmente compatible con el estándar EPC, pues todos los comandos obligatorios estarán implementados, ya que el sistema actual cumple los demás requisitos impuestos por el mismo. Apéndices 75 Apéndice A Descripción de los atributos y métodos de las clases construidas Clase Tag Atributos S Array de booleanos que representan los indicadores de sesión según el estándar. SL Booleano que representa el indicador SL. state Estado actual de la etiqueta (representado por un entero). name Nombre de la etiqueta, definido en el momento de instanciarla. Q Parámetro que configura la longitud de la trama FSA. slotCounter Contador de slots restantes para que la etiqueta responda al lector. session Sesión actual de la ronda de inventariado a la que se está respondiendo. selected Valor booleano que indica si la etiqueta participa o no en la ronda. RN16 Registro del número aleatorio generado y enviado al lector para contrastarlo con el ACK que proviene de éste. EPCbank Memoria EPC de la etiqueta. truncate Valor booleano que indica si la respuesta única de la etiqueta debe ser truncada o no. pointer En caso de que la respuesta sea truncada, posición de memoria desde la que se transmitirá lock Objeto Lock que hace la función de sincronización para poder imprimir por pantalla información sin solaparse con los demás agentes. 77 78/ Apéndices Proyecto Fin de Carrera verbose Valor booleano que indica si debe mostrar más mensajes por pantalla de los normales. ACTION Matriz de punteros a métodos de la clase. Esta matriz indicará qué método debe ejecutarse teniendo en cuenta el estado actual y el tipo de comando recibido. Métodos noAction(message) Este método no realiza ninguna acción. Es necesario para cumplir el propósito del atributo ACTION. select(message) Ejecuta el procesamiento del comando Select que se incluye en message, sea cual sea el estado en el que se encuentre la etiqueta. query(message) Ejecuta el procesamiento del comando Query, en cualquiera de los estados excepto en Acknowledged. newRound() Prepara una nueva ronda de inventariado tras comprobarse que la etiqueta puede participar en la misma. Es llamado por el método anterior. acknQuery(message) Procesa el comando Query recibido si la etiqueta está en el estado Acknowledged, pues si la sesión es la misma que la sesión en la que la etiqueta participaba se debe invertir el indicador de sesión antes de participar en la nueva ronda. replyQuery() Responde al lector con un RN16 (y lo almacena en el atributo del mismo nombre) cuando llega el slot elegido para responder. queryRep(message) Procesa el QueryRep recibido en el estado Arbitrate. toReady(message) Cambia el estado de la etiqueta a Ready después de una identificación satisfactoria si se ha recibido un QueryRep qAdjToReady(message) Cambia el estado de la etiqueta a Ready después de una identificación satisfactoria si se ha recibido un QueryAdjust returnArbitrate(message) Cuando la identificación no ha tenido éxito este método hace volver la etiqueta al estado Arbitrate. queryAdjust(message) Realiza el procesamiento del comando QueryAdjust en los estados Arbitrate y Reply. ack(message) Procesa el comando ACK y responde al lector si procede. nak(message) Ejecuta el procesamiento del comando NAK, o lo ignora si no es para esta etiqueta. Jesús Pérez Comendador Apéndices/ 79 receive(message) Recibe el comando, se encarga de identificar de qué tipo es y de ejecutar el método especializado en el mismo en cada estado. También se encarga de devolver la respuesta al comando si procede. work(input_items,output_items) El método que el planificador GNU Radio ejecuta en cada bloque. Se encarga de recibir el comando, llamar a receive y enviar la respuesta, hasta que llega la señal de apagado. Clase Reader Atributos Q El parámetro del estándar que define la duración de la trama. session Sesión en la que se efectúa el inventariado slotCounter Contador de slots para marcar el fin de trama. state Estado del lector, expresado por un número entero. select Parámetro del comando Query que está relacionado con el indicador SL de las etiquetas. target Estado del indicador de sesión en las etiquetas al que se dirige la ronda. tagsIdentified Número de etiquetas identificadas. lock Mismo funcionamiento que en Tag. collisions Indicador de colisión verbose Mismo funcionamiento que en Tag. ACTION Array de punteros a métodos de la clase que se encargan de dirigir el funcionamiento del lector en cada estado. Métodos isReaderFinished() Devuelve True si el lector se encuentra en el estado final. wereCollisions() Devuelve True si ha habido colisiones en la trama. getTagsIdentified() Devuelve el número de etiquetas correctamente identificadas en la ronda. 80/ Apéndices Proyecto Fin de Carrera getStateReader() Devuelve el estado en el que se encuentra el lector (expresado como un número entero). selectCommand(target,action,membank,pointer,length,mask,truncate) Elabora y envía un comando Select a las etiquetas con los parámetros indicados. query() Elabora y envía un Query a las etiquetas para empezar la ronda. Los parámetros del comando son los atributos del lector. queryRep() Elabora y envía un QueryRep con la sesión que indica el atributo session. queryAdjust(session,increment,decrement) Elabora y envía un comando QueryAdjust con los parámetros indicados. ack(rn16) Elabora y envía un ACK con el RN16 indicado. nak() Elabora y envía un NAK. noAction() Este método no realiza ninguna acción. Es necesario para cumplir el propósito del atributo ACTION. state_Ack(message) Método encargado del funcionamiento del lector en el estado ACK. state_running(message) Método encargado del funcionamiento del lector en el estado Running. continueRound() Método que continúa la ronda de inventariado, encargándose del control sobre el atributo slotCounter y ordenando el fin de la ronda o bien la llamada al método que envía el comando QueryRep. start_inventory(message) Método encargado del comienzo de la ronda, llamando al método query() y cambiando el estado a Running. receive(message) Este método se encarga de llamar al método apropiado dependiendo del estado en el que esté el lector, con la ayuda del atributo ACTION. reset_reader() El método es el encargado de preparar el lector para una nueva ronda, colocando el lector en el estado inicial y reseteando sus atributos. work(input_items,output_items) El método que el planificador GNU Radio ejecuta en cada bloque. Se encarga de recibir respuesta del bloque de control (ControlBlock), llamar a receive y enviar el comando generado, hasta que el lector transiciona al estado final, que envía la señal de apagado a las etiquetas. Jesús Pérez Comendador Apéndices/ 81 Clase ControlBlock Atributos n Número de etiquetas que se han creado. Este bloque contendrá n + 1 puertos de entrada, uno más para sincronizarse con los comandos del lector. lock Mismo funcionamiento que en Tag. verbose Mismo funcionamiento que en Tag. messages Diccionario que almacena temporalmente las respuestas de las etiquetas hasta que todas contestan, para así deducir si ha habido colisión o no. Métodos isUniqueResponse() Deduce si ha habido una única respuesta. Devuelve un booleano. reset_control() Vacía el diccionario messages. work(input_items,output_items) El método ejecutado por el planificador de GNU Radio. Este método realiza el procesamiento del bloque, devolviendo alguna respuesta (o no) al lector cuando éste envía un comando. Clase TopBlock Atributos lock Mismo funcionamiento que en Tag. reader_instance Instancia del bloque del lector (Clase Reader). controlModule Instancia del bloque de control (Clase ControlBlock). tags Lista con instancias de las etiquetas creadas (Clase Tag). Métodos Esta clase no contiene más métodos que los heredados. El constructor elabora el grafo de GNU Radio necesario para que la librería funcione. 82/ Apéndices Proyecto Fin de Carrera Clase MyProject Atributos Q El parámetro del estándar que define la duración de la trama FSA. SESSION_READER Sesión en la que se efectuará el inventariado. SEL Parámetro del comando Query del mismo nombre. TARGET Parámetro del comando Query del mismo nombre. ntags Número de etiquetas que intervienen en la ronda. verbose Mismo funcionamiento que en Tag. Métodos main() Método principal que ejecuta el algoritmo explicado en el Capítulo 3. Se encarga además de instanciar el grafo de GNU Radio (clase TopBlock) con los parámetros deseados. Bibliografía [1] EPC Radio-Frequency Identity Protocols Class-1 Generation-2 UHF RFID Protocol for Communications at 860MHz-960MHz, EPCglobal Inc., Oct. 2008. [2] ISO 18000-6C: Radio Frequency Identification for item management - Part 6: Parameters for air interface communications at 860MHz to 960MHz, ISO, 2010. [3] Página web de GNU Radio. [Online]. Available: http://www.gnuradio.org [4] Wikipedia. [Online]. Available: http://www.wikipedia.org/ [5] (2012) Sitio web de la revista The RFID Journal. [Online]. Available: http://www.rfidjournal.com/ [6] K. Finkenzeller, RFID Handbook, 2nd ed. John Wiley and Sons, 2003. [7] H. Stockman, “Communication by means of reflected power,” Proceedings of the IRE, pp. 1196–1204, Oct. 1948. [8] (2012) Página web de la Fábrica Nacional de Moneda y Timbre. [Online]. Available: http://www.fnmt.es [9] J. Yu, K. Liu, y G. Yan, “A Novel RFID Anti-Collision Algorithm Based on SDMA,” IEEE WiCOM ’08, pp. 1–4, Oct. 2008. [10] M. V. Bueno-Delgado y J. Vales-Alonso, “On the optimal frame-length configuration on real passive RFID systems,” Journal of Network and Computer Applications, vol. 34, pp. 864–876, Jun. 2010. [11] Página web de Python. [Online]. Available: http://www.python.org [12] (2012) Sitio web de Mathworks. [Online]. Available: http://www.mathworks. com/ [13] Wiki de GrExtras. [Online]. Available: http://github.com/guruofquality/ grextras/wiki 83 84/ Apéndices Proyecto Fin de Carrera [14] Página web de Numpy. [Online]. Available: http://numpy.scipy.org/ [15] J. Landt, “Shrouds of time: The history of RFID,” AIM, Association for Automatic Identification and Data Capture Technologies, Oct. 2001. [16] L. Zhu y T.-S. P. Yum, “A Critical Survey and Analysis of RFID AntiCollision Mechanisms,” IEEE Communications Magazine, vol. 49, no. 5, pp. 214–221, May 2011. [17] J. Park, M. Y. Chung, y T.-J. Lee, “Identification of RFID Tags in FrameSlotted Aloha with Tag Estimation and Binary Splitting,” IEEE, 2006. [18] A. Schantin, “Forward Error Correction in Long-Range RFID Systems.” [19] C. Turner, “Backscatter modulation of Impedance Modulated RFID tags.” Feb. 2003. [20] Cátedra de Sistemas Digitales de Comunicación. Universidad de Siegen. [Online]. Available: http://www.dcs.uni-siegen.de [21] J. A. Chávez Reyes, “Software Radio y el USRP,” Tesis doctoral, Universidad de las Américas - Puebla, Oct. 2005.