Una vez que se inicia una sesión de cronometraje enviando el comando START a la CloudBox, la conexión TCP debe permanecer abierta para recibir continuamente flujos de datos de cronometraje en tiempo real, conocidos como pasos. Cada paso representa una instancia de una etiqueta RFID detectada por el sistema y contiene información importante sobre el atleta u objeto que activó la lectura RFID.
Los datos de aprobación se envían al cliente conectado en formato JSON, con la siguiente estructura:
{
"epc": "EPC_CODE_HERE",
"timestamp": "2024-09-17;14:34:23.123Z",
"seenCount": 3,
"antenna": 1,
"rssi": -65,
"passingNumber": 145,
"tagStr": "TAG_STRING",
"latitude": 41.28425,
"longitude": 1.98251,
"chksum": "CHECKSUM_HERE"
}Elementos clave de un pase
- epc (Código de producto electrónico)(*): Este es el identificador único de la etiqueta RFID que se detectó. El EPC ayuda a identificar qué etiqueta específica se leyó durante la sesión.
- timestamp:
La hora exacta en que se registró el paso, proporcionada en formato ISO 8601 (
YYYY-MM-DDTHH:mm:ss.sssZ). Esto permite un seguimiento preciso del momento en que se detectó la etiqueta. - seenCount (*): El número de veces que se ha detectado esta etiqueta dentro del mismo ciclo de lectura. Este valor puede ayudar a determinar la proximidad o la calidad de la lectura de la etiqueta.
- Antena (*): Identifica qué antena detectó la etiqueta. En los sistemas con varias antenas, esto ayuda a determinar en qué parte del recorrido o punto de control se produjo el paso.
- rssi (*): El indicador de intensidad de señal recibida (RSSI) mide la intensidad de la señal recibida de la etiqueta RFID. Este valor puede ayudar a determinar la proximidad o la calidad de la lectura de la etiqueta.
- passingNumber: Un número secuencial que se incrementa con cada pasada, lo que proporciona un identificador único para cada evento de pasada durante la sesión de cronometraje.
- tagStr (*):
Una representación de cadena de la etiqueta extraída del código
epc. Datos disponibles al leer etiquetas codificadas RUFUS. - latitud (*): Las coordenadas de latitud del dispositivo GPS (si están disponibles). Este valor puede ayudar a rastrear la ubicación exacta del paso en un mapa global.
- longitud (*): Las coordenadas de longitud del dispositivo GPS (si están disponibles). Este valor, junto con la latitud, proporciona la ubicación geográfica del paso.
- chksum: La suma de comprobación se utiliza para verificar la integridad de los datos, lo que garantiza que los datos transmitidos se hayan enviado correctamente y sin errores.
*(*) La información puede no estar disponible dependiendo del lector RFID instalado o de la configuración de CloudBox. Las claves siempre estarán presentes y si no hay datos disponibles, el valor será nulo.*
Manejo de los datos que se pasan
Una vez que se emite el comando START y la sesión está activa, los pases se envían a través de la misma conexión TCP abierta a los clientes conectados. Cada pase se transmite como un objeto JSON independiente, similar al ejemplo proporcionado anteriormente. Los pases continúan transmitiéndose en tiempo real a medida que los atletas u objetos con etiquetas RFID pasan por las antenas de detección.
El formato de cada pase es consistente, lo que permite al sistema receptor analizar y procesar los datos para fines de sincronización, clasificación y seguimiento.
La aplicación cliente debe gestionar el flujo continuo de pases analizando los datos entrantes, procesándolos y almacenándolos según sea necesario. A continuación, se muestran ejemplos en Python, C# y Node.js para gestionar los pases entrantes.
Ejemplo de Python
import json
HOST = '192.168.1.10'
PORT = 8080
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall("START\r\n".encode('utf-8')) # Start the timing session
while True:
data = s.recv(1024)
if data:
passing = json.loads(data.decode('utf-8'))
print(f"Passing received: {passing}")
# Process the passing data here (e.g., save to database, analyze, etc.)Ejemplo en C#
using System;
using System.Net.Sockets;
using System.Text;
using Newtonsoft.Json.Linq; // Install via NuGet
class Program
{
static void Main(string[] args)
{
string host = "192.168.1.10";
int port = 8080;
try
{
TcpClient client = new TcpClient(host, port);
NetworkStream stream = client.GetStream();
byte[] startCommand = Encoding.ASCII.GetBytes("START\r\n");
stream.Write(startCommand, 0, startCommand.Length);
byte[] buffer = new byte[1024];
while (true)
{
int bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string passingData = Encoding.ASCII.GetString(buffer, 0, bytesRead);
JObject passing = JObject.Parse(passingData);
Console.WriteLine($"Passing received: {passing}");
// Process the passing data (e.g., save to database, analyze, etc.)
}
}
stream.Close();
client.Close();
}
catch (Exception e)
{
Console.WriteLine($"Error: {e.Message}");
}
}
}Ejemplo de Node.js
const net = require('net');
// CloudBox IP and port
const HOST = '192.168.1.10';
const PORT = 8080;
// Create a socket connection to CloudBox
const client = new net.Socket();
client.connect(PORT, HOST, () => {
console.log(`Connected to CloudBox at ${HOST}:${PORT}`);
// Send the START command to initiate timing session
client.write("START\r\n");
});
// Receive and process passings
client.on('data', (data) => {
const passing = JSON.parse(data.toString());
console.log(`Passing received: ${JSON.stringify(passing)}`);
// Process the passing data (e.g., save to database, analyze, etc.)
});
// Handle connection close
client.on('close', () => {
console.log('Connection closed');
});
// Handle errors
client.on('error', (err) => {
console.error(`Error: ${err.message}`);
});Conclusión
Una vez iniciada una sesión de cronometraje, la CloudBox envía flujos de pasadas a través de la conexión TCP abierta en tiempo real, cada uno de los cuales contiene datos de detección vitales de RFID. Puede gestionar estas pasadas en Python, C# o Node.js, en función de las necesidades de su aplicación. Las pasadas pueden procesarse para su almacenamiento, análisis y operaciones de cronometraje de carreras.