我正在研制一台带有ESP32-Cam和NodeJS服务器的闭路电视摄像机.我想这样做的方法是在ESP上使用WebSocket客户端,并将包含捕获帧的二进制数据发送到NodeJS服务器,然后由NodeJS服务器将其转发给连接的用户。我不能使用socket.io,所以我使用普通的websockets (在节点'ws‘模块上)。
我正在苦苦挣扎的是,在发送二进制数据时,我无法判断它是什么类型的,也就是说它是流、缩略图还是普通的json消息。
我的ESP32-Cam客户端代码(C++):
void liveCam(uint8_t num){
//capture a frame
camera_fb_t * fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Frame buffer could not be acquired");
return;
}
webSocket.sendBIN(num, fb->buf, fb->len);
//return the frame buffer back to be reused
esp_camera_fb_return(fb);
}
我在Node做的是:
this.socket.on("connection", (ws) => {
ws.on("message", (msg) => {
// recognize channel of msg and process it (ArrayBuffer / JSON String)
})
})
为了发送JSON,我将在ESP上使用webSocket.sendTXT (使用WebSocketsServer库)方法,只是不知道如何处理服务器上的二进制消息和文本消息,以及如何让服务器识别它们(类似于消息标记,因此二进制流将是“流”,而json将是“眨眼”或"fetch_temp",这取决于使用情况)。如果没有二进制流,我将只使用json进行处理,因此每个消息都有一个“标记”和" message“属性,但是图像流会使事情复杂化。
--我有一个想法,在二进制消息之前发送一条json文本消息,这将设置下一条消息发送的通道。只是不知道它是否能工作,如果消息不同步就不会中断(这有可能吗?)另外,我需要一个解决方案尽可能快的(为了保持良好的帧视频,现在清晰的二进制流真的很好!)
感谢任何(好的)想法和解决方案!
发布于 2022-07-27 04:03:52
您在问如何区分您通过web套接字发送的数据是二进制的还是JSON的。容易解决的问题。正如您所指出的,只需在数据前面加上对下一步的指示。如果您担心性能问题,不要发送JSON作为前缀,只发送一个字符--比如,"B“表示下一条消息是二进制的,或者"J”表示它是JSON。
不,除非您的代码出错,否则websocket消息不能不同步。Websockets提供可靠的有序字节流。每个字节保证按顺序接收,准确地正确地接收一次,否则如果websocket不能这样做,您将收到一个错误。“正确”对未加密的连接来说有点牵强--未加密的网络套接字可以防止简单的网络错误,但不会防止攻击者故意篡改。
https://stackoverflow.com/questions/73130077
复制相似问题