jjacques68 Posté(e) le 15 octobre 2016 Signaler Posté(e) le 15 octobre 2016 Hello tous ! je viens de créer une toute petite scène qui fonctionne plutôt bien pour connaitre mon IP public depuis la HC2. Ayant une connexion 4G de secours (au cas où plantage de l'ADSL), je souhaite être averti sur mon tél du changement de connexion. --[[ %% autostart %% properties %% events %% globals --]] --demande de l'adresse IP function RequestIP() local IP = net.HTTPClient() IP:request("http://bot.whatismyipaddress.com/", { success = function(response) CheckIp(response.data) end, Error = function(err) print("Err : "..err) setTimeout(RequestIP, 5000) end }) end --analyse l'adresse IP function CheckIp(IP) local i=1 local detail={} --inscrit les 4 parties de l'adresse dans le tableau detail for Num in string.gmatch(IP, "%d+") do detail[i] = Num i=i+1 end --vérifié la 1ère partie : 176 = ADSL et 80 = GSM if tonumber(detail[1]) == 176 then print("ADSL - "..IP) elseif tonumber(detail[1]) == 80 then print("GSM - "..IP) else print("Déconnecté - "..IP) end --bouclage setTimeout(RequestIP, 5000) end RequestIP() là je fais un test toutes les 5 secondes et j'affiche le résultat dans le debug. ça marche bien sauf que : Lorsque je débranche l'ADSL, pendant quelque seconde (< 1 min), la scène semble planter (malgré le traitement "ERROR"). Je dis semble car, son instance est toujours active mais je n'ai pas le message "ERR : ..." dans le debug, ni le "Déconnecté..." !! Plus rien ne s'affiche. Suis obligé de l'arrêté manuellement et de la relancer ! J'ai loupé quelque chose ? merci pour vos avis !! PS : y a t il un moyen plus simple pour récupérer le premier groupe de chiffre avant le "." de l'IP ? je trouve ma méthode un peu compliqué - j'ai essayé avec un string.find(IP, ".") mais sans résultat.
jjacques68 Posté(e) le 15 octobre 2016 Auteur Signaler Posté(e) le 15 octobre 2016 en fait SI la scène s'arrête. 0 instance si plus de connexion. Comment peut on y remédier ...
jojo Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 et si tu mettais le tout dans un while true do
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 Ben le while true do est remplacé par le setTimeout ! Je pense qu'il y a un problème de timeout dans la requête. Je ne reçoit pas de réponse àtemps et relance une requête avant que la précédente ne soit terminée. J'ai passé de 5 secondes à5 minutes le setTimeout et depuis pas de problème... Mais je n'arrive pas àrécupérer le code retour, je reçois toujours 200 (ok) alors que en cas de problème de connexion au site je devrais avoir 404 ou 504 !
jojo Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 je suis LOUIN d'être un pro de la programmation, mais je crois que le setTimout est de l'asynchrone. et peut-être qu'il relance àchaque fois une nouvelle instance de ta scène, avlors qu'avec le while true, il devrait rester dans la même nstance. Remplace ton setTimeout par un while true do pour voir
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 J'utilise souvent le setTimeout et j'ai pas d'instance en plus. Par contre Net.httpclient est aussi asynchrone... Mais je vais essayer de faire ce que tu me dis dès que je suis devant le pc, Te tiens au jus... Merci
jojo Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 je ne suis PAS développeur, c'est juste une idée àla con en plus. De toute façon, tu n'as pas grand chose àperdre
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 Mais si marche, tout ce que je croyais comprendre s'effondrera
jojo Posté(e) le 17 octobre 2016 Signaler Posté(e) le 17 octobre 2016 espérons que ça ne marche pas alors ...
jjacques68 Posté(e) le 17 octobre 2016 Auteur Signaler Posté(e) le 17 octobre 2016 alors je viens de tester sans le setTimeout : --demande de l'adresse IP function RequestIP() local IP = net.HTTPClient() IP:request("http://bot.whatismyipaddress.com/", { success = function(response) CheckIp(response.data) end, Error = function(err) print("Err : "..err) --setTimeout(RequestIP, 5000) end }) end --analyse l'adresse IP function CheckIp(IP) local i=1 local detail={} --inscrit les 4 parties de l'adresse dans le tableau detail for Num in string.gmatch(IP, "%d+") do detail[i] = Num i=i+1 end --vérifié la 1ère partie : 176 = ADSL et 80 = GSM if tonumber(detail[1]) == 176 then print("ADSL - "..IP) elseif tonumber(detail[1]) == 80 then print("GSM - "..IP) else print("Déconnecté - "..IP) end --bouclage --setTimeout(RequestIP, 5000) end while true do RequestIP() fibaro:sleep(5*60*1000) end Mais rien ne se passe... même pas une première réponse... je devrais avoir au moins ADSL - xxx.xxx.xxx.xxx une fois ! nan ? A moins que j'ai mal placé le while true do ? J'ai remis le setTimeout et c'est redevenu normal. Au moins on est fixé. Bon j'ai contourneé le problème avec le watchdog qui relance la scène si elle plante, mais elle ne devrait pas planter logiquement ! Pour une fois que je traite le cas "error" !!!
Steven Posté(e) le 25 octobre 2016 Signaler Posté(e) le 25 octobre 2016 pour info, il existe le "pcall" en LUA pour palier àce genre de plantée.
jjacques68 Posté(e) le 25 octobre 2016 Auteur Signaler Posté(e) le 25 octobre 2016 oui j'ai déjà vu cette fonction, mais je sais pas où m'en servir, et quoi faire du retour de cette fonction...
Steven Posté(e) le 25 octobre 2016 Signaler Posté(e) le 25 octobre 2016 setTimeout(pcall(function() RequestIP() end), 5000) Devrait ... normalement ... capturer l'erreur et empêcher que le script ne s'arrête. Bien que j'ai jamais tester son comportement avec une requête HTTP asynchrone à l’intérieur du pcall. Le retour tu t'enfiche dans ce cas puisque de toute façon tu relance ta requête toute les 5 secondes.
jjacques68 Posté(e) le 25 octobre 2016 Auteur Signaler Posté(e) le 25 octobre 2016 Je teste ça dès que je peux, Je tiens au courant ! Merci !
Steven Posté(e) le 25 octobre 2016 Signaler Posté(e) le 25 octobre 2016 Si tu as le temps, volontiers, je suis curieux du résultat.
jjacques68 Posté(e) le 25 octobre 2016 Auteur Signaler Posté(e) le 25 octobre 2016 alors je viens d'essayer ta proposition : setTimeout(pcall(function() RequestIP() end), 5000) mais ça ne fonctionne pas, c'est comme si le setTimeout n'était plus temporisé. ça enchaine les boucles à la suite (plusieurs par seconde) et du coup j'ai essayé de placer le pcall sur l'appel de la fonction check : pcall(CheckIp, response.data) Mais le comportement reste le même, que précédemment, c'est à dire arrêt de la scène quand plus de connexion. Et toujours sans message d'erreur !!
Messages recommandés