整个后端代码是用JavaScript编写的,它位于 server.js 文件中。
要创建服务器,请使用 socket.io 提供的模块,因为 socket.io 提供基于事件的双向实时通信:
var server = http.createServer(app);
var io = require('socket.io').listen(server);
要接收消息,必须为它们添加处理程序。在“connection”事件中,当收到消息时,这意味着新的ESP8266加速模块想要连接到服务器。从“data”中检索ID和套接字的值,并将其添加到先前连接的ESP8266加速模块的本地列表中:
socket.on('connection', function (data)
{
var acc_ram = new Object();
acc_ram.socket_id = socket.id;
var data_json = ParseJson(JSON.stringify(data));
acc_ram.acc_id = data_json.acc_id;
acc_ram.socket = socket;
addACCObject(acc_ram);
printACC();
for(var webBrowsers = 0; webBrowsers < web-Connections.length; webBrowsers++)
{
var sessionID = webConnections[web-Browsers].socket;
sessionID.emit('acc_ram',[acc_ram:data])
}
});
为了通知所有连接的浏览器新的ACC已准备好发送数据,后端服务器代码向它们发送 acc_ram 消息并转发包含模块ID的data对象
收到消息后,浏览器将为新模块构建动态图形元素(画布提取,按钮)。
当后端收到包含测量加速度值的 JSON 消息类型时,消息将转发到所有浏览器,并且值将成为 smoothie.js 图形的输入数据:
socket.on('JSON', function (data)
{
for ( var webBrowsers = 0; webBrowsers < webConnections.length; webBrowsers++)
{
//send data to all connected browsers
var sessionID = webConnections[webBrowsers].socket;
sessionID.emit('acc_data', [acc_data:data]);
}
});
对于从网页收到的发往特定ESP8266模块的消息,我们需要首先根据套接字ID识别目标模块,然后将该消息发送到正确的模块。否则,将向所有ESP8266模块发送重置命令,我确信这不是您打算做的:
socket.on('resetModule', function (data)
{
for(var j=0; j< accConnections.length; j++)
{
var acc_m = accConnections[j];
if(acc_m.acc_id == data.acc_id)
{
var s = accm.socket; //Get the socket
s.emit ( " resetModule" , (message: data] ) ;
return; //======> .
}
}
});