- 主题:这样的命令行窗口时如何实现的?
你说的这种界面叫 TUI,一般都是 geek 用的。这种界面的操作方式一般通过键盘进行,很多普通用户用不明白。
你们没有产品经理吗?
这种很典型的办法是路由器那样,嵌入式那一端做一个 HTTP 服务器,完全无界面,只使用 QtCore 和 QtNetwork 两个模块。有什么功能,都通过 http web 界面体现出来。记得存储日志文件,需要的话下载回来分析。
如果有复杂的图形界面,比如有图形刷新,或者伺服电机的控制,那就弄个 RPC 或者 tcp socket,可以双向通信的那种。用户的电脑运行 Qt 程序。
我专门搞的 qtng 目前就应用在这种领域。可以代替 QtNetwork,很容易地搭建起 http 服务和 rpc 服务。
【 在 bigsen (大海无量) 的大作中提到: 】
: [upload=1][/upload]
: 1、如上图所示,动态数据需要实时刷新,这样的无ui的命令行窗口是如何实现的?记录实时数据在命令行中的字符位置然后刷新么?
: 2、有如下需求:工控或嵌入式环境下,程序需要开机自启动,程序运行过程中需要输出运行状态信息,工程调试时需要人工手动发送若干命令。
: ...................
--
修改:hgoldfish FROM 110.85.22.*
FROM 110.85.22.*
完全无界面的是守护进程,也就是实际完成核心功能的进程。同时,HTTP 服务器就放在这个进程里面。
TUI 界面的程序、Qt 界面的程序都是独立的进程。不过 TUI 界面一般运行在跟守护进程同一台机器。而 Qt 界面程序运行在用户的电脑,一般都是 windows 机器。
http 搞个界面太麻烦的话,就弄个 http restful api,其实没几行代码,都有现成的库。去折腾 tui 才麻烦呢。
http 服务器有很多 cpp 库,但需要运行在独立的线程。我弄的 qtng httpd,是多协程,可运行在同一个线程。
【 在 bigsen (大海无量) 的大作中提到: 】
: 关键我的第三个需求只有几个固定的命令需要发送,为此再用http搞个界面有点喧宾夺主的感觉。
: 请问你说的完全无界面的命令行程序,是绑定命令行窗口那种,还是像守护进程那种的服务?
--
FROM 110.85.22.*
1. tui 是可以直接输出到终端的。既可以是本地终端,也可以是 ssh 虚拟终端。
2. 守护进程别跟界面放在一起。。输出信息你用 qInfo(),在 linux 里面默认会输出到系统的 syslog 里面。
3. http 服务器是最简单的。我前面有说过,如果要顺手做界面就像路由器的管理界面那样输出 html。如果觉得不熟悉 html+js 那一套,那么你就只要输出 json 就行。
用 qtng 的例子:
class MyRequestHandler: public qtng::BaseHttpRequestHandler {
public:
virtual void doGET() override;
};
void MyRequestHandler::doGET() {
if (path == "/status/") {
QJsonObject data;
data.insert("status", "ok");
const QByteArray &json = toJson(data);
sendResponse(HttpStatus::Ok);
sendHeader("Content-Type", "application/json");
sendHeader("Content-Length", QByteArray::number(json.size());
endHeader();
this->request->sendall(json);
}
}
TcpServer<MyRequestHandler> httpd(QHostAddress::Any, 8000);
httpd.serveForever();
【 在 bigsen (大海无量) 的大作中提到: 】
: 1、TUI界面是否不需要安装桌面也可以运行显示?在Ubuntu server上也可以正常运行?
: 2、如果是守护进程,一些简单的运行状态信息没办法看到,如果时命令行的话,至少还可以命令行打印,从而每次登陆后都可以看到当前时刻前后一段时间内的状态信息。
: 因此,我在想是用命令行窗口运行这个程序(状态信息直接在命令行窗口输出)or TUI or http
: ...................
--
FROM 110.85.22.*
一点都不麻烦。。发送命令以后,HTTP 服务器执行,并且收集执行过程中的信息,返回给客户端显示出来就行了。
我的 HTTP 方案还没有成熟,最近还在修改中。你可以考虑用现成的 cpp httpd 方案,github 上面找一下,在子线程里面执行。很容易的。
【 在 bigsen (大海无量) 的大作中提到: 】
: 学到了,多谢大佬。后期尝试下你的http方案。
: 再问个问题,例子可用于通过http页面发送命令,如果页面上还想显示出命令回执,以及程序运行过程中的一些状态信息,是不是就比较麻烦了?需要再部署个简易数据库才行?
--
FROM 110.85.22.*
个人觉得不是容不容易的问题。。是产品设计上,除非面向 geek,不然不应该用 TUI
【 在 dormouseBHU (dormouseBHU) 的大作中提到: 】
: 用curses很容易实现。
--
FROM 110.85.22.*
做成服务放到 systemd 里面自动启动。
你这做的跟我们搞服务端编程的没啥区别。都是一样的套路。
【 在 bigsen (大海无量) 的大作中提到: 】
: 板子上电就自动启动各程序呀,不是远程tty登录后才启动程序的
--
修改:hgoldfish FROM 110.85.22.*
FROM 110.85.22.*
GUI 客户端都不会放在嵌入式设备那一侧。一般还有个所谓的“上位机”的概念。
上位机与嵌入式之间通过网络协议进行通信。以前一般采用 UDP,主要是因为嵌入式板子的性能一般很差。现在性能普遍很好了,估计楼主用的甚至是 X86 板子,所以正常已经改用 HTTP RESTFUL 或者 grpc 了。
【 在 dormouseBHU (dormouseBHU) 的大作中提到: 】
: 嵌入式系统,资源有可能很有限。很有可能没有x windows,没有网口。这样的系统上搞个tui是非常合适的选择。
--
FROM 110.85.22.*
那也应该搞个 http server 做 restful/rpc 接口啊。
主进程 main 用 systemd 自动启动。
tui frontend 进程通过 http 接口连接到主进程查看状态。
我看你们不想做 http 接口都是因为 http 服务器对你们来说太麻烦了哈哈~~
【 在 dormouseBHU (dormouseBHU) 的大作中提到: 】
: 我正经做过三四年嵌入式工程师的,这些都懂。但是楼主这套系统已经带了显示器和键盘,完全没必要在搞个上位机了…
: 而且如果只是看看状态没必要搞个httpserver,直接telnet登上去看就行了
--
FROM 112.47.122.*
如果只在 qt 里面用是可以的。。qt 有个 QtWebSockets 模块,使用方式与 qtcpsocket 差不多。
不过我个人比较喜欢跨平台的方案。业界通用 http restful 或者 grpc,没必要自己发明一套。
【 在 callmebbser (BBSer) 的大作中提到: 】
: 用WebSocket会不会比http Server更好?
--
FROM 112.47.122.*
QTextCodec::setCodecForLocale(codec);
这一行不要写。。
只要源代码转成 utf-8,也不要带 bom,然后统一用 QString::fromUtf8() 就可以了。
【 在 bigsen (大海无量) 的大作中提到: 】
: 鱼总,请教个问题
: 应吧所有的.cpp文件的编码格式转换为utf-8带BOM格式,在ubuntu上重新编译,代码中设置了
: QTextCodec *codec = QTextCodec::codecForName("UTF-8"); // A
: ...................
--
FROM 112.47.122.*