مقصد رسبیری پائی 4 کے لئے کیو ٹی ایپلی کیشن لکھنا تھا جسے مختلف ڈبلیو ایل اے این رسائی پوائنٹس کے درمیان سوئچ کرنے اور متعلقہ اسناد کو اسٹور کرنے کے لئے استعمال کیا جاسکتا ہے۔
میں نے راسپبین بسٹر لائٹ کی تصویر اور کیو ٹی انسٹالیشن کا استعمال کیا جیسا کہ راسبیری پائی 4 پر کیو ٹی میں بیان کیا گیا ہے۔
اس کے علاوہ ، میں نے نیٹ ورک منیجر انسٹال کیا ہے ، جسے شیل کمانڈ (این ایم سی ایل آئی ...) کے ذریعہ استعمال کیا جاسکتا ہے۔ نیٹ ورک کنکشن بنائیں، تشکیل دیں اور ان کا انتظام کریں۔
اس بارے میں معلومات https://wiki.debian.org/de/NetworkManager یا https://developer.gnome.org/NetworkManager/stable/nmcli.html کے تحت مل سکتی ہیں۔
نیٹ ورک منیجر ایک کمانڈ پیش کرتا ہے جسے نگرانی کے عمل کو شروع کرنے کے لئے استعمال کیا جاسکتا ہے ، جو پھر مختلف انٹرفیس (وانا0 یا ایتھ0) میں تبدیلیوں پر تبصرہ کرتا ہے (مثال کے طور پر غیر دستیاب ، منقطع ، رابطہ ، منسلک ، ...)۔
میں اس نگرانی کو جی یو آئی میں نیٹ ورک مقامات کی مختلف حیثیتوں کو ظاہر کرنے کے لئے استعمال کرنا چاہتا تھا۔ دو مسائل پیدا ہوئے:
- اگر این ایم سی ایل آئی کے متعدد احکامات فوری طور پر جاری کیے گئے تھے تو ، مختلف اسٹیٹس کے بارے میں رائے وقت کی تاخیر کے ساتھ آئی اور جی یو آئی میں براہ راست ظاہر نہیں کی جاسکتی تھی۔
- این ایم سی ایل آئی کمانڈز کا فیڈ بیک مختلف سلاٹس میں بھیجا گیا تھا اور اس طرح خراب مربوط کیا جا سکتا تھا.
مانیٹرنگ فنکشن
سب سے پہلے، ہمیں مانیٹرنگ فنکشن (مانیٹرنگ ڈیوائسز) اور پبلک سلاٹ فنکشن کی ضرورت ہے، جو مانیٹرنگ آؤٹ پٹ کو روکتا ہے اور تشخیص کرتا ہے اور پھر جی یو آئی کو اسٹیٹس پیغامات بھیجتا ہے، مثال کے طور پر.
"مانیٹر ڈیوائسز" فنکشن میں ، جو ایپلی کیشن شروع ہونے پر خود بخود شروع ہوتا ہے ، این ایم سی ایل آئی کمانڈ کو سوڈو کے ساتھ شروع کیا جاتا ہے: سوڈو این ایم سی ایل آئی مانیٹر
بیان "سیٹ پروسیس چینل موڈ (کیو پروسیس:: ضم شدہ چینلز)" میں کہا گیا ہے کہ "اسٹینڈرڈ آؤٹ پٹ" اور "اسٹینڈرڈ ایرر" ایک چینل میں ایک ساتھ دکھائے جاتے ہیں اور اس طرح ایک فنکشن کے ساتھ اس کا جائزہ لیا جاسکتا ہے۔
لائن "کنیکٹ (device_monitoring_process، سگنل (ریڈی ریڈ اسٹینڈرڈ آؤٹ پٹ ())، یہ، سلاٹ (پروسیس آؤٹ پٹ ())"" کا استعمال کیا جاتا ہے جب بھی کوئی پیغام دکھایا جاتا ہے (ریڈی ریڈ اسٹینڈرڈ آؤٹ پٹ)، اسے سلاٹ "پروسیس آؤٹ پٹ" پر بھیجا جاتا ہے۔
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:>
تشخیص کا فنکشن
پیغامات کی تشخیص اس کے بعد "پروسیس آؤٹ پٹ" فنکشن میں کی جاتی ہے۔ کیو پروسیس سینڈر پروسیس تمام این ایم سی ایل آئی کمانڈز کے تمام پیغامات کو روکتا ہے - نہ صرف مانیٹرنگ کمانڈ کے۔
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:>
ایک اور این ایم سی ایل آئی عمل شروع کریں
اگر آپ اب نیچے دیئے گئے فنکشن کے ساتھ ایک اور این ایم سی ایل آئی کمانڈ شروع کرتے ہیں تو ، آؤٹ پٹ کو مندرجہ بالا مانیٹرنگ فنکشن کے ذریعہ روکا جاتا ہے اور پھر "آؤٹ پٹ پروسیس" میں جائزہ لیا جاسکتا ہے اور مزید پروسیس کیا جاسکتا ہے۔
یہ فنکشن موجودہ نیٹ ورک کنکشن میں سوئچ کرتا ہے اور اسے شروع کرتا ہے۔ یہ ضروری ہے کہ "set_wifi_process-ویٹ فار ریڈی ریڈ ()" یا "> set_wifi_process->فشڈ ()" کو شامل نہ کریں ، کیونکہ پھر اس عمل کے مکمل ہونے تک تمام پیغامات کی آؤٹ پٹ بلاک کردی جائے گی۔
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()));
}
لائن "کنیکٹ (set_wifi_process، سگنل (ریڈی ریڈ اسٹینڈرڈ آؤٹ پٹ ())، یہ، سلاٹ (پروسیس آؤٹ پٹ ()))" اس عمل کے آؤٹ پٹ پیغامات کو واپس "پروسیس آؤٹ پٹ" پر فارورڈ کرتی ہے اور مرکزی مقام پر دوبارہ جائزہ لیا جاسکتا ہے۔ </:code3:>