如何在没有网络但使用 Qt 之类的 GUI(通过 wifi)的情况下控制 NodeMCU?
How to control NodeMCU without web but with GUI like Qt (through wifi)?
我想制作一个 GUI 通过 wifi 控制 LED(使用 Qt GUI),就像使用网络服务器一样。但是我想使用 Qt GUI 来控制它,而不是基于 URL 的控制。我到处搜索,找不到任何答案。如何做到这一点?
编辑:
关于此项目的详细信息:
这段代码是创建一个 Web 界面的代码,其中有一个按钮可以按下 打开 和一个按钮可以按下 关闭 通过本地 IP 地址。
如果按下 打开 ,它会从 192.168.1.xxx
重定向到 192.168.1.xxx/LED=ON
(然后打开 LED)。然后,如果按下 关闭 ,它会重定向到 192.168.1.xxx/LED=OFF
(然后关闭 LED)。所有这些都可以通过 wifi 完成。
我想对 Qt 做同样的事情:有两个按钮说 打开 和 关闭 并控制 LED无线网络。
(请注意,我已经知道如何编写 Qt GUI,但我不知道如何将 Qt 与我的 NodeMCU ESP8266 连接)。我要问的是如何创建一个 GUI 来通过 wifi 控制 LED 而不是使用网络 UI 来做到这一点,(也许有一些 QtWifi 库或其他东西)我希望细节现在清楚了。
#include <ESP8266WiFi.h>
const char* ssid = "Magesh";
const char* password = "jayakumar";
int ledPin = 13; // GPIO13
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int value = LOW;
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(ledPin, HIGH);
value = HIGH;
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(ledPin, LOW);
value = LOW;
}
// Set ledPin according to the request
//digitalWrite(ledPin, value);
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Led pin is now: ");
if(value == HIGH) {
client.print("On");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}
这里是使用 QNetworkAccessManager 使用 Qt GUI 发出 HTTP 请求 (GET) 的基本演示。为了进一步实施,你可以抓住
WiFiServer
.
通过 QNetworkReply
回复
#include <QApplication>
#include <QVBoxLayout>
#include <QPushButton>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w = new QWidget;
QVBoxLayout* layout = new QVBoxLayout;
QPushButton* on = new QPushButton("On");
QPushButton* off = new QPushButton("Off");
layout->addWidget(on);
layout->addWidget(off);
w->setLayout(layout);
QNetworkAccessManager *manager = new QNetworkAccessManager();
QObject::connect(on, &QPushButton::clicked,
[manager](){
manager->get(QNetworkRequest(QUrl("http://192.168.1.xxx/LED=ON")));
});
QObject::connect(off, &QPushButton::clicked,
[manager](){
manager->get(QNetworkRequest(QUrl("http://192.168.1.xxx/LED=OFF")));
});
w->show();
return a.exec();
}
我想制作一个 GUI 通过 wifi 控制 LED(使用 Qt GUI),就像使用网络服务器一样。但是我想使用 Qt GUI 来控制它,而不是基于 URL 的控制。我到处搜索,找不到任何答案。如何做到这一点?
编辑: 关于此项目的详细信息:
这段代码是创建一个 Web 界面的代码,其中有一个按钮可以按下 打开 和一个按钮可以按下 关闭 通过本地 IP 地址。
如果按下 打开 ,它会从 192.168.1.xxx
重定向到 192.168.1.xxx/LED=ON
(然后打开 LED)。然后,如果按下 关闭 ,它会重定向到 192.168.1.xxx/LED=OFF
(然后关闭 LED)。所有这些都可以通过 wifi 完成。
我想对 Qt 做同样的事情:有两个按钮说 打开 和 关闭 并控制 LED无线网络。
(请注意,我已经知道如何编写 Qt GUI,但我不知道如何将 Qt 与我的 NodeMCU ESP8266 连接)。我要问的是如何创建一个 GUI 来通过 wifi 控制 LED 而不是使用网络 UI 来做到这一点,(也许有一些 QtWifi 库或其他东西)我希望细节现在清楚了。
#include <ESP8266WiFi.h>
const char* ssid = "Magesh";
const char* password = "jayakumar";
int ledPin = 13; // GPIO13
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int value = LOW;
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(ledPin, HIGH);
value = HIGH;
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(ledPin, LOW);
value = LOW;
}
// Set ledPin according to the request
//digitalWrite(ledPin, value);
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Led pin is now: ");
if(value == HIGH) {
client.print("On");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}
这里是使用 QNetworkAccessManager 使用 Qt GUI 发出 HTTP 请求 (GET) 的基本演示。为了进一步实施,你可以抓住
WiFiServer
.
QNetworkReply
回复
#include <QApplication>
#include <QVBoxLayout>
#include <QPushButton>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w = new QWidget;
QVBoxLayout* layout = new QVBoxLayout;
QPushButton* on = new QPushButton("On");
QPushButton* off = new QPushButton("Off");
layout->addWidget(on);
layout->addWidget(off);
w->setLayout(layout);
QNetworkAccessManager *manager = new QNetworkAccessManager();
QObject::connect(on, &QPushButton::clicked,
[manager](){
manager->get(QNetworkRequest(QUrl("http://192.168.1.xxx/LED=ON")));
});
QObject::connect(off, &QPushButton::clicked,
[manager](){
manager->get(QNetworkRequest(QUrl("http://192.168.1.xxx/LED=OFF")));
});
w->show();
return a.exec();
}