2017-07-31 4 views
0

Dans Node-Red, j'aimerais pouvoir envoyer un message et attendre sa réponse en utilisant MQTT, entre un nœud d'entrée http et un nœud de réponse. Je pense qu'une image plus pertinente pour expliquer:Gestion de la communication MQTT dans la requête HTTP dans le nœud rouge

enter image description here

Le problème est un nœud réponse http doit être directement lié à une entrée d'une certaine façon, donc je pensais de sauver tout le message dans le contexte après avoir reçu une entrée http, puis le restaurer avant d'envoyer la réponse. Le problème est que, apparemment, la structure du message est circulaire, donc je ne peux pas le convertir directement en une chaîne, pour le stocker dans le contexte.

J'ai essayé différentes choses pour résoudre ce problème (j'ai regardé ceci: JSON.stringify, avoid TypeError: Converting circular structure to JSON et j'ai essayé d'utiliser le module circular-json, qui ne fonctionne pas).

Pensez-vous à une autre solution à ce problème?

Merci!

Répondre

0

Cela rompt quelque peu la nature asynchrone de MQTT, alors que Pub/Sub peut être utilisé ce n'est pas son point fort.

Vous devez considérer ce qui se passe s'il n'y a pas de message de réponse, car il n'y a aucun moyen de savoir si l'autre client MQTT est connecté.

D'où provient la requête HTTP? Si c'est à partir d'une page Web, vous pouvez utiliser MQTT sur Websockets pour faire la demande directement ou simplement Websockets, en supprimant le besoin de l'appel HTTP tous ensemble. Cela étant dit, vous devriez pouvoir stocker l'objet msg dans le contexte, il n'est pas nécessaire de le convertir en chaîne car le moteur de stockage de contexte par défaut est juste un magasin d'objets en mémoire. Il suffit donc d'ajouter un objet au contexte et de le récupérer lorsque la réponse arrive.

Vous pouvez peut-être faire quelque chose avec le noeud de déclenchement pour gérer le problème du délai d'expiration.

+0

Merci pour votre réponse! Je ne savais pas que je pouvais simplement stocker le message d'objet dans son contexte (j'ai toujours vu des gens le convertir en une chaîne, donc je n'ai même pas pensé à essayer autre chose). Cela a résolu mon problème! En ce qui concerne le problème de timeout, je sais comment gérer cela, ce ne sera pas vraiment un problème. Merci encore! – LeChocdesGitans