Krikroff Posté(e) le 30 décembre 2013 Signaler Posté(e) le 30 décembre 2013 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 . 3
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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)????
Krikroff Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 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
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 ç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)
Shad Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 Exact os.execute la fonction est désactive.
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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 ??
Krikroff Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 Cela devrait fonctionner . 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 ?
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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.
Shad Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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.
jimbo007be Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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 1
Krikroff Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 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 ;-) 1
tonio50 Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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.
Krikroff Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 Il y a bien un port ouvert sur tes ordinateurs non ? local _devicePort = 19;
jimbo007be Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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 ...
tonio50 Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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?
jimbo007be Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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
tonio50 Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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.
jimbo007be Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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
tonio50 Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 Je te remercie pour tes infos et ça fonctionne sur le port 139 après avoir autoriser le partage de fichier. Merci encore
biboun Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 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.
jimbo007be Posté(e) le 17 janvier 2014 Signaler Posté(e) le 17 janvier 2014 je crois qu'ils doivent déjàavoir une liste de demandes qui fait 3km de long
Messages recommandés