Ir al contenido

Cliente TCP en un TouchBerry Pi o Raspberry PLC, parte 2: cliente con Node.js

Instala Node.js LTS desde NodeSource, escribe un cliente TCP con el módulo net y pruébalo con un servidor eco
10 de diciembre de 2018 por
Cliente TCP en un TouchBerry Pi o Raspberry PLC, parte 2: cliente con Node.js
Alejandro Jabalquinto

Para crear un cliente TCP en un TouchBerry Pi o un Raspberry PLC, instala una versión LTS actual de Node.js (desde el repositorio de NodeSource, porque el paquete de Debian es demasiado antiguo) y usa el módulo net que incluye Node.js: net.createConnection() abre la conexión con la IP y el puerto del servidor, write() envía datos y el evento data recibe la respuesta. Se ejecuta con node client.js 192.168.1.30 5566. No hace falta ningún paquete npm adicional.

Esta es la parte 2 del tutorial. En la parte 1 el equipo recibió la dirección estática 192.168.1.25. Aquí se convierte en un cliente TCP que se conecta a un servidor, envía un mensaje y muestra la respuesta. La primera versión usaba un TouchBerry Pi 3, que ya no se fabrica. Los pasos son los mismos en el TouchBerry Pi Panel PC actual y en cualquier Raspberry PLC.

  1. Paso 1Instala Node.jsVersión LTS actual desde NodeSource
  2. Paso 2Escribe client.jsMódulo net incluido, sin paquetes
  3. Paso 3Pruébalo en localServidor eco en el mismo equipo
  4. Paso 4Conéctate al servidorIP y puerto del servidor real

La red del ejemplo

EquipoFunciónDirección
TouchBerry Pi o Raspberry PLCCliente TCP192.168.1.25 (fijada en la parte 1)
PC, Raspberry Pi o Arduino PLCServidor TCP192.168.1.30, puerto 5566

El servidor puede ser el servidor TCP con Node.js de la misma serie, que responde con los datos que recibe, o un M-Duino con el servidor TCP para Arduino PLC. Los dos equipos deben estar en la misma subred o tener una ruta entre ellos.

Paso 1: instala Node.js LTS

Primero comprueba si Node.js ya está instalado:

node -v

Un Raspberry PLC preparado con la imagen o el script install.sh de Industrial Shields ya tiene Node.js, porque el script lo instala junto con Node-RED. Si node -v muestra la versión 22 o posterior, pasa al paso 2.

Si Node.js no está o es más antiguo, no instales el paquete nodejs de Debian: Bookworm trae Node.js 18, que llegó al final de su soporte en abril de 2025. Instala la versión LTS con el script de configuración de NodeSource, que publica paquetes de Node.js para Debian en arm64 y armhf:

sudo apt update
sudo apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh
sudo -E bash nodesource_setup.sh
sudo apt install -y nodejs
node -v

setup_lts.x añade el repositorio de la línea LTS actual, y apt mantiene Node.js actualizado con el resto del sistema. Para fijar una versión principal, usa setup_24.x o la versión que necesites. Esto sustituye al antiguo script setup_6.x de la primera versión de este post: Node.js 6 no tiene soporte desde 2019.

Paso 2: escribe el cliente TCP

Crea una carpeta para el proyecto y abre un archivo nuevo:

mkdir ~/tcp-client
cd ~/tcp-client
nano client.js

Pega este código. Los comentarios explican cada parte:

#!/usr/bin/env node
// TCP client: connects to a server, sends one line and prints the reply
const net = require('node:net');

const HOST = process.argv[2] || '127.0.0.1'; // IP address of the TCP server
const PORT = Number(process.argv[3]) || 5566; // TCP port of the server

const client = net.createConnection({ host: HOST, port: PORT }, () => {
  console.log(`Connected to ${HOST}:${PORT}`);
  client.write('Hello from the TCP client\n');
});

client.setTimeout(5000); // close if nothing happens for 5 s
client.on('timeout', () => {
  console.log('No connection or no reply in 5 s');
  process.exitCode = 1;
  client.destroy(); // close the socket
});

client.on('data', (data) => {
  console.log('Received: ' + data.toString().trim());
  client.end(); // close the connection after the reply
});

client.on('error', (err) => {
  console.error('Connection error: ' + err.message);
  process.exitCode = 1;
});

client.on('close', () => {
  console.log('Connection closed');
});

Cómo funciona:

  • process.argv lee la dirección IP y el puerto de la línea de comandos, así que puedes cambiar de servidor sin editar el código. Sin argumentos usa 127.0.0.1 y el puerto 5566.
  • net.createConnection() abre la conexión. Cuando está abierta, el cliente envía una línea que termina en \n.
  • El evento data muestra la respuesta y cierra la conexión con end().
  • setTimeout(5000) cierra el socket si el servidor no responde, o si la conexión no se puede abrir, en 5 segundos.
  • El evento error indica por qué ha fallado la conexión y pone el código de salida a 1, para que un script o un servicio systemd lo detecte.

Guarda con Ctrl+O y sal con Ctrl+X.

Paso 3: prueba el cliente en el mismo equipo

Antes de usar la red, prueba el cliente con un pequeño servidor eco en el mismo equipo. Guarda este código como server.js en la misma carpeta:

#!/usr/bin/env node
// TCP echo server to test the client: replies with the same data
const net = require('node:net');

const PORT = Number(process.argv[2]) || 5566;

net.createServer((socket) => {
  console.log('Client connected: ' + socket.remoteAddress);
  socket.on('data', (data) => socket.write(data)); // echo
  socket.on('error', (err) => console.error('Socket error: ' + err.message));
  socket.on('close', () => console.log('Client disconnected'));
}).listen(PORT, () => console.log('Listening on port ' + PORT));

Arranca el servidor en un terminal:

node server.js

Y ejecuta el cliente en un segundo terminal:

node client.js

El cliente debe mostrar:

Connected to 127.0.0.1:5566
Received: Hello from the TCP client
Connection closed

Detén el servidor con Ctrl+C.

Paso 4: conéctate al servidor real

Arranca el servidor en el otro equipo y pasa al cliente su dirección IP y su puerto:

node client.js 192.168.1.30 5566

Si no se conecta, el mensaje indica dónde mirar:

MensajeCausa probableQué comprobar
ECONNREFUSEDEl equipo responde, pero nada escucha en ese puertoQue el servidor esté en marcha y que el puerto sea el mismo en los dos lados
EHOSTUNREACH o ENETUNREACHNo hay ruta hasta el servidorDirección y subred de los dos equipos con ip a e ip route (parte 1)
No connection or no reply in 5 sEl servidor no responde, o la dirección no existeEl cable, ping 192.168.1.30 y que el servidor responda a cada mensaje

Un servidor basado en Arduino suele leer hasta el final de línea; por eso el cliente termina su mensaje con \n.

Preguntas frecuentes sobre clientes TCP con Node.js

¿Necesito instalar algún paquete con npm?

No. El módulo net forma parte de Node.js. No hace falta npm install para este ejemplo.

¿Qué versión de Node.js uso?

Una versión LTS (soporte a largo plazo). Hasta Node.js 26, solo las versiones con número par pasan a LTS; a partir de Node.js 27 (abril de 2027) hay una versión principal al año y todas pasan a LTS en octubre. Cada línea LTS recibe actualizaciones de seguridad durante unos 30 meses. Revisa node -v de vez en cuando y actualiza con sudo apt upgrade. El comando apt no salta a una versión principal nueva: para subir, cambia el repositorio de NodeSource ejecutando de nuevo su script de configuración (por ejemplo setup_lts.x).

¿Cómo mantengo la conexión abierta y envío datos cada segundo?

No llames a end() en el evento data y envía los datos con setInterval(). Añade una reconexión en el evento close si el cliente se tiene que recuperar cuando el servidor se reinicia.

¿Cómo arranco el cliente al encender el equipo?

Crea un servicio systemd que ejecute node /home/pi/tcp-client/client.js con la dirección del servidor. Adapta la ruta a tu usuario.

TCP con equipos de Industrial Shields

El TouchBerry Pi Panel PC (7", 10,1" y 18,5") y el Raspberry PLC funcionan con Linux, así que el mismo cliente de Node.js sirve en los dos.

Para ir más allá

Una conexión TCP es la forma en que un panel o un PLC con Linux habla con el resto de la línea. Estas páginas la usan en proyectos reales.

Buscar en nuestro blog

Cliente TCP en un TouchBerry Pi o Raspberry PLC, parte 2: cliente con Node.js
Alejandro Jabalquinto 10 de diciembre de 2018
Compartir esta publicación

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs