Aller au contenu
Krikroff

Ping d'un équipement réseau

Recommended Posts

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 ;).

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce code ping fonctionne parfaitement bien.

Mais j'ai un soucis avec mes PC Windows. Lorsqu'ils sont en marche la fonction socket Net.FtcpSocket ne fonctionne pas et bloque le code (port 80 ou autres). Par contre pour mes PC Linux, pas de soucis.

 

Pouvez-vous m'aider pour ce problème ?

 

Merci d'avance pour votre réponse

Partager ce message


Lien à poster
Partager sur d’autres sites

Regarde le firewall de windows

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai désactivé totalement le firewall windows mais à  ma requête ping par le HC2 il considère que l'ordi n'est pas trouvable (l'error code est 2).

J'ai crée une règle pour autoriser les requête ping(ICMP v4) sur le firewall de l'ordi mais rien y fait.

 

Je n'arrive pas à  comprendre pourquoi l'ordi ne fait pas echo à  ma requete ping via le HC2 alors que le firewall est totalement desactivé (antivirus également)????

Partager ce message


Lien à poster
Partager sur d’autres sites

Juste une question: que se passe-t-il si tu fais un ping de sur l'adresse du PC depuis cmd.exe: ouvre une fenêtre de commande puis ping xxx.xxx.xxx.xxx

Partager ce message


Lien à poster
Partager sur d’autres sites

ça marche via l'invite de commande

Je pense que le HC2 ne passe par par le protocole ICMP pour faire un ping mais TCP avec un numero de port. 

J'ai essayé de créer un code avec la commande os.execute en lua mais ça ne fonctionne pas (la fonction doit-être désacivée je pense)

Partager ce message


Lien à poster
Partager sur d’autres sites

Exact os.execute la fonction est désactive.

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour informations, en remplaçant la requête TCP par une requête UDP (via la fonction Net.FUdpSocket()) ca fonctionne au niveau du code et même avec le firewall activé.

 

Par contre, je ne sais toujours pas pourquoi via  Net.TCpSocket(), ça ne fonctionne pas avec Windows ??

Partager ce message


Lien à poster
Partager sur d’autres sites

Cela devrait fonctionner :mellow: . Essaies tu de faire du ping sur une ip distante ou un ordinateur du même réseau que ton HC2 ? Quand je parle de réseau c'est àdire est-ce tes ordi et ton HC2 ont tous une adresse qui commence pareil ex. 192.168.xxx.xxx ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui tout a fait on parle de la même chose, des ordis sur le même routeur (192.168.1.xx). Les requêtes ping fonctionnent via l'invite de commande (ping 192.168.1.xx), mais si je fais une requête via la HC2 avec la fonction Net.Ftcpsocket et ton code lua, cela ne marche pas si mon pare-feu windows est activé (la fonction ne s'execute pas et bloque le code). Et si je désactive le pare-feu le code me retourne un errocode 2 et considère mon ordi éteint (l'ordi ne renvoi pas d'echo ping à  la HC2).

 

 

Je me prends la tête depuis ce matin et je n'arrive pas à  trouver une solution sur le net pour que mon pare-feu puisse accepter la requête tcp ping de la box.

Partager ce message


Lien à poster
Partager sur d’autres sites

Si c'est un windows 7 ou 8 vérifie que c'est  réseau de maison ou bureau et pas public dans le paneau de configuration

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai le même souci pour mon portable en window8 et mon ordi principal principal en window7. Je suis bien en réseau maison et pas public dans le panneau de config. Pour mon Syno, un autre ordi en linux, j'ai pas de soucis avec le code de Krikoff.

Partager ce message


Lien à poster
Partager sur d’autres sites

juste pour info, ça n'a rien à  voir avec un ping ... ça teste une reponse sur le port 80 (généralement utilisé par un serveur web) ...

-> si pas de serveur HTTP sur l'équipement, ça retournera une "erreur" meme si le device est bien allumé :)

 

un ping est une requete ICMP, pas TCP ni UDP :)

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, je pense que nous sommes tous bien d'accord avec cela ;-), c'est bien pour cela que j'utilise un script sur mon serveur perso pour faire du Ping sur mes équipements distants. Juste qu'il n'y a pas de fonction pour faire cela sur le HC2 et que les librairies nécessaires sont bloquées par Fibaro pour des raisons de sécurité donc...

Après il n'y a pas non plus beaucoup d'équipement réseau sans ip et sans port !! Mais c'est un abus de la langage effectivement ;-)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Je pense aussi que c'est la raison pour lesquelles je n'arrive àappliquer ce code sur mes ordis windows qui n'ont pas de serveur. Alors que par défaut sur Ubuntu, le serveur http(port 80) est lancé par défaut au démarrage.

Partager ce message


Lien à poster
Partager sur d’autres sites

Il y a bien un port ouvert sur tes ordinateurs non ?

local _devicePort = 19;

Partager ce message


Lien à poster
Partager sur d’autres sites

krikroff : en effet un équipement réseau sans IP ça devient rare ... (mais pour info, ça existe :) )

par contre tous les équipements réseau n'ont pas le port 80 ouvert ... comme par exemple un pc windows sans serveur http :)

 

tonio50 :

pour windows, il faut déjà  vérifier tes paramètres de firewall et de partage de fichier ... tu peux essayer sur le port 139, c'est le netbios donc si tu peux partager un répertoire sur ton pc, ça devrait répondre :)

pour linux (ubuntu ou autre), le port 80 n'est pas ouvert "par défaut", tu dois installer un serveur web, en général Apache ... tu peux aussi tester le 22 qui est le port qui te permet de te connecter en ssh sur la machine, mais là  aussi le service doit etre activé à  l'installation ou par après ... 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai essayé sur des ports sensés être ouverts, mais l'ordi ne répond pas (errorcode = 2) sur la requête  tcpSocket:write("test")    alors que l'ordi est allumé. Si j'active le firewall windows, et en faisant la manipulation dans le panneau de config pour qu'il autorise les requêtes tcp sur le port, le firewall empêche la connection de la socket. (fonction Net.FTcpsocket ).

 

Je pense qu'il y a une manip à  faire au niveau du firewall quelque part mais je n'arrive pas à  trouver quoi?

Partager ce message


Lien à poster
Partager sur d’autres sites

tonio50 : tu as testé quels ports ??? sur un windows sans services ajoutés et configuré sans partage de fichiers, il n'y a pas grand chose d'ouvert :)

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai tapé la commande netstat pour voir les ports de l'ordi. J'ai également essayé d'autoriser un port dans le pare feu en créant une règle de trafic entrant pour le tcp et aussi les requêtes ICMPv4. Mais je n'arrive toujours pas àavoir de réponse de l'ordi via la HC2.

Partager ce message


Lien à poster
Partager sur d’autres sites

laisse tomber netstat ça ne sert pas à  ça :)

 

OK pour le firewall mais si tu n'as pas un service qui répond sur le port que tu as ouvert, c'est tout à  fait normal que tu reçoive une erreur :)

 

j'explique : 

imagine que tu ouvres le port 80 au niveau du firewall 

ça veut dire que la requete que tu vas envoyer sur le port 80 ne sera pas bloquée

première partie OK :)

mais ça ne veut pas dire qu'elle va recevoir une réponse ! 

pour cela tu dois installer un serveur web configuré pour répondre sur le port 80 ...

et LA seulement tu recevras une réponse ...

 

perso, pour du windows, j'autoriserais le partage de fichiers et je testerais le port 139 ... sinon pour tout le reste tu vas devoir installer un programme supplémentaire pour "répondre" ... 

ou alors activer le remote desktop et tester le 3389

Partager ce message


Lien à poster
Partager sur d’autres sites

Conclusion: demander à  fibaro d'implémenter le protocole ICMP 

C'est quand même fait pour ça à  l'origine, en plus je suis sà»r qu'il y a tout ce qu'il faut , ça m'étonnerait qu'ils puissent exploiter tcp et udp sans jamais faire le moindre appel à  l'ICMP.

Partager ce message


Lien à poster
Partager sur d’autres sites

×