Aller au contenu
jjacques68

Scène Pour Tester Son Ip Public

Recommended Posts

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

en fait SI la scène s'arrête.

0 instance si plus de connexion.

 

Comment peut on y remédier ... :15:

Partager ce message


Lien à poster
Partager sur d’autres sites

et si tu mettais le tout dans un while true do

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

espérons que ça ne marche pas alors ...

Partager ce message


Lien à poster
Partager sur d’autres sites

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" :2:!!!

Partager ce message


Lien à poster
Partager sur d’autres sites

pour info, il existe le "pcall" en LUA pour palier àce genre de plantée.

Partager ce message


Lien à poster
Partager sur d’autres sites

oui j'ai déjà  vu cette fonction,

 

mais je sais pas où m'en servir, et quoi faire du retour de cette fonction...

Partager ce message


Lien à poster
Partager sur d’autres sites
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Si tu as le temps, volontiers, je suis curieux du résultat.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !!

 

:15:

Partager ce message


Lien à poster
Partager sur d’autres sites

×