QT websocket·

我想问下,我想用websocket的方式,从页面打开硬件设备,流程是这样的:客户端是html的页面 ,点击调用接口(比如打开摄像头),发出的消息为json字符串,websocket服务器接到json字符串,然后调用相因的函数(使用第三方的库),打开摄像头,然后在html页面显示摄像头预览界面然后刷新视频流,同时返回调用结果。 我在网上找了好久,都只是能够接收消息,没有我说的这种调用方法,

img


img

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

您好,根据您的描述,您想要使用WebSocket实现从HTML页面中打开硬件设备(如摄像头),并显示预览界面和视频流。以下是一些大致的思路:

    1. 创建WebSocket服务器:在C++中,您可以使用Qt提供的QWebSocket类来创建WebSocket服务器,并监听客户端连接。
    1. 处理WebSocket消息:在服务器代码中,您需要编写WebSocket消息处理函数以响应客户端发送的消息。当接收到“打开摄像头”的请求时,您可以调用相应的C++函数库,打开摄像头,并将预览流发送回客户端。
    1. 在HTML页面中处理WebSocket消息:在HTML页面中,您可以使用JavaScript的WebSocket API来与服务器进行交互。当用户单击“打开摄像头”按钮时,您可以通过WebSocket连接向服务器发送“打开摄像头”的请求。当收到服务器返回的预览流时,您可以使用JavaScript将其解码并显示在HTML页面中。

下面是一个示例代码,用于演示在Qt中使用WebSocket与HTML页面进行通信的基本流程:

// WebSocket服务器端代码
QWebSocketServer *server = new QWebSocketServer("My Server", QWebSocketServer::NonSecureMode, this);

connect(server, &QWebSocketServer::newConnection, this, &MyServer::onNewConnection);

void MyServer::onNewConnection()
{
    QWebSocket *socket = server->nextPendingConnection();
    connect(socket, &QWebSocket::textMessageReceived, this, &MyServer::processTextMessage);
    // ...
}

void MyServer::processTextMessage(const QString &message)
{
    QJsonDocument jsonDoc = QJsonDocument::fromJson(message.toUtf8());
    QJsonObject jsonObj = jsonDoc.object();

    QString cmd = jsonObj["cmd"].toString();
    if (cmd == "open_camera") {
        // 调用第三方库打开摄像头
        // 发送预览流回客户端
        QByteArray previewBytes = getCameraPreview();
        socket->sendBinaryMessage(previewBytes);
    }
}

// HTML页面代码
var ws = new WebSocket("ws://localhost:1234");

function openCamera() {
    var message = { cmd: "open_camera" };
    ws.send(JSON.stringify(message));
}

ws.onmessage = function(event) {
    if (event.data instanceof Blob) {
        // 解码预览流并显示在HTML页面中
        var url = URL.createObjectURL(event.data);
        document.getElementById("preview").src = url;
    }
};

具体的实现细节可能因为硬件设备、操作系统、浏览器等不同而有所差异,需要您自行研究和尝试。希望能对您有所帮助!

本身网页端是可以调用摄像头并显示预览视频的,你首先要开发一个网页先实现这个效果。然后加入websocket,当接收到打开摄像头的消息后,在页面通过js调用摄像头并显示预览视频。我看你使用了一个高拍仪,而且你是应该是在它的demo中修改的,它的demo可能就是只能接受消息,不能调用,建议跳出 这个思路,新开发一个网页,先解决如何在网页端实现调用高拍仪,然后显示画面的功能,然后通过websocket发消息调用。

自己定义消息格式,那就是接口了啊

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,您需要使用QtWebSockets库来实现WebSocket服务器,建议使用Qt5.15或更高版本。在Qt应用程序中使用WebSocket服务器的步骤如下:

  1. 创建一个WebSocket服务器对象:
QWebSocketServer *server = new QWebSocketServer("MyServer", QWebSocketServer::NonSecureMode, this);
  1. 监听WebSocket连接请求:
connect(server, &QWebSocketServer::newConnection, this, &MyServer::onNewConnection);
server->listen(QHostAddress::Any, 1234);
  1. 处理新的WebSocket连接:
void MyServer::onNewConnection()
{
    QWebSocket *socket = server->nextPendingConnection();
    connect(socket, &QWebSocket::textMessageReceived, this, &MyServer::processTextMessage);
    connect(socket, &QWebSocket::disconnected, this, &MyServer::socketDisconnected);
}
  1. 处理接收到的WebSocket消息:
void MyServer::processTextMessage(QString message)
{
    // 解析json字符串
    QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8());
    if(doc.isNull() || !doc.isObject()) {
        qDebug() << "invalid json";
        return;
    }
    QJsonObject obj = doc.object();
    QString command = obj.value("command").toString();
    // 根据接收到的命令调用相应的函数
    if(command == "open_camera") {
        // 打开摄像头并返回结果
        QJsonObject result;
        result.insert("success", true);
        QJsonDocument resultDoc(result);
        socket->sendTextMessage(resultDoc.toJson());
    } else {
        // 处理未知命令
        qDebug() << "unknown command:" << command;
    }
}
  1. 发送WebSocket消息:
QJsonObject obj;
obj.insert("command", "open_camera");
QJsonDocument doc(obj);
socket->sendTextMessage(doc.toJson());

以上是WebSocket服务器的基本实现流程,您需要根据您的实际需求进行修改和扩展。

关于打开本地摄像头并在HTML页面中显示视频预览,您可以使用WebRTC技术实现。具体实现方式建议参考一些开源的WebRTC框架和示例代码,例如Janus Gateway等。

希望能对您有所帮助。
如果我的回答解决了您的问题,请采纳!