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.