Aller au contenu
jjacques68

Question TCPSocket

Recommended Posts

bon ben mon principe de sémaphore ne fonctionne pas.

 

Manque de réactivité entre le changement d'état du QA et la scène... :( 

Partager ce message


Lien à poster
Partager sur d’autres sites

 

 

@Krikroff tu avais raison, c'est la commande "read" qui permet de détecter une déconnexion : "End of file".

La reconnexion est donc quasi immédiate (1 seconde max).

 

sauf que si une commande write est envoyée pendant ce temps, c'est la merde total.

pas réussi à empêcher d'une manière propre le "write" si plus de connexion.

 

:( la seule chose qui me fait qqch de stable, c'est :

 

d'avoir créé une variable "Status" dans le QA, qui prend 1 ou 0 selon le status de la socket.

 

Alors attention, surtout pas passer la variable à 0 dans la méthode "close".

ça prend trop de temps de traitement.

Il faut la mettre à 0 dès qu'on intercepte l'erreur.

 

je teste, avant de faire le "write", le status de cette variable.

si 1 j'envoie, si 0 j'envoie pas, le paquet est perdu !

 

j'ai essayé de mettre, juste avant la commande write:

while self:getVariable("Status") == 0 do
	fibaro.sleep(100)
end

mais dans le cas où Status = 0, le QA se fige, pas de crash, pas d'erreur, rien !

Dommage ça m'aurait évité de perdre des paquets...

 

punaise, j'utilise des sockets partout au boulo entre les automates et des PC pour récupérer des données !! jamais vu ça !!

 

Voici le code, si qqun a une solution !! je suis preneur !

 


function QuickApp:onInit()
    self:setVariable("Status", "0")
    self:debug("onInit")
    self.ip = "192.168.2.8"
    self.port = tonumber("2000")
    self.sock = net.TCPSocket()
    self:connect()
end

function QuickApp:connect()
    self.sock:connect(self.ip, self.port, {
        success = function()
            self:setVariable("Status", "1")
            self:debug("OPEN - connected")
            self:waitForResponseFunction()
        end,
        error = function(err)
            self:setVariable("Status", "0")
            self.sock:close()
            self:debug("OPEN ERROR - "..err)
            fibaro.setTimeout(2000, function() self:connect() end)
        end,
    })
end

function QuickApp:close()
    self.sock:close()    
end

function QuickApp:waitForResponseFunction()
    self.sock:read({
        success = function(data)
            self:debug("RX - "..data)
            self:waitForResponseFunction()
        end,
        error = function(err)
            self:setVariable("Status", "0")
            self:debug("READ ERROR - "..err)
            self.sock:close()
            fibaro.setTimeout(200, function() self:connect() end)
        end
    })
end


function QuickApp:send(strToSend)
    if self:getVariable("Status") == "1" then
        self.sock:write(strToSend.."\n", {
            success = function()
                --self:debug("TX - "..strToSend)
            end,
            error = function(err)
                self:setVariable("Status", "0")
                self:debug("WRITE ERROR - "..err)
                self.sock:close()
                fibaro.setTimeout(200, function() self:connect() end)
            end
        })
    end
end

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

La seule solution c’est de faire une file d’attente (queue) du type FIFO, rien n’existe nativement en LUA il faut coder ! J’ai cela dans mes scripts si tu peux attendre ce soir sinon tu peux le faire il y a pleins d’exemples certainement sur internet pour t’inspirer mais cela te parle déjà peut-être alors let’s go


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

une VG avec les data séparées par un séparateur ?

 

tant que la VG est <> "" on traite un par un ?

 

La scène n'envoie pas directement sur la socket, mais rempli cette VG ?

 

(super... en lua ... :wacko:) :) 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Hum derrière VG c’est des accès en lecture et écriture sur la base, je n’aime pas trop et les accès concurrents seront-ils correctement pris en charge... mais tu n’auras peut-être pas le choix de faire autrement...

Je serai parti sur l’option: tableau dans le QA alimenté par une méthode du QA exposée accessible par les scènes. Et si tu dois passer par une GV il est préférable de tout gérer depuis ton QA pour la maintenance de tout ça par la suite et avoir le moins de code possible dans tes scènes.

Courage


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

bon c'est fait, 

c'était pas la mort à faire...

ça à l'air ok.

mais je suis sceptique sur l'appel de la méthode "send", que j'ai peut-être trop souvent inséré dans le code...

si tu as 5 minutes, peux tu y jeter un oeil ?

 

merciiii !

 

---------------------------------------------------------------------------------------
-- 12/03/2020 - V1 : permet d'envoyer les infos des device vers Display Soft
-- 19/03/2020 - V2 : utilise un tableau pour faire du FIFO
---------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
function QuickApp:onInit()
    self:debug("onInit")
    self:setVariable("Status", "0")
    self:updateProperty("value", false)
    self.ip = self:getVariable("IP")
    self.port = tonumber(self:getVariable("Port"))
    self.sock = net.TCPSocket()
    self.ListElement = {} 
    self:connect()
end

---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
function QuickApp:connect()
    self.sock:connect(self.ip, self.port, {
        success = function()
            self:setVariable("Status", "1")
            self:updateProperty("value", true)
            self:debug("OPEN - connected")
            self:waitForResponseFunction()
            self:send()
        end,
        error = function(err)
            self:setVariable("Status", "0")
            self.sock:close()
            self:debug("OPEN ERROR - "..err)
            fibaro.setTimeout(500, function() self:connect() end)
        end,
    })
end

---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
function QuickApp:close()
    self.sock:close()    
    self:updateProperty("value", false)
end

---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
function QuickApp:waitForResponseFunction()
    self.sock:read({
        success = function(data)
            self:debug("RX - "..data)
            self:waitForResponseFunction()
        end,
        error = function(err)
            self:setVariable("Status", "0")
            self:debug("READ ERROR - "..err)
            self.sock:close()
            fibaro.setTimeout(200, function() self:connect() end)
        end
    })
end

---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
function QuickApp:send()
    if self:getVariable("Status") == "1" then
        if self.ListElement[1] then 
            self.sock:write(self.ListElement[1].."\r", {
                success = function()
                    table.remove(self.ListElement,1)
                    if #self.ListElement > 0 then self:send() end
                end,

                error = function(err)
                    self:setVariable("Status", "0")
                    self:debug("WRITE ERROR - "..err)
                    self.sock:close()
                    fibaro.setTimeout(200, function() self:connect() end)
                end
            })
        end
    end
end

---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
function QuickApp:AddElement(element)
    if element ~= "" then
        table.insert(self.ListElement,element)
        self:send()
    end
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bien joué ;)

 

Mais j'ai peur que tu rencontre des soucis à cause d'un risque de désynchronisation, par exemple si tu as un problème de socket tu va bien continuer à alimenter ton tableau mais rien ne te garanti que les items dans le tableau seront tous envoyés ... enfin je sais pas si je suis très clair, dis-moi ;) 

Partager ce message


Lien à poster
Partager sur d’autres sites

et bien j’ai fais des essais, et si la socket tombe, le tableau à l’air de garder les infos, car je les vois arriver dès que je remets le serveur en route.

elles apparaissent bien en premier.

et le tableau continue à stocker les données suivantes.

 

ben écoute je pense que ça va le faire comme ça...

je vais surveiller ça sur le long.

 

là j’ai continué à migrer d’autres device. Suis loin d’avoir fini...

 

merci pour ton aide précieuse @Krikroff

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

C’est parfait

Bon courage pour la suite, si je comprends bien il y a encore des choses à faire :)


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

J'espère qu'il ne fait pas cela sur son temps de télétravail

Envoyé de mon BLA-L29 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Moi oui et je n’arrête pas, la folie... vivement le retour à la normale


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Moi ils m'ont dit reste à la maison
Sans télétravail

Envoyé de mon BLA-L29 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah carrément !!! Enfin pas drôle tout ça...


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui pour le moment c'est l'alsace qui prend chez nous en meurthe et moselle ça commence. Après il faut que les gens respect les consignes. Afin de ne pas saturer les hôpitaux il faut arriver à lissé la courbe des cas qui demande une hospitalisation. Après pour 80 % des cas cela ce passera très bien et une fois que plus de 50 % de la populations aura été contaminé le virus disparaîtera naturellement.

 

J'ai espère que l'on ne sera pas obligé de faire de la médecine de guerre par manque de moyens. Et je trouve inadmissible le mamque de protection pour le personnel soignant

 

Envoyé de mon BLA-L29 en utilisant Tapatalk

 

 

 

 

 

 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Tout à fait d’accord avec toi... nous payons l’arrogance de nos chers dirigeants.
Que tout ça passe très vite et avec le moins de casse possible, ensuite il sera temps d’en tirer des leçons !
Oui oui je crois encore au père Noël


Envoyé de mon iPhone en utilisant Tapatalk

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

mouai j’ai l’impression que les gens ne vont, pas tenir longtemps.

je constate, par rapport au premier jour, de plus en plus de mouvements.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui je pense aussi pas simple lorsque tu es en appartement avec des enfants. Perso je suis à la campagne donc pour moi je peux tenir 2 ou 3 mois sans soucis la j'ai reçu mes connecteurs lcs2 et de 100m de câbles réseau ça va m'occuper quelques jours. J'aurais 400m de câbles d installé. J'ai encore un peu de peinture à faire et je doit terminer ma montée de grenier depuis plus de 15 ans que je dois le faire.

J'aimerai bien terminer mon bois surtout que se suis seul en pleine forêt mais 139 euros ça calme

 

Envoyé de mon BLA-L29 en utilisant Tapatalk

 

 

 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

oui moi j’ai la chance d’être dans une maison avec jardin, donc je peux tenir aussi.

j’ai la HC3 qui va beaucoup m’occuper :) après ce sera ménage :( jardinage...

mais après...

Partager ce message


Lien à poster
Partager sur d’autres sites

Je bosse de la maison et la chance d’être également à la campagne, je pleins vraiment les personnes enfermées en appartement, ça me fait relativiser

 

 

Envoyé de mon iPhone en utilisant Tapatalk

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×