En esta entrada se detallan los componentes software incluidos en estos nodos, así como su interfaz, y el uso de las herramientas disponibles en el repositorio.
Descripción General
Los nodos de control para el ejemplo de logic wiring están compuestos por objetos Ice que exponen su interfaz pública, y proporcionan la forma de interactuar con el nodo. En concreto, este consta de dos objetos, uno para el control del relé (y el LED), y otro para la configuración general del nodo.
Direccionamiento
El nodo se conecta a (o crea) una red WiFi, por lo que dispone de una dirección IP v4 (por ejemplo 192.168.4.1). Esta dirección se puede conseguir de diferentes formas. La más sencilla pasa por conectarse al puerto serie y leer los mensajes de inicio del nodo. Por otro lado, si el nodo se configura en modo AP (más detalles en la sección Configuración del Nodo), la dirección es fija y conocida de antemano: 192.168.4.1. Si el nodo está en modo station, podemos ver la dirección asignada en nuestro servidor de DHCP.
Además, el nodo se programa con una dirección IDM base (la que identifica al nodo), y empleará las dos direcciones IDM siguientes para identificar los dos objetos descritos. Por ejemplo, si la dirección base del nodo es 10:01, que corresponde al objeto de gestión del nodo y la dirección del objeto relé será 10:02. Estas serán las direcciones empleadas en los ejemplos de este artículo.
Control del Relé
El objeto que se emplea para gestionar el estado del relé implementa dos interfaces: IBool.W y Active.W (ambas del módulo DUO.IDM). Examinemos cada una de ellas.
module IBool { interface W { void set(bool v, IDM::Address source); }; };
Esta interfaz solo presenta un método, set(), con un valor boleano como parámetro. La implementación de este método establece el estado del relé conforme al parámetro. El relé inicialmente está abierto, lo que se representa por un valor de verdad False. Para cerrar el relé, el parámetro v ha de ser True. El LED refleja en todo momento el estado del relé.
El segundo parámetro del método especifica la dirección origen del mensaje.
module Active { interface W { void setObserver(IDM::Address observer); }; };
Este nodo es capaz de notificar a un tercero los cambios que se producen en el estado del relé. Para especificar dónde se han de enviar esas notificaciones, se emplea el método setObserver de la interfaz Active.W. El único parámetro que acepta este método es la dirección IDM del observador.
En el repositorio del proyecto [1] existe una herramienta que utiliza estas dos interfaces para interactuar con el nodo. La sintaxis de uso es:
$ ./node-client.py <IDM-address> <IP-address> --set <state>
A modo de ejemplo, para cambiar el estado del relé (asumiendo que la dirección IDM del actuador es 10:02, y la dirección IP es 192.168.4.1):
$ ./node-client.py 10:02 192.168.4.1 --set 1 $ ./node-client.py 10:02 192.168.4.1 --set 0
Esta herramienta no hace uso de la red IDM, por lo que no es preciso disponer de un router IDM, por eso se requiere especificar la dirección IP del nodo.
Si se desea modificar la dirección del observador, se emplea la opción –setObserver, de la siguiente forma (en este ejemplo, el observador tiene la dirección 10:AA):
$ ./node-client.py 10:02 192.168.4.1 --set-observer 10:AA
Configuración del Nodo
El nodo implementa una interfaz de configuración específica: IoT.Node. Con ella es posible gestionar algunas opciones básicas del nodo. El siguiente listado muestra los métodos de esta interfaz.
interface Node { void setupWiFi(string ssid, string key); void setIDMRouter(string proxy); void restart(); void factoryReset(); };
A continuación se enumeran los detalles relativos a cada uno de estos métodos, así como algunos puntos relativos a su implementación.
setupWiFi: Cuando el nodo viene ‘de fabrica’, o se ha producido un factory reset, no existe configuración relativa a la red WiFi a la que debe conectarse. Con este método, es posible especificar el SSID y la clave (WPA2) de la red deseada. Si no se especifica, el nodo creará una red abierta, tomando como SSID la cadena ‘NODE_’ más la dirección IDM del nodo. Cualquier dispositivo que se conecte a esa red podrá solicitar una dirección IP por DHCP, y podrá cambiar los parámetros de configuración del nodo.
setIDMRouter: Este método configura el proxy del router IDM que se empleará por defecto para enviar mensajes a otros nodos.
restart: Reinicia el nodo. Es un ‘software reset’, no modifica la configuración del nodo. Se pierden (pero no se cierran) las conexiones abiertas. El estado de las salidas GPIO del nodo se recupera tras el reinicio.
factoryReset: Borra toda la configuración del nodo y lo reinicia. En particular, se pierde la configuración de la red WiFi, el proxy del router IDM, y la configuración del observador. No se altera la dirección IDM del nodo. Este método también se puede ejecutar localmente pulsando el botón de programación del nodo durante al menos 6 segundos.
La misma herramienta antes mencionada (node-client.py) se puede utilizar para cambiar la configuración del nodo. La sintáxis es la siguiente:
$ ./node-client.py Usage: ./node-client.py <idm-addr> <host-ip> [options] and options include: [--ssid SSID [--key KEY]] [--restart] [--factory-reset] [--set STATE] [--set-observer ADDR] [--set-router PROXY]
Si se especifica el SSID de la red a la que conectarse, los cambios no tendrán efecto hasta que se reinicie el nodo. Si no se indica la clave de la red (–key), se asume que la red especificada es abierta.
Programación Serie
Para compilar el firmware disponible en el repositorio, solo es necesario especificar la dirección IDM del nodo:
$ make ADDR=1001
Una vez compilado, para programar el nodo usando el puerto serie, es necesario conectar un adaptador serie-USB (FTDI) al zócalo de 6 pines interno. Por otro lado, se debe pulsar el botón de programación, y sin soltarlo, reiniciar el nodo (pulsando el botón de reinicio). Una vez hecho esto, ejecutar la instalación mediante la herramienta make:
$ make upload
Programación OTA
El proceso de compilación es el mismo que el antes descrito. Una vez compilado, cargamos el firmware indicando la dirección IP del nodo:
$ make ota-upload NODE_IP=192.168.4.1