我正在尝试使用express-ws
在服务器上创建API来远程控制Raspberry-pi,在pi上启动和停止程序以允许安全拔出。
这个想法是,用户将单击浏览器客户端上的按钮(开始/停止),这将向API发送一个GET
请求,从而触发一个事件,该事件将通过网络套接字向pi发送消息。 pi正在使用websockets
库运行python,以连接和接收来自API的消息。服务器正在使用以下代码:
const express = require('express');
const router = express.Router();
const events = require('events');
const eventEmitter = new events.EventEmitter();
router.get('/setDevice/:status',function(req,res){
const status = req.params.status;
eventEmitter.emit(status);
res.send(status);
});
router.ws('/deviceStatus',function(ws,req){
ws.on('open',function(){
ws.send("Connected!");
console.log('newConnection');
});
eventEmitter.on('start',function(){
ws.send("start");
});
eventEmitter.on('stop',function(){
ws.send("stop")
});
ws.on('close',function(){
console.log("connection closed");
});
});
module.exports=router;
只要GET
端点被击中,我就可以成功地将pi连接到服务器并接收适当的消息,但是如果我断开pi并将其从服务器重新连接,它将不再接收消息,并且出现以下错误从服务器:
<body>
<h1>WebSocket is not open: readyState 3 (CLOSED)</h1>
<h2></h2>
<pre>Error: WebSocket is not open: readyState 3 (CLOSED)
at WebSocket.send (C:\Projects\BLE_webapp\api\node_modules\ws\lib\websocket.js:314:19)
at EventEmitter.<anonymous> (C:\Projects\BLE_webapp\api\routes\socketRoutes.js:21:12)
at EventEmitter.emit (events.js:203:15)
at C:\Projects\BLE_webapp\api\routes\socketRoutes.js:11:18
at Layer.handle [as handle_request] (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\layer.js:95:5)
at C:\Projects\BLE_webapp\api\node_modules\express\lib\router\index.js:281:22
at param (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\index.js:354:14)</pre>
</body>
如果我重新启动服务器并再次连接pi,一切都很好。该错误似乎表明服务器正在尝试关闭已关闭的WebSocket,而不是新的WebSocket。有没有办法告诉express
在关闭时删除旧的连接,而只关注实时连接?
注意:最终,我希望将其扩展为支持多个pi,并且用户可以打开/关闭特定设备。我不确定是否有更好的解决方案。我尚未对多个pi进行测试,但我感觉这将是一个更大的问题。