
Una red domótica KNX puede conectarse a una red IP mediante un dispositivo denominado IP Router.
El IP router se comunica con un servidor externo mediante el intercambio de paquetes UDP. Los paquetes intercambiados incluyen un «identificador de sesión» (channelid), y están numerados, de manera que un paquete con un número fuera de secuencia es descartado.
En este artículo analizamos los paquetes intercambiados entre un servidor eibd y un IP router implementado en software ( «tweety»). Además, simulamos el envío de órdenes mediante el comando groupswrite que se incluye en la distribución de eibd.
Para realizar la prueba, ejecutamos en una ventana el servidor eibd:
1 2 3 |
$ eibd --trace=5 --listen-local ipt:10.0.2.15 |
En otra ventana, ejecutamos el IP router «tweety»:
1 2 3 |
$ ./tweety |
En una tercera ventana, ejecutamos el comando groupswrite para enviar una orden al bus:
1 2 3 |
$ groupswrite local:/tmp/eib 2/3/4 1 |
La secuencia de paquetes intercambiados, desde el punto de vista del servidor eibd, es la siguiente:
Num. | Sentido | Header | Data | ||
1 | Send | 06 10 | 02 05 =CONN REQ |
00 1A | 08 01 0A 00 02 0F 0E 58 08 01 0A 00 02 0F 0E 58 04 04 02 00 |
2 | Recv | 06 10 | 02 06 =CONN RES |
00 14 | 65 00 08 01 0A 00 02 0F 00 00 04 04 4C 03 |
3 | Send | 06 10 | 04 20 =TUNNEL REQ |
00 15 | 04 65 00 00 11 00 BC F0 00 00 13 04 01 00 81 |
4 | Recv | 06 10 | 04 21 =TUNNEL RES |
00 0A | 04 65 00 00 |
5 | Send | 06 10 | 04 20 =TUNNEL REQ |
00 15 | 04 65 01 00 11 00 BC F0 00 00 13 04 01 00 81 |
6 | Recv | 06 10 | 04 21 =TUNNEL RES |
00 0A | 04 65 01 00 |
7 | Send | 06 10 | 04 20 =TUNNEL REQ |
00 15 | 04 65 02 00 11 00 BC F0 00 00 13 04 01 00 81 |
8 | Recv | 06 10 | 04 21 =TUNNEL RES |
00 0A | 04 65 02 00 |
9 | Send | 06 10 | 02 07 =CONNECTIONSTATE REQUEST |
00 10 | 65 00 08 01 0A 00 02 0F 0E 58 |
10 | Recv | 06 10 | 02 08 =CONNECTIONSTATE RESPONSE |
00 08 | 65 00 |
11 | Send | 06 10 | 02 09 =DISCONNECT REQUEST |
00 10 | 65 00 08 01 0A 00 02 0F 0E 58 |
Los headers de los paquetes constan de 6 bytes, que contienen:
- el prefijo «06 10» (longitud del header: 6 bytes, version: 1)
- el tipo de paquete (dos bytes: CONNECTION REQUEST, CONNECTION RESPONSE, etc.)
- la longitud total del paquete (dos bytes)
Establecimiento de conexión
Paquete 1: el servidor envía una solicitud de conexión al router IP.
En el paquete indica la direccion IP y puerto en el que escucha, tanto para comandos de control como de datos (IP 0A 00 02 0F hex = 10.0.2.15; puerto 0E 58 hex = 3672)
El contenido del paquete es:
Control endpoint | Data endpoint | |||||||||
struct length |
host protocol |
Dir. IP | puerto | struct length |
host protocol |
Dir. IP | puerto | struct length |
connection type |
data |
08 | 01 | 0A 00 02 0F | 0E 58 | 08 | 01 | 0A 00 02 0F | 0E 58 | 04 | 04 = EIBNETIP_TUNNELING |
02 00 = TUNNEL_LINKLAYER |
Paquete 2: El router IP responde con un mensaje aceptando la conexión. En la respuesta incluye el número de canal (channelid) que se debe utilizar durante la conexión:
channelid | struct length |
host protocol |
Dir. IP | Reserved | struct length |
connection type |
direccion KNX |
65 00 | 08 | 01 | 0A 00 02 0F | 00 00 | 04 | 04 = EIBNETIP_TUNNELING |
4C 03 |
Envío de órdenes al bus
Simulamos el envío de órdenes a la dirección de grupo 2/3/4 del bus, mediante el comando groupswrite que viene como ejemplo en la instalación de eibd:
1 2 3 |
$ groupswrite local:/tmp/eib 2/3/4 2 |
Paquete 3: Al recibir la orden, el servidor envía al router IP el correspondiente paquete UDP.
En el header, utiliza el mismo channelid recibido durante el establecimiento de la conexión, y el número de secuencia:
Header | cEMI packet | ||||||||||
hdr length |
channelid | seq num |
reserved | msg code |
add info length |
Ctrl 1 | Ctrl 2 | source address |
destination address |
data lengh |
APDU |
04 | 65 | 00 | 00 | 11 | 00 | BC | F0 | 00 00 | 13 04 | 01 | 00 81 |
Paquete 4: El router IP responde con un mensaje de aceptación de la solicitud:
Este mensaje sólamente contiene el header, con el mismo channelid y número de secuencia que los recibidos en la petición:
Header | |||
hdr length |
channelid | seq num |
status |
04 | 65 | 00 | 00 |
El status devuelto puede ser:
1 2 3 4 |
E_NO_ERROR 0x00 E_SEQUENCE_NUMBER 0x04 |
Paquetes 5,6 y 7,8: Repetimos la ejecución del comando groupswrite dos veces más, y el servidor eibd intercambia con el router IP otros dos pares de paquetes con el mismo contenido que los paquetes 3 y 4, con excepción del número de secuencia, que se incrementa en cada intercambio.
Mantenimiento de la conexión
Paquete 9: Cada 60 segundos, el servidor envía al router IP un paquete CONNECTIONSTATE_REQUEST. El paquete contiene el channel id y la dirección IP y puerto en el que escucha el servidor:
channelid | struct length |
host protocol |
Dir. IP | puerto |
65 00 | 08 | 01 | 0A 00 02 0F | 0E 58 |
Paquete 10: El router IP responde con un paquete que simplemente contiene el channel ID:
channelid | status |
65 | 00 |
Los posibles códigos de status son:
1 2 3 4 5 6 |
E_NO_ERROR 0x00 E_CONNECTION_ID 0x21 E_DATA_CONNECTION 0x26 E_KNX_CONNECTION 0x27 |
Desconexión
Paquete 11: En la solicitud de desconexión, el servidor envía un paquete igual al que envía en la solicitud CONNECTIONSTATE_REQUEST:
channelid | struct length |
host protocol |
Dir. IP | puerto |
65 00 | 08 | 01 | 0A 00 02 0F | 0E 58 |
—-