Aller au contenu

Comment Envoyer Une Commande Json ?


Messages recommandés

Posté(e)

Salut,

 

Comme il y a des développeurs très talentueux ici, je me permet de poser une petite question. J'ai besoin d'envoyer une commande json via une connexion TCP en Lua, pour piloter le logiciel Hyperion sur Raspberry, mais je galère un peu :P

 

La commande en question serait par exemple:

{"command":"color","priority":40,"color":[0,255,0],"duration":14400000}

 

J'ai donc essayé un script de cette forme:

 

tcpSocket = Net.FTcpSocket("192.168.0.10", 19444)
tcpSocket:setReadTimeout(200)

commande = {command="color",priority=40,color=[0,255,0],duration=14400000}
commande = json.encode(commande)
fibaro:debug(commande)
tcpSocket:write(commande)
state = tcpSocket:read()
fibaro:debug(state)

 

 

Mais ca ne fonctionne pas, j'obtiens le message d'erreur 

[ERROR] 11:16:06: line 4: unexpected symbol near '['

 

 

Si je met [0,255,0] entre guillemets ", je n'ai pas d'erreur, mais la commande ne fonctionne pas, car il ne me faut pas de guillemets pour cet argument :(

Une idée de comment faire cela ?

 

J'ai testé ces commandes via Putty, elles fonctionnent correctement. Si la commande est bien recue, je dois recevoir en retour un json success = true comme on peut le voir dans la capture ci jointe.

 

post-30-0-17828100-1396258229_thumb.jpg

Posté(e)

Quand on regarde sa on ne voit pas de crochet mais des { }:

{
    "type":"object",
    "required":true,
    "properties":{
        "command": {
            "type" : "string",
            "required" : true,
            "enum" : ["color"]
        },
        "priority": {
            "type": "integer",
            "required": true
        },
        "duration": {
            "type": "integer",
            "required": false
        },
        "color": {
            "type": "array",
            "required": true,
            "items" :{
                "type" : "integer"
            },
            "minItems": 3
        }
    },
    "additionalProperties": false
}

https://github.com/tvdzwan/hyperion/blob/master/libsrc/jsonserver/schema/schema-color.json

Posté(e)

J'ai essayé avec des accolades, et même avec

{"command":"color","priority":40,"color":{"items":0,255,0},"duration":14400000}

 

mais j'ai une erreur de synthaxe (testé avec Putty). Alors que celle que je donne plus haut avec les crochets fonctionne parfaitement sur Putty (elle m'a été donnée par une personne qui a fait un plugin du même genre pour Homeseer).

Posté(e)

Cédric, peux-tu essayer cela:

local commande = [[{command="color",priority=40,color=[0,255,0],duration=14400000}]];
Posté(e)

Ca me retourne un json formaté comme ca: 

 

[DEBUG] 14:09:31: "{command=\"color\",priority=40,color=[0,255,0],duration=14400000}"

 

Il me manque des " à  chaque propriété, et si je les ajoute j'ai des \ qui posent problème aussi.

Posté(e)

Pourquoi faire un json.encode ?

Puisque ta variable commande contient déjàla chaine correcte, àmon avis tu peux l'envoyer directement dans le tcpSocket:write

Posté(e)

Pas grave ;-) Alors le code donne maintenant ca:

tcpSocket = Net.FTcpSocket("192.168.0.10", 19444)
tcpSocket:setReadTimeout(200)
local commande = [[{"command":"color","priority":40,"color":[0,255,0],"duration":14400000}]];
fibaro:debug(commande)
tcpSocket:write(commande)
state = tcpSocket:read()
fibaro:debug(state)

dans le debug j'ai bien ma commande json qui ressemble à  ce que je veux, et aucune erreur:

[DEBUG] 14:31:17: {"command":"color","priority":40,"color":[0,255,0],"duration":14400000}

Mais Hyperion ne réagit pas :(

Par contre normalement Hyperion devrait me renvoyer une synthase Json "success":true si la commande a bien été recue. Ce que j'essaie de vérifier avec fibaro:debug(state) mais ca me retourne une ligne vide. Je devrai soit avoir le success soit une erreur de la part d'Hyperion si la commande n'est pas bonne.

 

J'ai essayé avec

state = tcpSocket:read()
state=json.decode(state)
fibaro:debug(state)

mais là  j'ai le message d'erreur

[ERROR] 14:34:14: line 7: Expected value but found T_END at character 1

Faut juste que j'arrive à  savoir si la commande arrive bien à  Hyperion :/

Posté(e)

Outch, le T_END de la mort à  encore frappé :rolleyes:... Mais pourquoi ont-ils modifiés la librairie JSON... LE T_END en gros c'est une mal formation de la réponse et json.decode plante ! mais c'est peut-être aussi un retour vide :mellow: .

 

Tu peux essayer de virer le json.decode et faire ceci histoire de confirmer ou pas un retour vide :)

fibaro:debug("len: " .. string.len(tostring(state)));
Posté(e)

Ca me retourne 0, donc vide :( Zut. Pourtant sur la méthode, ca te parait correct ? Je fais un write, et derrière un read pour récupérer la réponse, comme on peut le voir dans la capture de mon premier post ?

C'est super simple avec Putty, mais comme je ne suis pas un grand expert en Lua, je sais jamais si c'est ma méthode ou ma syntaxe qui merde :P

Posté(e)

Ajustement du code, avec une commande plus simple pour debuger:

local _deviceIp = fibaro:get(fibaro:getSelfId(), "IPAddress");
local _devicePort = fibaro:get(fibaro:getSelfId(), "TCPPort");
tcpSocket = Net.FTcpSocket(_deviceIp, _devicePort);
tcpSocket:setReadTimeout(2000);
local commande = [[{"command1":"serverinfo"}]];
fibaro:debug("commande json: " .. commande);
fibaro:debug("IP: " .. _deviceIp .. " - Port: " .. _devicePort);
local bytes, errorCode = tcpSocket:write(commande);
fibaro:debug("bytes: " .. bytes .. " - Code erreur: " .. errorCode);
state = tcpSocket:read();
fibaro:debug("len: " .. string.len(tostring(state)));
tcpSocket:disconnect();

Ca me retourne un code erreur 0, donc si je ne dis pas de bêtise, c'est que la connexion est correcte ? Mais ca me retourne toujours une réponse vide :( Je sèche un peu, là, d'autant que je ne vois rien dans les logs du soft.

×
×
  • Créer...