J'ai un client qui écoute deux variables de capteur et est connecté à un serveur Websocket. La valeur de ces variables de capteur à envoyer au serveur websocket avec l'implémentation suivante :

const ws = new WebSocket("ws://" + host + port);
console.log('sent');

ws.onopen = function (event) {
  //listening to sensor values
  monitoredItem1.on("changed",function(dataValue){      
    ws.send(JSON.stringify(" rotation ", dataValue.value.value));
    //console.log('sent');
    console.log(" % rotation = ", (dataValue.value.value).toString());
  });

  //listening to sensor values
  monitoredItem2.on("changed",function(dataValue){
    console.log(" % pressure = ", dataValue.value.value);
    ws.send(JSON.stringify(" pressure ", dataValue.value.value));
    //console.log('sent');
  });
};

Et le serveur ressemble à ça :

var Server = require('ws').Server;
var port = process.env.PORT || 8081;
var ws = new Server({port: port});

ws.on("connection", function(w) {
 w.on('message', function(msg){
  console.log('message from client', msg);
 });
});

Mais la sortie du serveur est comme ceci :

message from client " rotation "
message from client " pressure "
message from client " pressure "
message from client " pressure "
message from client " pressure "
message from client " pressure "
message from client " rotation "
message from client " rotation "
message from client " pressure "

Pourquoi le serveur websocket ne reçoit-il pas les numéros ? Même quand je stringifie le dataValue.value.value ça ne marche pas ? Aucune idée sur la façon de résoudre ça?

Merci

0
auenal 17 mars 2019 à 00:45

2 réponses

Meilleure réponse

Il semble que vous n'accédiez pas correctement à l'objet JSON, mais je ne connais pas votre structure JSON pour fournir un exemple avec vos données JSON.

Lors de l'utilisation de JSON en chaîne, deux valeurs telles que ws.send(JSON.stringify(" rotation ", dataValue.value.value));. Il ne fera que stringifier la partie " rotation " dans la sortie.

Mais disons que vos données sont configurées comme ceci. C'est ainsi que vous pouvez y accéder.

const data = {
    pressure: 'value-pressure',
    rotation: 'value-rotation',
    embed: {
        value: 'value-embed'
    }

};

console.log(data.pressure); // value-pressure
console.log(data.rotation); // value-rotation
console.log(data.embed.value) // value-embed

Vous pouvez toujours le convertir en chaîne en utilisant toString() avant de l'envoyer, puis le reconvertir en JSON avec JSON.parse après l'avoir reçu pour accéder à JSON.

J'ai fait ce petit exemple pour tester en utilisant JSON.stringify(), il l'a envoyé, je ne connaissais tout simplement pas votre format de données. Envoyez un JSON via un socket Web, puis accédez à l'objet.

const WebSocket = require('ws')
var Server = require('ws').Server;
var port = process.env.PORT || 3000;
var ws = new Server({port: port});

ws.on("connection", function(w) {
    w.on('message', function(msg){
        let data = JSON.parse(msg);
        console.log('Incoming', data.pressure); // Access data.pressure value
    });
});

Et pour envoyer

const WebSocket = require('ws')
const ws = new WebSocket("ws://localhost:3000");
console.log('sent');

ws.onopen = function (event) {
    let data = {
        pressure: 'value',
        rotation: 'rotation',
    };
    ws.send(JSON.stringify(data)) // Send all the data
};
2
File 16 mars 2019 à 22:11

Essayez d'utiliser {} autour des données qui en feront un objet JS, et json.stringify() n'accepte qu'un seul argument doc ici comme valeur à convertir , le premier argument c'est pourquoi seule la "pression" est convertie et envoyée.

 ws.send(JSON.stringify({"pressure": dataValue.value.value}));
0
Ali Alp 16 mars 2019 à 22:18