Как отличить клиентов на socket.io или отправить сообщение указанному c клиенту / пользователю? - PullRequest
0 голосов
/ 07 апреля 2020

Я программирую приложение реального времени, используя веб-сокеты, но когда я отправляю сообщения с сервера (node.js):

//Mostramos el 'dashboard' de dispositivo
const getSingleDevice = async (req, res) => {

    /*Realizamos una busqueda dentro de la base de datos*/
    const device = await Device.findById(req.params.id);

    console.log('device: ', device)

    //Importamos la conexion del servidor de Sockets
    const connectionSocket = require('../../lib/socketManager').connection();

    //Importamos la conexion del servidor mqtt
    const connectionMqtt = require('../../lib/mqttManager').connection();

    //Creamos una funcion que se ejecutara cada vez que recibimos un dato por mqtt
    //En este caso enviamos por websockets
    let sendToSocket = async (d) => {

        //Conversion de los datos
        let data = JSON.parse(d.replace(/'/g, "\""));

        connectionSocket.sendEvent('temperature', data.temperature);
        connectionSocket.sendEvent('humidity', data.humidity);

        //console.log('Enviando al Socket: ',data.token);  
        //console.log('Enviando al Socket: ',data.temperature);  
        //console.log('Enviando al Socket: ',data.humidity); 

        //Verificamos el 'token'
        //Notese que dentro de 'decoded' se encuentra el 'id' del 'user'
        //al que le corresponde dicho 'id'

        await jwt.verify(data.token, config.secret, (error, decoded) => {

            //Si NO existe el 'user' devolvemos un estado de error
            if (error) {
                console.log('Token No valido')
                //return res.status(404).send('El TOKEN ES INCORRRECTO o hay un error de servidor');
            } else {

                //Mostramos en consola
                //console.log('token: ', data.token);
                //console.log('topic', topic);
                //console.log('decoded: ', decoded);

                if (decoded.id === device.userOwnerId) {

                    console.log('Identificador: ', device.userOwnerId + '/' + device._id);

                    //Enviamos por el socket
                    connectionSocket.sendEvent('temperature', data.temperature);
                    connectionSocket.sendEvent('humidity', data.humidity);
                    connectionSocket.sendEvent('id', device.userOwnerId + '/' + device._id);

                } else {

                    console.log('Identificador no valido: ', device.userOwnerId + '/' + device._id);

                }

            };

        });

    };

    //Armamos el topic
    topic = device.userOwnerId + '/' + device._id;
    console.log('topic: ', topic);

    //Registramos un dato recibido por mqtt y lo enviamos al 'socket'
    connectionMqtt.registerMQTT(topic, sendToSocket);

    //Renderizamos
    res.render('devices/detail-device', {
        device
    });
}

Клиенту (HTML / javascript), я Я использую рули от node.js для динамического обслуживания контента, я не знаю, могу ли я динамически передавать параметры в шаблон для сбора событий:

//Defeinimos la direccion del servidor
//VERIFICAR PRIMERO
const host = 'http://192.168.1.106:3000';

//Almacenamos el dato proveniente del servidor
let sensorStatus = 0;

//Creamos una conexion socket con el servidor
//VERIFICAR la direccion EL SERVIDOR DEL API DE DESTINO Primero
const connection = io(host);

//Ejecutamos tan pronto se cargue la ventana
window.onload = function() {

    //connection.emit('Prueba', 'Hello server from client');

    //Escichamos el evento 'connect' para verificar la conexion con el servidor
    //Mostramos en consola si todo ha salido bien
    connection.on('connect', function() {
        console.log('Enlazado con el servidor: ', host);
    });

    //Recibimos del servidor del valor por medio de websockets
    connection.on('temperature', function(data) {

        console.log('temperature: ', data);

        //Cambiamos el valor de la grafica
        updateGauge(data);

    });

    `//Recibimos del servidor del valor por medio de websockets`


    connection.on('humidity', function(data) {



        console.log('humidity: ', data);
    });

    //Recibimos del servidor del valor por medio de websockets
    connection.on('id', function(data) {

        console.log('id: ', data);
    });
};

НО данные полученный ВСЕМИ клиентами, независимо от того, зарегистрирован клиент или нет, я использую jwt и идентификатор пользователя и устройства для аутентификации. Как я могу различить клиентов и сделать сообщение прибывающим к желаемому / SPECIFI C зарегистрированному клиенту?

Спасибо и извините за мой engli sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...