ਟੀਚਾ ਰਸਬੇਰੀ ਪਾਈ 4 ਲਈ Qt ਐਪਲੀਕੇਸ਼ਨ ਲਿਖਣਾ ਸੀ ਜਿਸ ਦੀ ਵਰਤੋਂ ਵੱਖ-ਵੱਖ WLAN ਐਕਸੈਸ ਪੁਆਇੰਟਾਂ ਵਿਚਕਾਰ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਅਤੇ ਸੰਬੰਧਿਤ ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ ਨੂੰ ਸਟੋਰ ਕਰਨ ਲਈ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।
ਮੈਂ ਇੱਕ ਰਸਪਬੀਅਨ-ਬਸਟਰ-ਲਾਈਟ ਚਿੱਤਰ ਅਤੇ ਇੱਕ Qt ਸਥਾਪਨਾ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਿਵੇਂ ਕਿ ਰਸਬੇਰੀ ਪਾਈ 4 'ਤੇ Qt ਵਿੱਚ ਵਰਣਨ ਕੀਤਾ ਗਿਆ ਹੈ।
ਇਸ ਤੋਂ ਇਲਾਵਾ, ਮੈਂ NetworkManager ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ ਹੈ, ਜਿਸ ਨੂੰ ਸ਼ੈੱਲ ਕਮਾਂਡ (nmcli...) ਦੁਆਰਾ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਬਣਾਉਣਾ, ਕਨਫਿਗਰ ਕਰਨਾ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨਾ।
ਇਸ ਬਾਰੇ ਜਾਣਕਾਰੀ https://wiki.debian.org/de/NetworkManager ਜਾਂ https://developer.gnome.org/NetworkManager/stable/nmcli.html ਤਹਿਤ ਦੇਖੀ ਜਾ ਸਕਦੀ ਹੈ
NetworkManager ਇੱਕ ਕਮਾਂਡ ਪੇਸ਼ ਕਰਦਾ ਹੈ ਜਿਸ ਨੂੰ ਨਿਗਰਾਨੀ ਪ੍ਰਕਿਰਿਆ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਜੋ ਕਿ ਤਦ ਵੱਖ-ਵੱਖ ਇੰਟਰਫੇਸਾਂ (wlan0 ਜਾਂ eth0) (ਜਿਵੇਂ ਕਿ ਉਪਲਬਧ ਨਹੀਂ, ਡਿਸਕਨੈਕਟ, ਕਨੈਕਟ, ਕਨੈਕਟ, ...) ਵਿੱਚ ਤਬਦੀਲੀਆਂ 'ਤੇ ਟਿੱਪਣੀ ਕਰਦੀ ਹੈ।
ਮੈਂ ਇਸ ਮਾਨੀਟਰਿੰਗ ਦੀ ਵਰਤੋਂ GUI ਵਿੱਚ ਨੈੱਟਵਰਕ ਟਿਕਾਣਿਆਂ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਸਥਿਤੀਆਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਕਰਨਾ ਚਾਹੁੰਦਾ ਸੀ। 2 ਸਮੱਸਿਆਵਾਂ ਉੱਭਰ ਕੇ ਸਾਹਮਣੇ ਆਈਆਂ:

  • ਜੇ ਕਈ ਐਨਐਮਸੀਲੀ ਕਮਾਂਡਾਂ ਤੁਰੰਤ ਜਾਰੀ ਕੀਤੀਆਂ ਗਈਆਂ ਸਨ, ਤਾਂ ਵੱਖ-ਵੱਖ ਸਥਿਤੀਆਂ ਬਾਰੇ ਫੀਡਬੈਕ ਸਮੇਂ ਦੀ ਦੇਰੀ ਨਾਲ ਆ ਗਈ ਅਤੇ GUI ਵਿੱਚ ਲਾਈਵ ਪ੍ਰਦਰਸ਼ਿਤ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।
  • ਐਨਐਮਸੀਲੀ ਕਮਾਂਡਾਂ ਦੀ ਫੀਡਬੈਕ ਵੱਖ-ਵੱਖ ਸਲਾਟਾਂ ਵਿੱਚ ਭੇਜੀ ਗਈ ਸੀ ਅਤੇ ਇਸ ਤਰ੍ਹਾਂ ਖਰਾਬ ਤਾਲਮੇਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਸੀ।

ਨਿਗਰਾਨੀ ਫੰਕਸ਼ਨ

ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਸਾਨੂੰ ਨਿਗਰਾਨੀ ਫੰਕਸ਼ਨ (monitorDevices) ਅਤੇ ਪਬਲਿਕ ਸਲਾਟ ਫੰਕਸ਼ਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ, ਜੋ ਕਿ ਨਿਗਰਾਨੀ ਆਉਟਪੁੱਟ ਨੂੰ ਰੋਕਦਾ ਅਤੇ ਮੁਲਾਂਕਣ ਕਰਦਾ ਹੈ ਅਤੇ ਫਿਰ GUI ਨੂੰ ਸਥਿਤੀ ਸੁਨੇਹੇ ਭੇਜਦਾ ਹੈ, ਉਦਾਹਰਨ ਲਈ।
"monitorDevices" ਫੰਕਸ਼ਨ ਵਿੱਚ, ਜੋ ਕਿ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਆਪਣੇ-ਆਪ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ, nmcli ਕਮਾਂਡ ਨੂੰ sudo: sudo nmcli ਮਾਨੀਟਰ ਨਾਲ ਸ਼ੁਰੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ
ਕਥਨ "setProcesssChanelMode(QProcess::MergeedChannels)" ਬਿਆਨ ਵਿੱਚ ਕਿਹਾ ਗਿਆ ਹੈ ਕਿ "ਸਟੈਂਡਰਡ ਆਉਟਪੁੱਟ" ਅਤੇ "ਸਟੈਂਡਰਡ ਤਰੁੱਟੀ" ਨੂੰ ਇੱਕ ਚੈਨਲ ਵਿੱਚ ਇਕੱਠੇ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਇਸ ਤਰ੍ਹਾਂ ਇੱਕ ਫੰਕਸ਼ਨ ਨਾਲ ਮੁਲਾਂਕਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
"connect(device_monitoring_process, SIGNAL(readyReadStandardOutput()), ਇਹ, SLOT(processOutput())"" ਲਾਈਨ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਜਦੋਂ ਵੀ ਕੋਈ ਸੁਨੇਹਾ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ (readyReadStandardOutput), ਤਾਂ ਇਸ ਨੂੰ ਸਲਾਟ "processOutput" ਸਲਾਟ 'ਤੇ ਭੇਜ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।

void CmdLauncher::monitorDevices() {
QStringList device_monitoring_on = {"nmcli", "monitor"};
device_monitoring_process = new QProcess(this);
device_monitoring_process->setProcessChannelMode(QProcess::MergedChannels);
device_monitoring_process->start("sudo", device_monitoring_on);
connect(device_monitoring_process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutput()));
}

</:code1:>

ਮੁਲਾਂਕਣ ਫੰਕਸ਼ਨ

ਸੰਦੇਸ਼ਾਂ ਦਾ ਮੁਲਾਂਕਣ ਫਿਰ "ਪ੍ਰਕਿਰਿਆ ਆਉਟਪੁੱਟ" ਫੰਕਸ਼ਨ ਵਿੱਚ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। QProcess senderProcesss ਸਾਰੀਆਂ nmcli ਕਮਾਂਡਾਂ ਦੇ ਸਾਰੇ ਸੰਦੇਸ਼ਾਂ ਨੂੰ ਰੋਕਦਾ ਹੈ - ਨਾ ਕਿ ਕੇਵਲ ਨਿਗਰਾਨੀ ਕਮਾਂਡ ਦੇ ਸੰਦੇਸ਼ਾਂ ਨੂੰ।

void CmdLauncher::processOutput() {
QProcess* senderProcess = qobject_cast<QProcess*>(sender());
senderProcess->setReadChannel(QProcess::StandardOutput);
QString message = QString::fromLocal8Bit(senderProcess->readAllStandardOutput());

qDebug() << "CmdLauncher::processOutput message: " << message << endl;
if (message.contains("Error:")) {
    message.remove(QString("\n"));
    error_messages = message;
    emit getErrorMessagesChanged();
    if (message.contains(QString("Error: unknown connection"))) {
        secrets_required = true;
        emit getSecretsRequiredChanged();
    }
}
// wifi
if (message.contains("wlan0: connected") || message.contains("wlan0:connected")) {
    wifi_device_state = "Wifi-Connected";
    emit getWifiDeviceStateChanged();
    error_messages = "";
    emit getErrorMessagesChanged();
    rescanWifi();
    testInternetConnection();
}

}

</:code2:>

ਇੱਕ ਹੋਰ nmcli ਪ੍ਰਕਿਰਿਆ ਸ਼ੁਰੂ ਕਰੋ

ਜੇਕਰ ਤੁਸੀਂ ਹੁਣ ਹੇਠਾਂ ਦਿੱਤੇ ਫੰਕਸ਼ਨ ਨਾਲ ਇੱਕ ਹੋਰ ਐਨਐਮਸੀਲੀ ਕਮਾਂਡ ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ, ਤਾਂ ਆਉਟਪੁੱਟ ਨੂੰ ਉਪਰੋਕਤ ਨਿਗਰਾਨੀ ਫੰਕਸ਼ਨ ਦੁਆਰਾ ਰੋਕਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਫਿਰ ਮੁਲਾਂਕਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ "ਆਉਟਪੁੱਟਪ੍ਰੋਸੈਸ" ਵਿੱਚ ਅੱਗੇ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।
ਇਹ ਫੰਕਸ਼ਨ ਮੌਜੂਦਾ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ 'ਤੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਦਾ ਹੈ ਅਤੇ ਇਸ ਨੂੰ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ। "set_wifi_process->waitForReadread()" ਜਾਂ "set_wifi_process->waitForFinished()" ਨੂੰ ਸ਼ਾਮਲ ਨਾ ਕਰਨਾ ਮਹੱਤਵਪੂਰਨ ਹੈ, ਕਿਉਂਕਿ ਤਦ ਤੱਕ ਸਾਰੇ ਸੁਨੇਹਿਆਂ ਦੀ ਆਉਟਪੁੱਟ ਨੂੰ ਇਸ ਪ੍ਰਕਿਰਿਆ ਦੇ ਪੂਰਾ ਹੋਣ ਤੱਕ ਬਲੌਕ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।

void CmdLauncher::setWifi(QString ssid) {
    error_messages = "";
    emit getErrorMessagesChanged();

    QString uuid = "";
    for (int i = 0 ; i  networkConnections.length() ; i++) {
        QStringList connections = networkConnections[i].split(":");
        if (connections[1] == ssid)
        {
            uuid = connections[2];
        }
    }

    QStringList args_wifi_exist = {"nmcli", "connection", "up", uuid};
    set_wifi_process = new QProcess(this);
    set_wifi_process->setProcessChannelMode(QProcess::MergedChannels);
    set_wifi_process->start("sudo", args_wifi_exist);
    connect(set_wifi_process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutput()));
}

"connect(set_wifi_process, SIGNAL(readyReadStandardOutput()), ਇਹ, SLOT(processOutput())"" ਲਾਈਨ ਇਸ ਪ੍ਰਕਿਰਿਆ ਦੇ ਆਉਟਪੁੱਟ ਸੁਨੇਹਿਆਂ ਨੂੰ ਵਾਪਸ "processOutput" 'ਤੇ ਭੇਜਦੀ ਹੈ ਅਤੇ ਉੱਥੇ ਕੇਂਦਰੀ ਸਥਾਨ 'ਤੇ ਦੁਬਾਰਾ ਮੁਲਾਂਕਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। </:code3:>

Walter Prechtl

Walter Prechtl

ਏਥੇ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ: 12. March 2024
ਪੜ੍ਹਨ ਦਾ ਸਮਾਂ: 4 minutes