Raspberry Pi 4 NetworkManager設定ツール

この目的は、異なるWLANアクセスポイントを切り替えて関連するクレデンシャルを保存できるRaspberry Pi4用のQtアプリケーションを作成することでした。出発点として、Raspberry Pi 4上のQt.で説明されているように、raspbian-buster-liteイメージとQtインストールを使用しました。また、NetworkManagerをインストールしました。これにより、シェルコマンド(nmcli...)を使用して、ネットワーク接続を作成、設定、および管理できます。これに関する情報は、https://wiki.debian.org/de/NetworkManagerまたはhttps://developer.gnome.org/NetworkManager/stable/nmcli.htmlで見つけることができます。NetworkManagerは、監視プロセスを開始するために使用できるコマンドを提供します。このコマンドは、さまざまなインターフェース(wlan0またはeth0)への変更(使用不可、切断、接続中、接続など)についてコメントします。この監視を使用して、GUIでネットワークポイントのさまざまなステータスを表示したいと思いました。2つの問題が発生しました。- 複数のnmcliコマンドが連続して発行された場合、さまざまなステータスに関するフィードバックが遅れ、GUIにライブで表示できませんでした。- nmcliコマンドのフィードバックは異なるスロットで送信されたため、適切に調整できませんでした。## 監視機能

まず、監視機能(monitorDevices)とパブリックスロット機能が必要です。これらの機能は、監視出力をインターセプトして評価し、たとえば、ステータスメッセージをGUIに送信します。アプリケーションの起動時に自動的に起動する「monitorDevices」関数では、nmcliコマンドがsudo: sudo nmcli monitorを使用して起動されます。命令「setProcessChannelMode(QProcess :: MergedChannels)」は、「Standard-Output」と「Standard-Error」が1つのチャネルに一緒に表示されるため、1つの関数で評価できることを示しています。「connect (device_monitoring_process, SIGNAL(readyReadStandardOutput()), this, 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()));
}

## 評価関数

メッセージの評価は、「processOutput」関数で実行されます。ここで、QProcess senderProcessは、監視コマンドからのメッセージだけでなく、すべてのnmcliコマンドからのすべてのメッセージをインターセプトします。

void CmdLauncher::processOutput() {
    QProcess* senderProcess = qobject_cast(sender());
    senderProcess->setReadChannel(QProcess::StandardOutput);

    QString message = QString::fromLocal8Bit(senderProcess->readAllStandardOutput());

    qDebug() 

## 別のnmcliプロセスを起動

以下の関数を使用して別のnmcliコマンドを起動すると、出力は上記の監視関数によってインターセプトされ、「outputProcess」で評価および処理できます。この機能は、既存のネットワーク接続に切り替えて起動します。ここで重要なのは、たとえば「set_wifi_process-> waitForReadyRead()」や「set_wifi_process-> waitForFinished()」を組み込まないことです。これは、このプロセスが完了するまですべてのメッセージの出力がブロックされるためです。

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

    QString uuid = "";
    for (int i = 0 ; i 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()), this, SLOT(processOutput()))」という行は、このプロセスの出力メッセージを「processOutput」に戻し、中央のポイントで再度、評価できます。