c++应用程序的远程Web GUI



我有一个Windows+Linux c++应用程序。我想显示一个(远程)控制面板作为一个web应用程序。

有许多可用于c++的嵌入式web服务器(Poco, civetweb, restinio等),但这只是解决方案的第一个构建块。

我还需要生成HTML+CSS,在浏览器上打开web套接字并构建UI的Javascript,本机端的websockets C/c++代码,以及浏览器应用程序和本机应用程序之间的小部件同步。

所有这些都需要打包到c++应用程序中,所以我宁愿避免典型Node应用程序的大量依赖。它也适用于单个用户(或最多几个),而不是用于构建大型网站。

我看过很多关于这个话题的老问题,但是没有明显的解决方案。所有的桌面应用程序和物联网设备(如IP摄像头,家庭自动化中心),呈现一个web界面必须这样做的某个版本。他们如何有效地做到这一点?

谢谢!

中给出了这种解决方案的完整蓝图https://realtimelogic.com/articles/Modern-Approach-to-Embedding-a-Web-Server-in-a-Device

在本文中,我们将研究如何通过使用响应式编程技术使嵌入式基于web的设备管理现代化,不仅针对用户界面,而且针对完整的解决方案,包括从设备实时传播到所有连接的浏览器的更改。一个现代的基于响应式web的应用程序通常被组装成一个单页应用程序(SPA),有很多工具可以促进响应式SPA的开发,包括AngularJS、ReactJS和Vue.js。我们将继续设计一个基于响应式多用户的解决方案,用于控制设备中的共享资源。我们将展示的完整功能示例可以下载并加载到您的浏览器中,并且无需安装任何软件即可运行。

他们正在促进在解决方案架构中的一些子任务中使用他们的商业组件。然而,其中一些有一个免费的层,而其他的可以用免费/免版税的替代品来代替。

我只在Windows上测试过这个,我还没有尝试过物联网,但你可以使用Poco HTTP服务器作为你的本地web服务器和远程web服务器为你的数据库,远程管理和GUI。

你必须将你的后端脚本和前端脚本上传到你的远程服务器上,你的前端脚本必须在127:0.0.1:your_port向你的本地服务器发送ajax请求,你可以使用香草JS或JQuery。

本地服务器将读取请求并发回响应,该响应也将由前端脚本处理。

您还需要在本地服务器上启用CORS,否则您将无法向本地服务器发送请求。

下面是一个Poco HTTP服务器的例子:https://www.codeproject.com/Articles/252827/Learning-Poco-A-Simple-HTTP-Server

下面是启用CORS、读取POST字段和创建响应的示例:

class MyRequestHandler : public Poco::Net::HTTPRequestHandler {
public:
virtual void handleRequest(Poco::Net::HTTPServerRequest& req, Poco::Net::HTTPServerResponse& resp) {
resp.setStatus(Poco::Net::HTTPResponse::HTTP_OK);
resp.setContentType("application/json");
resp.add("Access-Control-Allow-Origin", "*");
resp.add("Access-Control-Allow-Methods", "*");
resp.add("Access-Control-Allow-Headers", "*");
Poco::Net::HTMLForm form(req, req.stream());
std::string fn, arg1, arg2, arg3;
if (form.has("fn"))
fn = form["fn"];
if (form.has("arg1"))
arg1 = form["arg1"];
if (form.has("arg2"))
arg2 = form["arg2"];
if (form.has("arg3"))
arg3 = form["arg3"];
nlohmann::json respObj = nlohmann::json::object();
respObj["result"] = true;

if (Util::String::search(fn.c_str(), "SET_NATION"))
UserData::bNation = (byte)std::stoi(arg1);
else
{
respObj["result"] = false;
respObj["msg"] = "Undefined function/argument";
}
std::ostream& out = resp.send();
out << respObj.dump();
out.flush();
}
};

将此代码替换为您自己的搜索函数,您可能需要使用boyer moore算法进行更快的比较

Util::String::search

忽略此代码

UserData::bNation = (byte)std::stoi(arg1);

只是添加我的2c: Mongoose是一个非常强大的嵌入式web服务器,可以很容易地添加到任何cpp项目:

https://github.com/cesanta/mongoose

https://mongoose.ws/

它是轻量级的,可以在各种平台上运行,不需要额外的依赖项(IIRC)。请检查许可证是否适合您(双重许可,商业用途需要许可证)。

Try "jsVar"几天前我放在github上的一个库。这是一个全新的库,但代码本身是从生产软件中提取的旧代码。它是麻省理工学院许可的,轻量级的,并且可以满足你的要求:它创建了一个带有websockets的web服务器,并且在两边都有一些处理代码。它支持wchar_t,并且只依赖于openSSL(如果需要SSL服务器)。

这里是"链接"。因为它还没有被谷歌索引。

最新更新