I'm working on a CCTV camera with ESP32-Cam and NodeJS server. The way I want to do it is to use WebSocket client on the ESP and send binary data with captured frames to NodeJS server, which then will forward it to connected users. I can't use socket.io, so I'm using plain websockets (on node 'ws' module).
What I'm struggling about is that while sending binary data I can't tell what kind of message it is, meaning if it is stream, thumbnail, or a plain json message.

我的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,我将使用webSocket.ESP上的sendTXT(使用WebSocketsServer库)方法,只是我不知道how to handle both binary and text messages on the server,以及如何让服务器识别它们(类似于message tag,因此二进制流将是"stream",而json将是"blink"或"fetch\u temp",取决于使用情况).如果没有二进制流,我将只使用json,因此每个消息都有"tag"和"message"属性,但图像流会使事情复杂化.

I had an idea to send a json text message before binary message,这将为发送的下一条消息设置通道.只是不知道它是否可以工作,如果消息不同步,它是否会中断(这可能吗?).此外,我需要一个解决方案as fast as possible(为了保持视频的良好帧速率,现在清晰的二进制流真的很整洁!)

谢谢你的(好) idea 和解决方案!

推荐答案

您正在询问如何判断通过web套接字发送的数据是二进制还是JSON.容易解决的问题.正如您所指出的,只需在数据前面加上下一步的指示.如果您担心性能,请不要将JSON作为前缀发送,只发送一个字符,例如,"B"表示下一条消息是二进制的,或者"J"表示它是JSON.

不,除非您的代码出错,否则websocket消息不能不同步.WebSocket提供了可靠、有序的字节流.每个字节都保证按顺序正确地接收一次,如果websocket无法做到这一点,您将收到一个错误."正确"是对未加密连接的一种延伸——未加密的web套接字可以防止简单的网络错误,但不能防止攻击者的故意篡改.

Node.js相关问答推荐

如何在RavenDB中执行JS索引?

FindOne()返回所有值,而不是一个值

我的Node.js应用程序没有将Mongoose方法findByIdAndDelete作为函数进行检测

Node-Red Tasmota 错误:连接 ECONNREFUSED 192.168.77.21:1883

从mongodb集合中获取每分钟数据的每小时数据

如何在nodejs中打印pdf

Prisma 和 Nextjs:重新部署之前内容不会更新

遇到 - TypeError:try 使用 Express(Node.js) 从 JSON 文件访问数据时无法读取未定义的属性(读取帖子)

等待不在 Express.js 中处理 res.app.render

如何避免在 mongodb 聚合中查找重复结果?

BrowserRouter工作时为什么HashRouter不工作?

为什么在调用数据库调用时我的参数没有定义?

Handlebars:访问已被拒绝解析来自的属性,因为它不是其父级的自己的属性

yarn.lock 和 npm 的 package-lock 有什么区别?

使 pm2 登录到控制台

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

使用 Node.JS,如何按时间顺序获取文件列表?

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

User.findOrCreate 函数是做什么的,什么时候在Passport 中调用它?

在 Node.js 中获取终端的宽度