Ingeniería inversa de un convertidor RS232 a ETHERNET parte 3

Ahora que ya tengo terminado el protocolo «discover» puedo hacer que el instalador del driver «NPORT Windows Driver Manager 3.5» reconozca mi ESP32 como un dispositivo MOXA y monte los puertos COM1 y COM2. El siguiente paso es identificar el protocolo de configuración del puerto y el protocolo de transmisión de datos. Aparentemente los puertos TCP/IP 960 y 966 tienen algo que ver:

Para averiguarlos monto el MOXA DE-311como puerto COM1 y analizo con WireShark la comunicación cuando abro el puerto con un programa terminal (Realterm)y envío datos:

Voy cambiando las configuraciones del puerto, baudrate, bits, paridad, control de flujo etc

Los datos de configuración del puerto se envían por el puerto TCP/IP 966. He observado que si hay más puertos activos utiliza los puertos TCP/IP 967, 968 etc hasta 982. El protocolo es algo distinto del protocolo «discover» pero sencillo:

El primer byte es el código de comando, el segundo es la longitud total mensaje y a continuación un grupo de datos variable, con un significado distinto según el comando.

He identificado bastantes comandos de configuración, aunque a otros no he sido capaz de encontrarles la utilidad.

  • 39 00 = Abrir el puerto
  • 2F 04 E8 03 00 00 = repetido x3 = Cerrar el puerto
  • 13 00 = KeepAlive o Heartbeat
  • 2C 13 10 03 01 01 00 00 00 00 4C454E4F564F2D54455354 = Configurar baudrate, bits etc
  • 17 04 40380000 = Baudrate arbitrario
  • 10 02 00 03 = Configurar baudrate, bits, paridad y bits stop
  • 11 04 00 00 00 00 = Establecer de flujo RTS/CTS DTR/DSR XON/FOFF
  • 12 02 00 00 = Establecer estado de RTS y DTR
  • 21 00 = Establecer BREAK
  • 22 00 = Cancelar BREAK
  • 30 01 10 = Sin identificar
  • 18 02 11 13 = Sin identificar

El MOXA contesta a casi todos estos comandos con ACK que es siempre COMANDO+4F4B

Los datos viajan bidireccionalmente entre el puerto COM y el MOXA por el puerto TCP/IP 950 sin modificación.

Con estos datos escribo el programa para ESP32 (DeVkit V2 o similar) «MoxaEmulator.ino» que realiza todas las funciones necesarias. El programa responde al «discover» y comunica por los puertos necesarios para emular un MOXA DE-302 de dos puertos. El programa sólo hace ECO de los datos serie que entran, enviándolos a la salida, pero eso permite ver que funciona. En esta captura se ve la detección del MOXA DE-311 auténtico y el DE-302 emulado:

El programa del ESP32 envía gran cantidad de información de depuración por el puerto serie, mostrando el intercambio de mensajes con el driver.

Y eso es todo… al final me ha llevado dos tardes más de lo que pensaba, pero los programas han quedado más depurados y fáciles de entender. Analizando el código puede seguirse con relativa facilidad el protocolo de MOXA y puede usarse en otros proyectos.

Links de descarga de los tres programas, aunque como cada uno es la evolución del anterior el «MoxaEmulator.ino» es el más completo y contiene el código de los anteriores.

MoxaDiscover1.ino

MoxaDiscover2.ino

MoxaEmulator.ino