Josmanue escribiste:Vayamos por partes, en cuanto a lo de que cómo sabemos que 'SP103' es el nombre del UID, la respuesta es "porque es así y punto", me explico, si recibes una cadena de 6 caracteres que empieza por '@' y va seguido por 5 caracteres, entonces, se trata de un "estoy vivo" y esos 5 caracteres son el UID de la máquina en cuestion.
La pregunta no era por qué se eligió ese formato, sino cómo podemos distinguirlo de otras cadenas que lleguen a la entrada del programa.
Josmanue escribiste:Y en este caso, hay que ver si existe alguna orden en la tabla ordenes para ese UID y enviarlo, cuando llegue el acuse de recibo de esta máquina (@OC1SP103) hay que colocar un '1' en el campo ack_orden de la tabla ordenes, con ello conseguimos que a los 30 segundos, cuando la máquina vuelva a enviar un 'estoy vivo', es decir, un '$SP103', el ack_orden esté a '1' y no le vuelvo a mandar la misma orden.
Entiendo. Es un diálogo o protocolo.
- Se recibe una orden dentro de una trama de órdenes '@OR.....'.
- La orden la guardamos para ese UID, y con ack_orden = 0.
- Se recibe un 'estoy vivo', miramos si hay órdenes pendientes y las enviamos.
- Se reciben acuses de recibo '@OC1.....' con lo que marcamos ack_orden = 1.
Josmanue escribiste:He estado mirando y creo que la sentencia SQL que tengo que usar es esta:, pero claro, este 'UID' tengo que sacarlo de la cadena '$SP103' o de la cadena '@OC1SP103' y ahí es donde me quedo atascado.
- Código: Seleccionar todo
$sql2=("UPDATE ordenes SET ack_orden='1' WHERE destino_orden = 'UID'")
Pero eso lo haces con una simple expresión regular...
Using perl Syntax Highlighting
($uid) = $linea =~ /\$(.....)/; # Caso de $SP103
($uid) = $linea =~ /\@OC1(.....)/; # Caso de @OC1SP103
($uid) = $linea =~ /\@OC1(.....)/; # Caso de @OC1SP103
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Josmanue escribiste:Aquí pongo el que creo que es el esquema definitivo del programa.
- Código: Seleccionar todo
while (my @canal = $s->can_read(180))
{
## Lectura de la trama #############################################################
my $linea = <>; #con esto leemos la cadena por la entrada estándar
chomp $linea; #y le quitamos el final de línea.
#print "$linea\n";
if($linea = 'estoy vivo')
{
sacar su 'UID';
si hay orden para ese 'UID' mandar la orden
}
else if($linea='@OC1SP103')
{
sacar su 'UID'
actualizar ack_orden = '1' para ese 'UID'
}
else if($linea= #xUIDxxxxxFECxxxxxxTIExxxxxx@ODxxxxx@[email protected]@OPx)
{
separar los campos
construir la sentencia sql para insertar los campos
insertar los campos en la tabla ordenes
}
else
{
tratamiento de la trama
}
}
Supongamos que se reciben las líneas separadas con retornos de carro. Así, por ejemplo, podemos recibir un 'estoy vivo' de esta manera: "$SP103\n";
Entonces, los 'if' anteriores los puedes construir algo así:
Es decir, estamos comprobando que realmente toda la línea (^....$) coincide con ese patrón. Y si coincide, es un 'estoy vivo' y ejecuto esa parte.