gpt4 book ai didi

node.js - 如何在 Node js中向特定客户端(基于deviceId)发送套接字数据?

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:10 26 4
gpt4 key购买 nike

我的系统有很多模板。模板有多个与之关联的传感器。每个传感器将数据发送到服务器并存储在数据库中。每个传感器都有一个唯一的deviceId。数据存储在 Mongo 数据库中相应的模板集合中。

例如,有两个设备(sbdth11-001,sbdth11-002),“sbdth11-001”发送数据,而“sbdth11-002”保持空闲。在前端,当我看到“sbdth11-001”的网格时,我正在获取数据。但是当我看到“sbdth11-002”的网格时,它正在获取“sbdth11-001”的数据。这意味着服务器套接字向连接到它的所有客户端发送数据。任何人都可以帮助解决这个问题。请看一下我的代码。

服务器端Server.JS

const server = http.createServer(app);
global.io = require('socket.io')(server);
io.on('connection', function(socket){
//console.log('a user connected');
});

Routes.JS

router.post("/upload/device/data/:tempId", TemplateController.AddDeviceData);

TemplateController.JS

AddDeviceData:async function(req, res){
let err, deviceLog;

[err, deviceLog]=await to(TemplateService.AddDeviceLogs(req.params.tempId, req.body));
if(err) return res.serverError(err.message);
if(deviceLog&&deviceLog!==false){
return res.ok(deviceLog);
}else{
res.badRequest("Sorry cannot add Device log data");
}
}

TemplateService.JS

AddDeviceLogs:async function(templateId, payload){
let err, deviceData;

payload.template=templateId;
payload.entryDayTime=new Date();
const myCollection=templateId;
[err, deviceData]=await to(mongoose.connection.db.collection(myCollection).insert(payload));
if(err) TE(err.message, true);
//Socket emit code begin
if(deviceData){
let err,singleDeviceData,allDevicesData;;

[err,singleDeviceData]= await to(this.displayLogs(templateId,payload.deviceId));
[err,allDevicesData] = await to(this.displayLogs(templateId));
if(err) io.emit('socketError', err.message);
io.emit('singleDeviceData',singleDeviceData); //Has to emit the data to
//the device of template whose IDs matches
//with the IDs in this.displayLogs(templateId,payload.deviceId)
io.emit('allDevicesData',allDevicesData);//Has to emit the data to
//the template whose ID matches
//with the ID in this.displayLogs(templateId)
}
//Socket emit code end
return (deviceData)? deviceData.result:false;
}

设备网格 sbdth11-001 enter image description here设备网格 sbdth11-002 enter image description here

两个网格都获得相同的数据。如果设备未发送任何数据,则它不应在网格中呈现任何内容。

最佳答案

我已经找到解决方案了。我们只需要将 deviceId 与套接字发出事件一起发送到客户端套接字。

在我的用例中,我的模板中有许多设备。模板ID是唯一的,模板中的设备ID应该是唯一的。但是一个 deviceId 可以在不同的模板中多次使用,请记住 deviceId 在模板级别应该是唯一的。

这是代码。

服务器代码(Node.JS)

io.emit(`singleDeviceData${templateId}${payload.deviceId}`,singleDeviceData); //Emitting the device data of a template

io.emit(`allDevicesData${templateId}`,allDevicesData); //Emitting the data of all devices(template)

在前端,我们需要在将数据渲染到网格之前比较 deviceId 和 templateId。

我们发出类似 singleDeviceData566567586Device-1 的事件。其中,singleDeviceData 是事件名称,566567586 是 templateId,Device-1 是 deviceId。

因此,在客户端,在监听 singleDeviceData 事件时,我们将 566567586Device-1 与我们当前在浏览器上打开的网页的 templateId 和 deviceId 进行比较。如果两者相同,则它会呈现数据,并且随着数据不断插入数据库,它会不断更新。否则,显示该页面上应显示的内容,并且数据不会更新。

关于node.js - 如何在 Node js中向特定客户端(基于deviceId)发送套接字数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58837429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com