Duda con recepción de paquetes UDP

  • 2 Respuestas
  • 1604 Vistas

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Duda con recepción de paquetes UDP
« : julio 27, 2018, 20:35:16 pm »
Hola Boris como estas?

Te consulto una duda que me surgió con relación a la recepción de paquetes UDP, que en algunos momentos me anda medio errático (hay paquetes que llegan, y otros que no llegan).

La duda es sobre los parámetros del protocolo CSP. Supongamos que yo tengo que enviar 10 bytes de payload, cuáles son los valores correctos para los bytes "CMDIN_ARGSIZEx" del array?

Offset  Parameters          Value
06      CMDIN_ARGSIZE0     03  -- Aquí tengo que poner 03, o tengo que poner 0B
07      CMDIN_ARGSIZE1     00  -- Este siempre lo dejo en cero
09      CMDIN_ARGS            0A  -- Aquí le pongo siempre 0A porque envío 10 bytes de payload.

En realidad no entiendo el significado de los parámetros CMDIN_ARGSIZE0 y CMDIN_ARGSIZE1, puesto que en realidad el tamaño de la payload ya va en CMDIN_ARGS. Es como que tienen la misma función.

Lo curioso es que analizando esta cuestión he probado con el valor "03", y con el "0B", y en ambos casos anda (pero con fallos). Los paquetes los estoy enviando de un dispositivo no-pc, en el que yo programo completa la secuencia de la trama UDP a enviar hacia el PLC.

Desde ya muchas gracias !
Pablo.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2298
  • Soporte Técnico
Re:Duda con recepción de paquetes UDP
« Respuesta #1 : julio 30, 2018, 17:36:55 pm »
Buenas tardes Pablo.

La duda es sobre los parámetros del protocolo CSP. Supongamos que yo tengo que enviar 10 bytes de payload, cuáles son los valores correctos para los bytes "CMDIN_ARGSIZEx" del array?.

Para 10 bytes te quedaría algo así el array a transmitir:

Código: (Pawn) [Seleccionar]

   // Configurar CSP Header 
   Data[CMDIN_PASS_OFFSET] = 0
   Data[CMDIN_PASS_OFFSET+1] = 0
   Data[CMDIN_PASS_OFFSET+2] = 0
   Data[CMDIN_PASS_OFFSET+3] = 0
   Data[CMDIN_PROTO_OFFSET] = CMDSERV_PROTO_VERSION
   Data[CMDIN_TYPE_OFFSET] = CMD_TYPE_QUIET

   Data[CMDIN_ARGSIZE0_OFFSET] = 1+10    // Datos a transmitir + 1
   Data[CMDIN_ARGSIZE1_OFFSET] = 0

   Data[CMDIN_ID_OFFSET] = PBCMD_UdpRx

   Data[CMDIN_ARGS_OFFSET] = 10  // Cmd UdpRx Arg. Size (10 bytes)

   // Set data values (valores a transmitir).
   Data[CMDIN_ARGS_OFFSET+1] = 1
   Data[CMDIN_ARGS_OFFSET+2] = 2
   Data[CMDIN_ARGS_OFFSET+3] = 3
   Data[CMDIN_ARGS_OFFSET+4] = 4
   Data[CMDIN_ARGS_OFFSET+5] = 5
   Data[CMDIN_ARGS_OFFSET+6] = 6
   Data[CMDIN_ARGS_OFFSET+7] = 7
   Data[CMDIN_ARGS_OFFSET+8] = 8
   Data[CMDIN_ARGS_OFFSET+9] = 9
   Data[CMDIN_ARGS_OFFSET+10] = 10


Offset  Parameters          Value
06      CMDIN_ARGSIZE0     03  -- Aquí tengo que poner 03, o tengo que poner 0B
07      CMDIN_ARGSIZE1     00  -- Este siempre lo dejo en cero
09      CMDIN_ARGS            0A  -- Aquí le pongo siempre 0A porque envío 10 bytes de payload.

En realidad no entiendo el significado de los parámetros CMDIN_ARGSIZE0 y CMDIN_ARGSIZE1, puesto que en realidad el tamaño de la payload ya va en CMDIN_ARGS. Es como que tienen la misma función.

El campo CMDIN_ARGSIZE0 y CMDIN_ARGSIZE1, dan el valor total de bytes a transmitir del comando. Pero en este caso, el subcomando "PBCMD_UdpRx" requiere que se le diga cuantos bytes de información esta recibiendo en CMDIN_ARGS.

Entonces, si transmitís 10 bytes de datos útiles, 1 byte debés utilizarlo para indicar su longitud en CMDIN_ARGS.

Por lo tanto: CMDIN_ARGSIZE0 = CMDIN_ARGS + 1

Te consulto una duda que me surgió con relación a la recepción de paquetes UDP, que en algunos momentos me anda medio errático (hay paquetes que llegan, y otros que no llegan).

UDP no es un protocolo confiable, más si la transmisión esta en redes lejanas o con trafico.

Pero,  a veces me a resultado que luego de energizarse la placa, algunos paquetes iniciales UDP se pierden, pero luego funciona correctamente.

Esto lo solucioné enviando previamente un paquete vacio (NULL) o sin función alguna, que actualiza tablas ARP y conectividad en algunos sistemas.

Por ejemplo:

Código: (Pawn) [Seleccionar]

   // Configurar CSP Header 
   Data[CMDIN_PASS_OFFSET] = 0
   Data[CMDIN_PASS_OFFSET+1] = 0
   Data[CMDIN_PASS_OFFSET+2] = 0
   Data[CMDIN_PASS_OFFSET+3] = 0
   Data[CMDIN_PROTO_OFFSET] = CMDSERV_PROTO_VERSION
   Data[CMDIN_TYPE_OFFSET] = CMD_TYPE_QUIET

   Data[CMDIN_ARGSIZE0_OFFSET] = 0
   Data[CMDIN_ARGSIZE1_OFFSET] = 0

   Data[CMDIN_ID_OFFSET] = 0

Podes enviarlo antes de cada transmisión (algunas veces o esperar luego del mismo) y luego transmitir los datos útiles.

Saludos!
« Última Modificación: julio 30, 2018, 17:38:53 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Re:Duda con recepción de paquetes UDP
« Respuesta #2 : julio 31, 2018, 08:14:26 am »
OK, gracias por la info.

Entonces como lo vengo haciendo es lo correcto (para recibir 10 bytes de payload estoy poniendo 0B en CMDIN_ARGSIZE0_OFFSET). O sea que no tengo error de protocolo.
La recepción de paquetes UDP la estoy haciendo desde 3 dispositivos ubicados en mi red LAN, via WiFi. De dos de ellos anda 100% perfecto siempre (son módulos ESP8266). Pero desde el tercer dispositivo (mi celular), es errático. Ya voy a investigar pero es como que en algún punto "alguien" está filtrando los paquetes UDP.

Muchas gracias !
Pablo.