Introducción
El kit de desarrollo está formado por un conjunto de librerías para java, documentación de referencia y múltiples ejemplos.
Existe un ejemplo completamente funcional para cada una de las posibilidades que proporciona el Kit y el desarrollador podrá empezar a interactuar con su instalación rápidamente.
Las aplicaciones desarrolladas mediante este Kit se comportarán como un cliente del servidor de la pasarela y podrán estar desplegadas en cualquier ordenador de nuestra instalación que se encuentre conectado a la red.
Obtener una sesión con el servidor de la pasarela
En esta porción de código se muestra como obtener una sesión con la pasarela.
La aplicación puede recibir un evento que indicará que la sesión se ha perdido.
public RemoteOperationsServer getSession() throws ConnectionException {
// Se instancia el servicio.
ConnectionConfig operationsConfig = new ConnectionConfig("localhost");
// Se estableze la conexion con el servidor.
RemoteOperationsServer server = ConnectionUtils.openServer(
new DefaultClient() {
@Override
protected void sessionUp() {
System.out.println("*** Abierta la sesion ***");
}
@Override
protected void sessionDown() {
System.out.println("*** Cerrada la sesion ***");
}
},
operationsConfig
);
}
return server;
}
Interacción con Salto Systems
Las siguientes porciones de código nos muestran como interactuar con el sistema Salto Systems a través de la pasarela.
Obtener información general de Salto Systems
Obtendremos información del propósito general desde el servidor SHIP de su instalación Salto Systems.
// Operaciones
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se obtiene la informacion del servidor.
ShipInfoType shipInfoType = server.saltoClientInfoGet();
System.out.format("ShipInfoType(protocolId=%s,protocolVersion=%s,dateTime=%s,defaultLanguage=%s\n",
shipInfoType.getProtocolId(),
shipInfoType.getProtocolVersion(),
shipInfoType.getDateTime().toString(),
shipInfoType.getDefaultLanguage()
);
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Obtener todas las puertas
Estableceremos el número de puertas que leeremos en cada transacción y mediante un bucle realizaremos todas las transacciones necesarias hasta haber leído todas las puertas.
La sesión que establecemos con el servidor nos aporta un contexto de estado (posición de la última lectura) que de nuevo simplifica el trabajo del desarrollador.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se obtienen las puertas
ArrayList<ShipDoorType> doors = new ArrayList<ShipDoorType>();
server.saltoClientDoorsOpenGet(20);
while(server.saltoClientDoorsHasNext()) {
System.out.format("Leidos: %d.\n", doors.size());
for (ShipDoorType door : server.saltoClientDoorsGetNext())
doors.add(door);
}
System.out.format("Leidos: %d.\n", doors.size());
System.out.println();
// Se muestra el resultado.
for (ShipDoorType door : doors)
System.out.format("Puerta:%s, Bateria:%d, Need update:%b, Description\n", door.getName(), door.getBattery(), door.getUpdateRequired(), door.getDescription());
System.out.println();
System.out.format("%d puertas en total.\n", doors.size());
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Obtener todas las zonas
Estableceremos el número de zonas que leeremos en cada transacción y
mediante un bucle realizaremos todas las transacciones necesarias hasta
haber leído todas las zonas.
La sesión que establecemos con el servidor nos aporta un contexto de
estado (posición de la última lectura) que de nuevo simplifica el
trabajo del desarrollador.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se obtienen las puertas
ArrayList<ShipZoneType> zones = new ArrayList<ShipZoneType>();
server.saltoClientZonesOpenGet(20);
while(server.saltoClientZonesHasNext()) {
System.out.format("Leidos: %d.\n", zones.size());
for (ShipZoneType zone : server.saltoClientZonesGetNext())
zones.add(zone);
}
System.out.format("Leidos: %d.\n", zones.size());
System.out.println();
// Se muestra el resultado.
for (ShipZoneType zone : zones)
System.out.format("Zone:%s\n", zone.getName());
System.out.println();
System.out.format("%d zones en total.\n", zones.size());
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Obtener relaciones de puertas con zonas
Estableceremos el número de relaciones puerta-zona que leeremos en cada transacción y
mediante un bucle realizaremos todas las transacciones necesarias hasta
haber leído todas las relaciones puerta-zona.
La sesión que establecemos con el servidor nos aporta un contexto de
estado (posición de la última lectura) que de nuevo simplifica el
trabajo del desarrollador.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se obtienen las puertas
ArrayList<ShipDoorZoneType> doorsZones = new ArrayList<ShipDoorZoneType>();
server.saltoClientDoorsZonesOpenGet(20);
while(server.saltoClientDoorsZonesHasNext()) {
System.out.format("Leidos: %d.\n", doorsZones.size());
for (ShipDoorZoneType zone : server.saltoClientDoorsZonesGetNext())
doorsZones.add(zone);
}
System.out.format("Leidos: %d.\n", doorsZones.size());
System.out.println();
// Se muestra el resultado.
for (ShipDoorZoneType doorZone : doorsZones)
System.out.format("Zona:%s, Puerta=%s\n", doorZone.getZoneName(), doorZone.getDoorName());
System.out.println();
System.out.format("%d DoorsZones en total.\n", doorsZones.size());
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Obtener todos los encoders
Estableceremos el número de encoders que leeremos en cada transacción y
mediante un bucle realizaremos todas las transacciones necesarias hasta
haber leído todos los encoders.
La sesión que establecemos con el servidor nos aporta un contexto de
estado (posición de la última lectura) que de nuevo simplifica el
trabajo del desarrollador.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se obtienen las puertas
ArrayList<ShipEncoderType> encoders = new ArrayList<ShipEncoderType>();
server.saltoClientEncodersOpenGet(20);
while(server.saltoClientEncodersHasNext()) {
System.out.format("Leidos: %d.\n", encoders.size());
for (ShipEncoderType zone : server.saltoClientEncodersGetNext())
encoders.add(zone);
}
System.out.format("Leidos: %d.\n", encoders.size());
System.out.println();
// Se muestra el resultado.
for (ShipEncoderType encoder : encoders)
System.out.format("Nombre:%s, Descripcion:%s, IpAddress=%s, Type:%s\n",
encoder.getNombre(),
encoder.getDescription(),
encoder.getIpAddress(),
encoder.getType() == Operations.ShipEncoderTypeEnum.ETHERNET ? "Ethernet" : "Serial"
);
System.out.println();
System.out.format("%d encoders en total.\n", encoders.size());
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Emitir una llave
Emitimos una llave para proporcionarnos el ID de la llave y no es necesario proporcionar las autorizaciones ya que el servidor de la pasarela se encargará de obtenerlas.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se emite una nueva llave
server.saltoClientKeyNew("key1", null, 10, true); // 10 segundos para el timeout del encoder.
// Finalizada la emision.
System.out.println("Tarjeta emitida correctamente.");
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (SaltoClientInvalidKeyDataException e) {
e.printStackTrace();
} catch (SaltoClientInvalidKeySourceException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (SaltoClientFraudulentKeyException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Cancelar una llave
Cancelamos una llave en el sistema.
try {
// Esta pausa es para que se puede apreciar que el mensaje de
// apertura de la sesion es anterior a las operaciones
// que se realizan sobre el servidor.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se emite una nueva llave
server.saltoClientKeyCancel("key1");
// Finalizada la operacion.
System.out.println("Cancelada la llave.");
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (ShipIoException e) {
e.printStackTrace();
} catch (ShipFrameException e) {
e.printStackTrace();
} catch (ShipResponseException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoClientUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Interacción con el Servidor
Las siguientes porciones de código nos muestran como gestinar remotamente el servidor de la pasarela.
Forzar la actualización de la caché de autorizaciones
Puede ocurrir que no deseemos esperar el tiempo previsto hasta la próxima actualización de la caché de las autorizaciones, así que podemos forzar programáticamente la actualización de la caché.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se refresca la cache.
server.saltoKeysCacheRefreshNow();
// Finalizada la operacion.
System.out.println("Lanzado el proceso de refresco.");
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (SaltoKeysUnavailableException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Resetear la caché de autorizaciones
La pasarela proporcionará al sistema Salto Systems las autorizaciones que éste le solicite desde la caché que gestiona. Si no deseamos que utilice la caché para obtener las autorizaciones podemos vaciarla. Si la caché está vacía y no se carga otra vez porque hemos detenido su proceso de carga, cada petición de permisos para una llave que tengamos que procesar se realizará sobre el origen de datos.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se emite una nueva llave
server.saltoKeysCacheReset();
// Finalizada la operacion.
System.out.println("Cache reseteada.");
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (SaltoKeysUnavailableException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Cambiar el periodo de actualización de la caché
Podemos obtener y cambiar los segundos que pasarán entre las actualizaciones de caché.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se gestiona el perido de actualizacion.
int periodo = server.saltoKeysCacheGetRefreshPeriod();
System.out.println("Periodo de actualizacion anterior..: " + periodo);
server.saltoKeysCacheSetRefreshPeriod(periodo + 60);
System.out.println("Periodo de actualizacion actual....: " +
server.saltoKeysCacheGetRefreshPeriod());
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoKeysConfigException e) {
e.printStackTrace();
} catch (SaltoKeysUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Estado del servidor
Podemos obtener el estado completo del servidor de la pasarela.
try {
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se obtiene la informacion de la cache.
SaltoKeysCacheStatus cacheStatus = server.saltoKeysCacheGetStatus();
// Se muestra el estado de la cache del middleware
if (cacheStatus == null) {
System.out.println("No hay cache actualmente.");
} else {
System.out.println("Actualizacion finalizada........: " + cacheStatus.getRefreshDate());
System.out.println("Duracion de la actualizacion....: " + cacheStatus.getDuration());
System.out.println("Puertas referenciadas...........: " + cacheStatus.getNumDoors());
System.out.println("Zonas referenciadas.............: " + cacheStatus.getNumZones());
System.out.println("Llaves validas..................: " + cacheStatus.getValidKeys());
System.out.println("Llaves invalidas................: " + cacheStatus.getInvalidKeys());
System.out.println("Llaves fraudulentas.............: " + cacheStatus.getFraudulentKeys());
System.out.println("Llaves duplicadas...............: " + cacheStatus.getDuplicatedKeys());
System.out.println("Llaves sin licencia.............: " + cacheStatus.getUnlicencedKeys());
System.out.println("Puertas sin licencias...........: " + cacheStatus.getUnlicencedDoors());
System.out.println("Zonas sin licencias.............: " + cacheStatus.getUnlicencedZones());
System.out.println("Llaves con partes sin licencia..: " + cacheStatus.getKeysWithUnlicencedParts());
System.out.println();
}
System.out.println("Esta refrescando.................: " + server.saltoKeysCacheIsRefreshing());
String nextRefreshString;
Date nextRefreshDate = server.saltoKeysCacheGetNextRefresh();
if (nextRefreshDate == null)
nextRefreshString = "";
else
nextRefreshString = nextRefreshDate.toString();
System.out.println("Proximo refresco.................: " + nextRefreshString);
// Se emite una nueva llave
SaltoKeysThrowable saltoKeysthrowable = server.saltoKeysCacheGetLastError();
// Se muestra el resultado
if (saltoKeysthrowable == null)
System.out.println("Mensage de error.................: ");
else {
System.out.println("Mensage de error.................: " + saltoKeysthrowable.getMsg());
System.out.println();
Pattern p = Pattern.compile("\n\r");
String[] strArr = p.split(saltoKeysthrowable.getStackTrace());
for (String str : strArr)
System.out.println(str);
}
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} catch (SaltoKeysUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
Eventos del servidor
En este ejemplo (código completo) podemos ver como gestionar todos los eventos que puede proporcionar el servidor de la pasarela.
package com.speedycontrol.vigia.operations.examples;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import com.speedycontrol.vigia.operations.commons.RemoteOperationsServer;
import com.speedycontrol.vigia.operations.commons.framework.Framework.FrameworkAuthenticationException;
import com.speedycontrol.vigia.operations.commons.framework.Framework.FrameworkUnavailableException;
import com.speedycontrol.vigia.operations.util.ConnectionConfig;
import com.speedycontrol.vigia.operations.util.ConnectionException;
import com.speedycontrol.vigia.operations.util.ConnectionUtils;
import com.speedycontrol.vigia.operations.util.DefaultClient;
public class SaltoKeysEventsExample {
public static void main(String[] args) throws ConnectionException {
// Se instancia el servicio.
ConnectionConfig operationsConfig = new ConnectionConfig("localhost");
// Se estableze la conexion con el servidor.
RemoteOperationsServer server = ConnectionUtils.openServer(new Client(), operationsConfig);
try {
// Esta pausa es para que se puede apreciar que el mensaje de
// apertura de la sesion es anterior a las operaciones
// que se realizan sobre el servidor.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// Se inicia la sesion.
server.frameworkLogin("admin", "admin");
// Se activan los eventos
// Esperamos la finalizacion.
while(true) {
System.out.println("On, Off, End: ");
BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
try {
String cmd = bufReader.readLine();
if (cmd.equalsIgnoreCase("on")) {
System.out.println("Activados los eventos.");
server.saltoKeysCacheSetEvents(true);
server.saltoKeysServerSetEvents(true);
} else if (cmd.equalsIgnoreCase("off")) {
System.out.println("Desactivados los eventos.");
server.saltoKeysCacheSetEvents(false);
server.saltoKeysServerSetEvents(false);
} else if (cmd.equalsIgnoreCase("end")) {
System.out.println("Finalizando...");
break;
} else {
System.out.println("Orden desconocida.");
}
} catch (IOException e) {
}
}
} catch (FrameworkAuthenticationException e) {
e.printStackTrace();
} catch (FrameworkUnavailableException e) {
e.printStackTrace();
} finally {
// Se cierra la sesion.
server.frameworkLogout();
// Se cierra la conexion.
ConnectionUtils.closeServer(server, operationsConfig);
}
}
static private class Client extends DefaultClient {
@Override
protected void sessionUp() {
System.out.println("*** Abierta la sesion ***");
}
@Override
protected void sessionDown() {
System.out.println("*** Cerrada la sesion ***");
}
@Override
public void saltoKeysCacheEvent(SaltoKeysCacheEvent saltoKeysCacheEvent) {
if (saltoKeysCacheEvent instanceof SaltoKeysCacheStartedEvent) {
SaltoKeysCacheStartedEvent cacheStartedEvent = (SaltoKeysCacheStartedEvent) saltoKeysCacheEvent;
System.out.println("CacheStartedEvent: " + cacheStartedEvent);
} else if (saltoKeysCacheEvent instanceof SaltoKeysCacheResetEvent) {
SaltoKeysCacheResetEvent cacheResetEvent = (SaltoKeysCacheResetEvent) saltoKeysCacheEvent;
System.out.println("CacheResetEvent: " + cacheResetEvent);
} else if (saltoKeysCacheEvent instanceof SaltoKeysCacheUpdatedEvent) {
SaltoKeysCacheUpdatedEvent cacheUpdatedEvent = (SaltoKeysCacheUpdatedEvent) saltoKeysCacheEvent;
System.out.println("CacheUpdatedEvent: " + cacheUpdatedEvent);
} else if (saltoKeysCacheEvent instanceof SaltoKeysCacheErrorEvent) {
SaltoKeysCacheErrorEvent cacheErrorEvent = (SaltoKeysCacheErrorEvent) saltoKeysCacheEvent;
System.out.println("CacheErrorEvent: " + cacheErrorEvent);
} else {
System.out.println("El listener cacheEvent ha recibido un evento desconocido: " + saltoKeysCacheEvent.getClass().getName());
}
}
@Override
public void saltoKeysServerEvent(SaltoKeysServerEvent saltoKeysServerEvent) {
if (saltoKeysServerEvent instanceof SaltoKeysServerOpenedSessionEvent) {
SaltoKeysServerOpenedSessionEvent serverOpenedSessionEvent = (SaltoKeysServerOpenedSessionEvent) saltoKeysServerEvent;
System.out.println("ServerOpenedSessionEvent: " + serverOpenedSessionEvent);
} else if (saltoKeysServerEvent instanceof SaltoKeysServerClosedSessionEvent) {
SaltoKeysServerClosedSessionEvent serverClosedSessionEvent = (SaltoKeysServerClosedSessionEvent) saltoKeysServerEvent;
System.out.println("ServerClosedSessionEvent: " + serverClosedSessionEvent);
} else if (saltoKeysServerEvent instanceof SaltoKeysServerUpdatedKeyEvent) {
SaltoKeysServerUpdatedKeyEvent serverUpdatedKeyEvent = (SaltoKeysServerUpdatedKeyEvent) saltoKeysServerEvent;
System.out.println("ServerUpdatedKeyEvent: " + serverUpdatedKeyEvent);
} else if (saltoKeysServerEvent instanceof SaltoKeysServerInvalidKeyEvent) {
SaltoKeysServerInvalidKeyEvent serverInvalidKeyEvent = (SaltoKeysServerInvalidKeyEvent) saltoKeysServerEvent;
System.out.println("ServerInvalidKeyEvent: " + serverInvalidKeyEvent);
} else if (saltoKeysServerEvent instanceof SaltoKeysServerFraudulentKeyEvent) {
SaltoKeysServerFraudulentKeyEvent serverFraudulentKeyEvent = (SaltoKeysServerFraudulentKeyEvent) saltoKeysServerEvent;
System.out.println("ServerFraudulentKeyEvent: " + serverFraudulentKeyEvent);
} else if (saltoKeysServerEvent instanceof SaltoKeysServerErrorEvent) {
SaltoKeysServerErrorEvent serverErrorEvent = (SaltoKeysServerErrorEvent) saltoKeysServerEvent;
System.out.println("ServerErrorEvent: " + serverErrorEvent);
} else {
System.out.println("El listener shipServerEvent ha recibido un evento desconocido: " + saltoKeysServerEvent.getClass().getName());
}
}
}
}