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.
- Paso 1Instala Node.jsVersión LTS actual desde NodeSource
- Paso 2Escribe client.jsMódulo net incluido, sin paquetes
- Paso 3Pruébalo en localServidor eco en el mismo equipo
- Paso 4Conéctate al servidorIP y puerto del servidor real
La red del ejemplo
| Equipo | Función | Dirección |
|---|---|---|
| TouchBerry Pi o Raspberry PLC | Cliente TCP | 192.168.1.25 (fijada en la parte 1) |
| PC, Raspberry Pi o Arduino PLC | Servidor TCP | 192.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.argvlee 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 usa127.0.0.1y el puerto5566.net.createConnection()abre la conexión. Cuando está abierta, el cliente envía una línea que termina en\n.- El evento
datamuestra la respuesta y cierra la conexión conend(). setTimeout(5000)cierra el socket si el servidor no responde, o si la conexión no se puede abrir, en 5 segundos.- El evento
errorindica 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:
| Mensaje | Causa probable | Qué comprobar |
|---|---|---|
ECONNREFUSED | El equipo responde, pero nada escucha en ese puerto | Que el servidor esté en marcha y que el puerto sea el mismo en los dos lados |
EHOSTUNREACH o ENETUNREACH | No hay ruta hasta el servidor | Dirección y subred de los dos equipos con ip a e ip route (parte 1) |
No connection or no reply in 5 s | El servidor no responde, o la dirección no existe | El 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
- Parte 1: fijar una dirección IP estática
- Servidor TCP con Node.js
- Servidor TCP en un Arduino PLC
- Cliente TCP en un Arduino PLC
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.
PLC Solution Library
Socket TCP entre Python y Node-RED en un Raspberry PLC
Un proceso de control en Python y un dashboard de Node-RED intercambian datos de un encoder y órdenes de marcha, paro y salida por TCP.
Ver el ejemplo
Caso de estudio
Embotellado de agua con un TouchBerry Pi Panel PC
Un TouchBerry Pi de 7" controla una estación de embotellado como PLC y HMI: cinta, sensores, cilindro y bomba en sus propias E/S.
Leer el caso de estudio