L'appel Python à l'endpoint des dernières valeurs bloque pendant deux minutes sur notre Pi
Traduit de English par IA ·
Je fais tourner un petit écran d’accueil dans notre hôtel, un Pi 4 qui affiche les températures du frigo de la cuisine. Un script Python demande à Hermetry les dernières valeurs toutes les 5 minutes avec une clé API (preset « Read only ») :
GET /tenant/<tenantId>/api/telemetry/latest?kind=iot_device&entityId=<deviceId>&keys=temperature
Authorization: Bearer sk_live_...
La plupart des appels prennent environ 2 minutes, certains expirent, puis parfois un appel répond instantanément. Depuis mon ordinateur portable sur le même Wi-Fi, c’est toujours instantané. J’ai testé curl sur le Pi pour comparer :
curl -4 ... -> 0.3 s
curl -6 ... -> hangs, then "Failed to connect"
Notre FAI attribue de l’IPv6 depuis le changement de routeur le mois dernier. Je ne connais pas grand-chose à l’IPv6 : puis-je simplement faire utiliser l’ancienne méthode au Pi ?
I run a little lobby screen at our hotel, a Pi 4 that shows the kitchen fridge temperatures. A Python script asks Hermetry for the latest values every 5 minutes with an API key (Read only preset):
GET /tenant/<tenantId>/api/telemetry/latest?kind=iot_device&entityId=<deviceId>&keys=temperature
Authorization: Bearer sk_live_...
Most calls take about 2 minutes, some time out, then sometimes one is instant. From my laptop on the same Wi-Fi it is always instant. I tried curl on the Pi to compare:
curl -4 ... -> 0.3 s
curl -6 ... -> hangs, then "Failed to connect"
Our ISP hands out IPv6 since a router swap last month. I don’t know much about IPv6, can I just make the Pi use the old way?
Traduit de English par IA ·
Ne serait-ce pas la liste blanche d’adresses IP de la clé API qui bloque parfois votre accès ?
Could it be the API key’s IP allowlist blocking you sometimes?
Traduit de English par IA ·
Cela vous donnerait immédiatement une erreur 401 ou 403, et non un blocage. Le plus simple est de désactiver IPv6 sur le Pi avec sysctl.
That would give you a 401 or 403 straight away, not a hang. Easiest is to turn IPv6 off on the Pi with sysctl.
Traduit de English par IA ·
Exactement le même problème sur un de nos sites après que le FAI a activé l’IPv6. Le Pi obtient une adresse IPv6, il l’essaie en premier, la route est cassée et il attend le délai d’expiration avant de revenir à IPv4. Votre test curl le montre.Je ne voulais pas désactiver l’IPv6 partout, j’ai donc configuré le Pi pour préférer IPv4. Décommentez cette ligne dans /etc/gai.conf :
precedence ::ffff:0:0/96 100
Pas besoin de redémarrer pour les nouveaux processus, redémarrez simplement votre script. Si vous ne le voulez que pour le script, vous pouvez le forcer en Python avant d’importer requests :
import socket
import urllib3.util.connection as conn
conn.allowed_gai_family = lambda: socket.AF_INET
Et l’idée d’Owen reste bonne pour plus tard. Ajoutez l’IPv4 publique de l’hôtel à la liste d’autorisation IP de la clé, afin qu’une clé volée soit inutile ailleurs.
Had exactly this at one of our properties after the ISP turned IPv6 on. The Pi gets an IPv6 address, tries it first, the route is broken and it waits for the timeout before falling back to IPv4. Your curl test shows that.
I didn’t want to switch IPv6 off for everything, so I told the Pi to prefer IPv4. Uncomment this line in /etc/gai.conf:
precedence ::ffff:0:0/96 100
No reboot needed for new processes, just restart your script. If you only want it for the script, you can force it in Python before importing requests:
import socket
import urllib3.util.connection as conn
conn.allowed_gai_family = lambda: socket.AF_INET
And Owen’s idea is still a good one for later. Put the hotel’s public IPv4 in the key’s IP allowlist so a stolen key is useless elsewhere.
Traduit de English par IA ·
La ligne dans gai.conf a résolu le problème, chaque appel prend maintenant moins d’une seconde. J’ai aussi ajouté notre IPv4 publique à la liste d’autorisation de la clé, comme tu l’as suggéré. Merci David !
The gai.conf line did it, every call is under a second now. I also added our public IPv4 to the key’s allowlist like you said. Thanks David!
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

