• No se han encontrado resultados

Iteración 2: Diseño e implementación del Sistema de Gestión de Agentes ( AMS )Agentes (AMS)

Iteración 2: Diseño e implementación del Sistema de Gestión de Agentes (AMS)

aid.loadJSON(a) self.setSender(aid) if "receivers" in p:

for i in p["receivers"]:

s = AID() s.loadJSON(i) self.addReceiver(s) if "content" in p:

self.setContent(json.loads(p["content"]))

Listado 5.2: Código que gestiona los mensajes FIPA-ACL Resultado

Al finalizar esta iteración se obtuvo la implementación del ACCde la PA, generando así la primera versión de la librería de agentes y permitiendo a cada uno de los agentes enviar y recibir mensajes FIPA-ACL. Además, se configuró correctamente la plataforma de IBM Watson IoT para poder utilizar su broker para la comunicación en toda la plataforma.

Figura 5.4: ACC de la plataforma finalizada la Iteracion 1

5.3 Iteración 2: Diseño e implementación del Sistema de Gestión de

5.Resultados

Historias de usuario para la iteración

Historia de Usuario 4

Diseñar e implementar el AMS de la plataforma Node Iteración Prioridad Tiempo estimado

2 Alta 4 días

Descripción

Se diseñará el funcionamiento del AMS que funcionará en la plataforma de agentes con todas sus funciones, ofrecer un AID único para cada agente, registrar y eliminar agentes de la plataforma.

Criterios de aceptación

Programa funcional del AMS, que permita que otros agentes por medio de MQTT y el lenguaje FIPA-ACL puedan enviar mensajes para registrarse y eliminarse de la plataforma, así como la ampliación de la librería para realizar dichas acciones.

Tabla 5.5: Historia de Usuario 4 Historia de Usuario 5

Investigar sobre subir un programa Python a Bluemix Node Iteración Prioridad Tiempo estimado

2 Media 4 días

Descripción

Se investigará sobre la nube de IBM, Bluemix, y se subirá un ejemplo de programa Python

para poder desplegar en un futuro agentes y elementos de la arquitectura.

Criterios de aceptación

Guía para poder subir un archivo a la nube y las características que debe cumplir dicho archivo.

Tabla 5.6: Historia de Usuario 5 Desarrollo

En la iteración anterior solamente se implementó la librería para recibir los mensajes sin persistencia, por lo que se introdujo una cola de mensajes donde se almacenan los mensajes ACL que se van recibiendo. En la Figura 5.5, se puede observar un esquema del funcio- namiento del ACC de la plataforma, que en relación con la Figura 5.4 se ha mejorado el funcionamiento de la plataforma añadiendo una cola de mensajes, dónde se almacenaran los mensajes que le envíen a los agente.

El siguiente componente a desarrollar es elAMS. Su principal función es garantizar que cada agente en la plataforma tenga un único identificador. Se encarga de proporcionar los servicios de páginas blancas y ciclo de vida, y de mantener el directorio de los identificadores de agentes y el estado en el que se encuentran. Cada agente debe registrarse en el AMS para obtener un identificador de agente válido. Esta operación la realizan los agentes de forma automática al empezar su ejecución. Se pueden identificar dos acciones principales: una es

Iteración 2: Diseño e implementación del Sistema de Gestión de Agentes (AMS)

Figura 5.5: Funcionamiento del ACC de la plataforma

registrar los agentes cuyos identificadores son válidos y la otra consiste en eliminar al agente del AMS. Cuando el agente llega al final de su ejecución debe enviar un mensaje a éste para que se elimine.

Se decidió que este componente iba a estar localizado en la nube. Para ello, se identifi- caron varias tecnologías y plataformas que ofrecieran desplegar código Python en la nube.

Se encontraron dos opciones: la primera era utilizando la plataforma de la nube de IBM, Bluemix, que ofrece la opción de desplegar un servidor Flask. Otra opción era utilizar el sistema docker que nos ofrece Heroku. Para esta iteración se decidió utilizar la opción de Flask debido al conocimiento de esta librería de Python por parte del programador. Flask es un Framework escrito en Python y concebido para facilitar el desarrollo de aplicaciones web bajo el patrón Modelo Vista Controlador (MVC). Además, sirve para construir servicios web (como APIs REST) o aplicaciones de contenido estático (Listado 5.3).

Se debe instalar en nuestro ordenador la librería Flask de Python 2.7, ya que el servicio que ofrece IBM solo soporta esta versión de Python. Para ello, ejecutaremos el siguiente comando:

$ pip install -U Flask

Una vez ejecutado el comando, éste nos instalará las herramientas básicas para poder trabajar con este framework. Flask usa por defecto WSGI, que es un protocolo que utilizan los servidores web para servir las páginas escritas en Python.

De esta forma, se generaría la primera aplicación Flask. Ahora, se podría subir el programa a Bluemix. Para ello lo primero que hay que hacer es crear la instancia de Python Flask (Figura 5.6).

5.Resultados

from flask import Flask app = Flask(__name__)

@app.route("/") def hello():

return "Hello World!"

if __name__ == ’__main__’:

app.run(host=’0.0.0.0’, port=8000, debug=True)

Listado 5.3: «Hola mundo» de una aplicación Flask

Figura 5.6: Servicios que ofrece Bluemix

Después, se debe instalar la herramienta de Cloud Foundry en el computador usando el siguiente comando:

$ wget -q -O - https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo apt-key add -

echo "deb https://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list sudo apt-get update

sudo apt-get install cf-cli

Ahora, debe ubicarse en la carpeta en la que se encuentra la aplicación Flask y se deben crear los siguentes archivos:

Procfile:El contenido del siguiente archivo se puede ver en el Listado 5.4.

web: python hello.py

Listado 5.4: Fichero Procfile

Contiene el comando que se ejecutará al subir los archivos al repositorio en la nube.

En este caso, ejecutará el script del programa que se llama «hello.py».

Manifest.yml:El formato del mismo se muestra en el Listado 5.5.

Iteración 2: Diseño e implementación del Sistema de Gestión de Agentes (AMS)

applications:

- name: GetStartedPython random-route: true memory: 128M

Listado 5.5: Fichero Manifest.yml

Este fichero es importante, ya que configura la aplicación para el despliegue en la nube. El parámetro «name» proporciona el nombre de la aplicación especificada en el paso anterior. El parámetro «random-route»: true hace que se genere una ruta aleatoria para prevenir que pueda existir un error a la hora de elegir una que ya ha sido cogida.

Finalmente, el parámetro «memory» sirve para seleccionar la cantidad de memoria disponible para la ejecución de nuestra aplicación.

requeriments.txt: En este fichero, se introducirán todas las librerías que no se encuen- tran dentro de la librería estándar de Python y que son necesarias para que la aplicación funcione. Un ejemplo de fichero se muestra en el Listado 5.6.

Flask==0.12.2 cloudant==2.4.0

Listado 5.6: Fichero requeriments.txt

Una vez se dispone de todos los ficheros requeridos es hora de desplegar la aplicación. El primer paso es conectarse a la cuenta de Bluemix utilizando el cliente de Cloud Foundry que se ha descargado previamente; pero primero hay que seleccionar la región en la que se va a desplegar la aplicación Flask, tal y como se muestra en la Tabla 5.7 utilizando el siguiente comando:

$ cf api <API-endpoint>

URL Región

https://api.ng.bluemix.net Sur de EEUU https://api.eu-de.bluemix.net Alemania https://api.eu-gb.bluemix.net Reino Unido https://api.au-syd.bluemix.net Sydney

Tabla 5.7: Tabla de API-endpoint IBM Bluemix

Después, ya se podrá loguear en la aplicación introduciendo un correo y una contraseña:

$ cf login

Finalmente, también se podrá desplegar la aplicación ejecutando el siguiente comando:

5.Resultados

$ cf push

A continuación, en la página web de IBM (Figura 5.7), en la pestaña Registros, se podrán visualizar todos los logs de la aplicación y los errores, si existieran. También se podrá con- trolar el estado de la aplicación: iniciarla, pararla y reiniciarla. También existe la opción de controlar todas estas acciones a través de la aplicación de Cloud Foundry instalada, por ejem- plo, para visualizar los últimos logs registrados se debe utilizar el siguiente comando:

$ cf logs <Nombre-De-La-Aplicacion> --recent

Figura 5.7: Aplicación Flask desplegada en IBM Bluemix

Una vez que se tiene capacidad de ejecutar aplicaciones en la nube, se puede pasar a dise- ñar el funcionamiento del AMS. Al ejecutar la aplicación Flask, ésta se subscribirá al topic del broker MQTT «a-AMS», donde los agentes deberán enviar los mensajes ACL para co- municarse con el AMS. Como el estándar FIPA no especifica que el programa AMS deba estar estructurado cómo un programa agente, éste será diseñado cómo una función del pro- grama Flask que se activará cada vez que le llegue un mensaje MQTT. La primera accion es registrar los agentes. Cada agente de la plataforma antes de iniciar su ejecución enviará un mensaje ACL por MQTT al AMS para tratar de registrarse en la plataforma. Si éste tuviera un identificador válido se le enviaría un mensaje de aceptación en la plataforma y se guarda- ría en la memoria del programa para que otros agentes no puedan registrarse con el mismo identificador. La segunda y última acción consiste en eliminar un agente del AMS. Cuando un agente termine su ejecución, le enviará al AMS un mensaje ACL para eliminarse de la plataforma, y el AMS eliminará la información del identificador del agente de la memoria de identificadores activos. En la Figura 5.8, se puede ver el flujo de mensajes entre los agentes y el AMS, y en la Figura 5.9 se puede ver un ejemplo de los mensajes que muestra el AMS cuando les llegan esos mensajes.

Para que los agentes puedan registrarse y eliminarse de la plataforma se ha seguido desa- rrollando la librería, creando así la clase agente e introduciendo métodos para automatizar estas opciones:

Iteración 2: Diseño e implementación del Sistema de Gestión de Agentes (AMS)

Figura 5.8: Flujo de mensajes con los AMS

Registrar: automatizar el proceso para enviar un mensaje ACL al AMS de la platafor- ma y tratar de registrarse y obtener un identificador válido (Listado 5.7).

def register(self):

aclm=ACLMessage(’inform’)#performativa

aclm.setSender(self.aid)#Identificador del emisor

aid=AID("AMS",self._apikey+"-AMS")#Identificador del receptor aclm.addReceiver(aid)

msg={"action":"register"}

aclm.setContent(msg)#Define el contenido del mensaje self.send(aclm)#Envia el mensaje por el ACC

Listado 5.7: Código registro de agente en la plataforma

Eliminar: automatizar el proceso para enviar un mensaje ACL al AMS de la platafor- ma y eliminarse de éste debido a que ha terminado su ejecución (Listado 5.8).

Figura 5.9: Mensajes del AMS

5.Resultados

def deregister(self):

aclm=ACLMessage(’inform’)#Performativa

aclm.setSender(self.aid)#Identificador del emisor

aid=AID("AMS",self._apikey+"-AMS")#Identificador del receptor aclm.addReceiver(aid)

msg={"action":"kill_agent"}

aclm.setContent(msg) self.send(aclm)

Listado 5.8: Código eliminación de agente de la plataforma

Resultado

Se ha realizado una aplicación utilizando el framework Flask que realice las funciones del AMS de la plataforma. De momento, se ejecuta de manera local en el propio computador del programador. En la siguiente iteración se seguirán añadiendo más funcionalidades a este programa, como el DF. Además, se ha seguido aumentando la librería de agentes, solucio- nando errores de tratamiento de diccionarios Python con la librería de JSON y creando la nueva clase Agente.

5.4 Iteración 3: Diseño e implementación del servicio de páginas ama-