如何建立从浏览器扩展到qt的实时通信

How to establish a realtime communcation from a browser extension to qt

我正在开发一个 firefox 扩展,它需要系统端软件和网络之间的实时连接。

我是说,我想要这样的东西

扩展中

var observer = new MutationObserver(function(childList){sendToQt(JSON.stringify(childList))})
observer.observe(myElement,{childList:true})

在qt应用程序中。

public signals:
    void messageReceived(QString message)

connect(myobject, &MyClass::messageReceived,this,&ThisClass::logMessage)
void logMessage(QString message){
    std::cout<<message.toStdString()<<endl;
    sendMessageBack(recieved)
}

当突变观察者观察到一个突变时用扩展初始化,它必须作为字符串消息发送到 qt 并从 qt 响应到扩展。我非常熟悉 python 套接字。但它似乎不适用于这样的项目。基本上它是由第一个 firefox 扩展构建的,我不太熟悉 firefox 为扩展提供的设施。有没有这样的技术可以在qt和我的扩展之间建立实时通信。

使用 Qt 和浏览器扩展都支持的简单 IPC:

  • Websockets:简单,双向,可以传JSON绕
  • A local HTTP/S API: 有点花哨和结构化,如果你只想要本地 IPC 可能会更麻烦

WebSocket

  1. Qt: 为实际例子创建一个QWebSocketServer in your Qt application, and connect to the usual signal. See Qt WebSocket example from the "Echo Server"
  2. Qt: 使用QJson进行编解码
  3. Firefox 扩展:在你的 Firefox 扩展中创建一个 new WebSocket(<url>),并连接到你在 Qt 中定义的 port/path 上的 locahost应用程序。这是一个Sample extension using WebSockets for Firefox
  4. 两人交流愉快!

HTTP/S API

你明白了,在这种情况下,你使用像 Mangoose, RESTinio, or CppRestSDK 这样的第三方库。

为方便起见,也存在一些开源 Qt 替代方案,但其他项目可能会成熟。 Qt 官方 HTTP 服务器不在主线 Qt 5 版本 AFAIK 中。