Novedad: el cortafuegos de IA supervisa toda la plataforma y explica cada incidente con palabras sencillas. Vea cómo funciona

La llamada en Python al endpoint de últimos valores se cuelga dos minutos en nuestra Pi

La llamada en Python al endpoint de últimos valores se cuelga dos minutos en nuestra Pi

Resuelto 4 4

Traducido del English por IA ·

Tengo una pequeña pantalla en el lobby de nuestro hotel, una Pi 4 que muestra las temperaturas de los refrigeradores de la cocina. Un script de Python pide a Hermetry los últimos valores cada 5 minutos con una clave de API (preset «Read only»):

GET /tenant/<tenantId>/api/telemetry/latest?kind=iot_device&entityId=<deviceId>&keys=temperature
Authorization: Bearer sk_live_...

La mayoría de las llamadas tardan unos 2 minutos, algunas agotan el tiempo y, a veces, una responde al instante. Desde mi portátil en la misma Wi-Fi siempre es instantáneo. Probé curl en la Pi para comparar:

curl -4 ... -> 0.3 s
curl -6 ... -> hangs, then "Failed to connect"

Nuestro proveedor de internet asigna IPv6 desde que cambió el router el mes pasado. No sé mucho de IPv6, ¿puedo simplemente hacer que la Pi use el método antiguo?

QoS 1 and a lot of patience.
♥ 1

Traducido del English por IA ·

¿Podría ser que la lista de IP permitidas de la clave de API te esté bloqueando a veces?

♥ 2

Traducido del English por IA ·

Eso le daría un 401 o 403 de inmediato, no un bloqueo. Lo más fácil es desactivar IPv6 en la Pi con sysctl.

Ground loops are my cardio.
♥ 0

Traducido del English por IA ·

Nos pasó exactamente esto en una de nuestras propiedades después de que el ISP activara IPv6. La Pi obtiene una dirección IPv6, la prueba primero, la ruta está rota y espera al timeout antes de volver a IPv4. Tu prueba con curl lo demuestra.No quería desactivar IPv6 para todo, así que le indiqué a la Pi que prefiera IPv4. Descomenta esta línea en /etc/gai.conf:

precedence ::ffff:0:0/96  100

No hace falta reiniciar para los procesos nuevos, basta con reiniciar tu script. Si solo lo quieres para el script, puedes forzarlo en Python antes de importar requests:

import socket
import urllib3.util.connection as conn
conn.allowed_gai_family = lambda: socket.AF_INET

Y la idea de Owen sigue siendo buena para más adelante. Pon la IPv4 pública del hotel en la lista de IP permitidas de la clave, para que una clave robada no sirva en otro lugar.

Solución aceptada♥ 6

Traducido del English por IA ·

La línea de gai.conf lo solucionó, ahora cada llamada tarda menos de un segundo. También añadí nuestra IPv4 pública a la lista de permitidos de la clave, como dijiste. ¡Gracias David!

QoS 1 and a lot of patience.
♥ 0
Viendo 5 entradas – de la 1 a la 5 (de un total de 5)
  • Debes estar registrado para responder a este debate.

Únete a la conversación

Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

Compartir