Aller au contenu
Krikroff

Ping d'un équipement réseau

Recommended Posts

C'est vrai que sur la Vera c'était bien pratique avec la fonction os.execute et les possibilités étaient importantes au niveau des plugins. Maintenant point de vue sécurité, je sais pas trop si ouvrir le protocole ICMP est dangeureux ???

Partager ce message


Lien à poster
Partager sur d’autres sites

certainement pas plus que tcp/udp :)

mais bon, c'est pas vraiment ànous de décider donc ... faut bien faire avec :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Ici l'idée est d'obtenir la réponse d'une IP sur un port, nous sommes toujours sur note réseau local, c'est tout l’intérêt de ce script sur le HC2... Je pense que tout le monde à  un firewall correctement paramétré au niveau de son routeur alors pas vraiment de soucis ;).

 

Toutes les librairies sont présentes sur le HC2 n'oublions pas qu'a la base c'est un serveur :) , mais Fibaro suite à  de gros problèmes avec des scripts d'utilisateurs à  décidé d'exposer uniquement quelques méthodes avec une surcouche logiciel Fibaro :huh:, moi ça me saoul mais en même temps j'imagine le support Fibaro :15: avec des gens qui pètent un câble pour une box HS par un script et faire comprendre les choses alors que l'utilisateur ne fait pas la différence entre un "string" et un "number".... je peux comprendre :D

 

@tonio50: super heureux que cela marche pour toi maintenant, cool :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

krikroff : moi perso j'ai un vrai firewall derrière ma box internet mais bon :)

 

pour Fibaro, je crois en effet qu'ils ont déjà  vraiment assez de boulot en retard (ne fut-ce que pour délivrer une doc un peu correcte) sans rajouter des demandes en provenance d'utilisateurs qui auraient fait une fausse manip :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Je suis d'accord avec tous, ils ont assez de retard pour ne pas leur remettre des problèmes que l'on sait contourner, après d'un point de vue purement technique faire une requête à  un service pour s'assurer qu'une machine est up, c'est un peu overkill ( le service peut -être planté sans que la machine ne soit down), et ça semble assez commun comme usage que de vouloir pinger des choses pour s'assurer que tout est en vie, dans un système domotique.

 

 

/mode "chieur" off

 

 

"chieur" est un string

Partager ce message


Lien à poster
Partager sur d’autres sites

@biboun, je complétement en accord avec toi :60:... L'idée était que les utilisateurs rechercheraient plus naturellement "Ping" que "tester un service" :blink:.

 

PS: Je ne faisais pas d'allusions à  des personnes du forum, mais tu as raison "chieur" est bien un string :93:

 

:98:

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce bout de code LUA permet de faire un Ping sur un équipement de votre réseau.

 

Première publication sur le Forum Fibaro ici http://forum.fibaro.com/viewtopic.php?t=1927

 

Les variables sont les suivantes:

 

deviceIp : Adresse IP du périphérique réseau à  contacter.

devicePort : Port

maxRetryProcess : Nombre de tentatives pour contacter le périphérique.

--[[
%% properties
%% globals
--]]

-- Ping v 1.0.1 [05-2013]
-- Copyright © 2013 Jean-christophe Vermandé

fibaro:log("Start process");

local _deviceIp = "192.168.1.250";
local _devicePort = 80;
local _maxRetryProcess = 5;

-- recursive function to ping device
local function _ping(retry)
  retry = retry or 0;
  --open the socket
  local tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
  --set the read timeout
  tcpSocket:setReadTimeout(250);
  --notify user
  fibaro:log("Search on the local network, try #" .. retry .. " please wait...");
  fibaro:sleep(250);	
  --send packet
  local bytes, errorCode = tcpSocket:write("test");
  --check for error  	
  if errorCode == 0 then
    return true;
  else
    if retry < _maxRetryProcess then
      fibaro:log("Retry process, please wait...");
      fibaro:sleep(1000);
      return _ping(retry + 1);
    end
    return false;
  end
end

--ping device, secure with pcall to catch errors.
local f, result = pcall(_ping);

if (f) then
  if (result == true) then
    fibaro:log("Device has been found, is awake and listening.");
  else
    fibaro:log("Device was not found!");
  end
else
  fibaro:log("Error: " .. f);
end

Notez l'utilisation de la fonction LUA pcall qui permet l’exécution du code en mode "protégé" ou "encapsulé", c'est à  dire qu' il ne lèvera pas d' erreur dans le processus de votre box si jamais le code provoquait une erreur. La box est protégée, vos scènes aussi ;).

 

Tout d'abord, merci pour le script.

 

J'ai fouillé les forums mais je ne trouve pas réponse à  ma question : pourquoi un "_maxRetryProcess" ? Je souhaiterais que le ping tourne en boucle non-stop de tel sorte que sur changement d'état, je puisse actionner un scénario.

 

Pour le moment, j'ai créé un device virtuel et utilisé ton code dans le main loop, l'idée étant de ne pas devoir cliquer sur un bouton pour lancer le ping. 

 

Mon main loop fonctionne. Mon routeur est allumé et ping. Je le reboot et mon device virtuel change de status, l'icône de mon device également. Par-contre, dès que le routeur a terminé son reboot et est à  nouveau en ligne, le device virtuel ne se remet pas à  jour. J'ai vu sur un de tes posts sur un autre forum qu'il semblait nécessaire de lancer un "FTcpSocket:disconnect();".

 

Serais-tu en mesure d'apporter ton aide ?

Partager ce message


Lien à poster
Partager sur d’autres sites

- Le maxRetryProcess est la pour limiter le nombre de tentatives.

- Pour utiliser ce code en boucle il suffit comme vous l'avez fait: le mettre dans le main loop d'un périphérique virtuel avec un fibaro:sleep(xxx); en fin de code pour fixer le refresh ex: fibaro:sleep(120000); -> toutes les 2  minutes, c'est très important.

- Si ce code est utilisé dans un mainloop, oui je voius  conseil d'ajouter un tcpSocket:disconnect(); juste après la ligne suivante: local bytes, errorCode = tcpSocket:write("test");

Partager ce message


Lien à poster
Partager sur d’autres sites

1) Mais si c'est un ping, pourquoi un maxRetryProcess? Je conçois que le process pourrait tourner indéfiniment, mais en même temps dans ce cas c'est pas ce qu'on cherche ?

 

2) Pourriez-vous être plus précis sur l'emplacement où introduire le figaro:sleep(xx) ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Parce-que ce n'est pas du vrai Ping mais une interrogation d'un service sur une IP / Port. De plus il n'est pas utile d'occuper du proc + mémoire (socket) pour cela...

 

Pour le sleep, c'est sur la dernière ligne du mainloop !

Partager ce message


Lien à poster
Partager sur d’autres sites

A ce sujet Krikoff, ( le sleep dans la mainloop), le hc2 est-il malin ?

Je voyais la main loop comme un cron qui troune toutes les 3 sec, du coup le principe du sleep n'aurait fait que lancer dans la nature un nouveau process tous les 3 secondes, chaque process se mettant en sleep, puis continuant sa vie, et donc a terme une finité de process lancés..

 

Mais ça semble marcher pourtant ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c'est normal, je suis persuadé que le MainLoop est juste un while true do ...

Partager ce message


Lien à poster
Partager sur d’autres sites

mais si c'est un while true do, cela veut dire que ton sleep bloque totalement la boucle non ?

 

Il y a une boucle dédiée  par VD au final ? (pas très MAIN dans ce cas :)  )

 

Dans ce cas ils ont juste fait while true do avec déjà  un sleep  à  3 secondes dedans ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui je suis d'accord avec toi, d'ailleurs certains problèmes sur la stabilité pourraient provenir de cette conception un peu cheap !

Oui le sleep bloque totalement la boucle c'est bien ça et puis le sleep c'est aussi un while t >= 3000ms do si tu veux mon avis. Bref, des boucles dans des boucles Outch le sac de nœuds :-( Mais en même temps ça marche alors !

Partager ce message


Lien à poster
Partager sur d’autres sites

Rassure moi il ne bloque que la boucle du VD en question hein  ?  :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui pas d'inquiétude il bloque uniquement la boucle du VD ! Il ne bloque pas les boutons du VD non plus.... Heureusement :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello !

 

Une idée pour faire un "ping" sur un smartphone Android ?

Je n'ai pas trouver de port ouvert...

Partager ce message


Lien à poster
Partager sur d’autres sites

Il semble que l'application Sonos ouvre le port 3500. Peut être une piste ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Effectivement, cela fonctionne avec le port 3500 !

 

J’espère que Sonos n'a pas prévu de modifier ça.

 

Merci Krikroff !

Partager ce message


Lien à poster
Partager sur d’autres sites

De rien ;)

Espérons oui que sonos ne change rien mais bon y'a pas de raisons...

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir,

 

quelqu'un a une idée du port pour un mac sur la freebox?

 

Merci

 

Sébastien

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu cherche un port ouvert sur un mac ? La freebox n'intervient pas a ce niveau en local ...

Envoyé de mon iPhone àl'aide de Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Krikroff encore pour ce tuto.

J'ai cependant quelques questions. J'ai mis ton code dans un module virtuel avec les modifs que tu avais cité ci dessus.

Je chercher a savoir si mon téléphone est connecté au réseau. Jusque là , je pense que je suis bon...

J'ai donc ouvert mon panneau d'admin de la freebox (V6) et j'ai trouvé l'adresse IP de mon téléphone.

 

J'ai donc renseigné l'@IP de mon téléphone dans ton script mais je ne pense pas que cela soit passé.

 

Voici donc mes questions :

- où puis je trouver le port utilisé par mon téléphone (windows phone)

- comment puis-je être certain que mon tel a été trouvé (a part le log).

 

Désolé pour ces questions de newbie...

Partager ce message


Lien à poster
Partager sur d’autres sites

×