Клиент, отправляющий сообщение на сервер через Websocket, не работает - PullRequest
0 голосов
/ 17 марта 2019

У меня есть клиент, который прослушивает две переменные датчика и подключен к серверу веб-сокетов.Значение этих переменных датчика должно быть отправлено на сервер веб-сокета со следующей реализацией:

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');
  });
};

И сервер выглядит так:

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);
 });
});

Но вывод сервера похож наthis:

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 "

Почему сервер websocket не получает номера?Даже когда я строковый dataValue.value.value это не работает?Есть идеи, как это решить?

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Кажется, вы неправильно обращаетесь к объекту JSON, но я не знаю вашу структуру JSON, чтобы предоставить пример с вашими данными JSON.

При использовании JSON строго два значения, например ws.send(JSON.stringify(" rotation ", dataValue.value.value));. Он собирается только преобразовать часть " rotation " в вывод.

Но скажем, ваши данные настроены так. Вот как вы можете получить к нему доступ.

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

Вы всегда можете преобразовать ее в строку, используя toString() перед отправкой, а затем повторно преобразовать ее в JSON с JSON.parse после получения для доступа к JSON.

Я сделал этот маленький пример для тестирования с использованием JSON.stringify(), он отправил его, просто не знал ваш формат данных. Отправьте JSON через веб-сокет, а затем получите доступ к объекту.

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
    });
});

и отправить

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
};
0 голосов
/ 17 марта 2019

Попробуйте использовать {} вокруг данных, что сделает его объектом JS, а также json.stringify () принимает только один аргумент doc здесь в качестве значения для преобразования, первый аргумент, поэтому только "давление "преобразуется и отправляется.

 ws.send(JSON.stringify({"pressure": dataValue.value.value}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...