লক্ষ্যটি ছিল রাস্পবেরি পাই 4 এর জন্য একটি কিউটি অ্যাপ্লিকেশন লেখা যা বিভিন্ন ডাব্লুএলএএন অ্যাক্সেস পয়েন্টগুলির মধ্যে স্যুইচ করতে এবং সম্পর্কিত প্রমাণপত্রগুলি সঞ্চয় করতে ব্যবহার করা যেতে পারে।
আমি একটি রাস্পবিয়ান-বাস্টার-লাইট চিত্র এবং একটি কিউটি ইনস্টলেশন ব্যবহার করেছি যা রাস্পবেরি পাই 4 এ কিউটিতে একটি সূচনা পয়েন্ট হিসাবে বর্ণনা করা হয়েছে।
উপরন্তু, আমি নেটওয়ার্কম্যানেজার ইনস্টল করেছি, যা শেল কমান্ড দ্বারা ব্যবহার করা যেতে পারে (এনএমসিএলআই ...) নেটওয়ার্ক সংযোগগুলি তৈরি, কনফিগার এবং পরিচালনা করুন।
এ বিষয়ে তথ্য https://wiki.debian.org/de/NetworkManager বা https://developer.gnome.org/NetworkManager/stable/nmcli.html আওতায় পাওয়া যাবে।
নেটওয়ার্কম্যানেজার একটি কমান্ড সরবরাহ করে যা একটি পর্যবেক্ষণ প্রক্রিয়া শুরু করতে ব্যবহার করা যেতে পারে, যা তারপরে বিভিন্ন ইন্টারফেসের (wlan0 বা eth0) পরিবর্তনগুলির বিষয়ে মন্তব্য করে (উদাহরণস্বরূপ অনুপলব্ধ, সংযোগ বিচ্ছিন্ন, সংযোগকারী, সংযুক্ত, ...)।
আমি জিইউআইতে নেটওয়ার্ক অবস্থানগুলির বিভিন্ন স্থিতি প্রদর্শন করতে এই পর্যবেক্ষণটি ব্যবহার করতে চেয়েছিলাম। দুটি সমস্যা দেখা দিয়েছে:
- যদি বেশ কয়েকটি এনএমসিএলআই কমান্ড দ্রুত জারি করা হয়, তবে বিভিন্ন স্ট্যাটাস সম্পর্কে প্রতিক্রিয়া একটি সময় বিলম্বের সাথে এসেছিল এবং জিইউআইতে সরাসরি প্রদর্শিত হতে পারে না।
- এনএমসিএলআই কমান্ডগুলির প্রতিক্রিয়া বিভিন্ন স্লটে প্রেরণ করা হয়েছিল এবং এইভাবে দুর্বলভাবে সমন্বিত হতে পারে।
মনিটরিং ফাংশন
প্রথমত, আমাদের মনিটরিং ফাংশন (মনিটর ডিভাইস) এবং পাবলিক স্লট ফাংশন প্রয়োজন, যা মনিটরিং আউটপুটকে বাধা দেয় এবং মূল্যায়ন করে এবং তারপরে জিইউআইতে স্ট্যাটাস বার্তা প্রেরণ করে, উদাহরণস্বরূপ।
"মনিটর ডিভাইস" ফাংশনে, যা অ্যাপ্লিকেশনটি শুরু হওয়ার পরে স্বয়ংক্রিয়ভাবে শুরু হয়, এনএমসিএলআই কমান্ডটি সুডো দিয়ে শুরু হয়: সুডো এনএমসিএলআই মনিটর
"সেটপ্রসেসচ্যানেলমোড (কিউপ্রসেস:: মার্জচ্যানেলস)" বিবৃতিটিতে বলা হয়েছে যে "স্ট্যান্ডার্ড আউটপুট" এবং "স্ট্যান্ডার্ড ত্রুটি" একটি চ্যানেলে একসাথে প্রদর্শিত হয় এবং এইভাবে একটি ফাংশন দিয়ে মূল্যায়ন করা যেতে পারে।
"সংযোগ (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:>
অন্য nmcli প্রক্রিয়া শুরু করুন
আপনি যদি এখন নীচের ফাংশনটি দিয়ে আরেকটি এনএমসিএলআই কমান্ড শুরু করেন তবে আউটপুটটি উপরের মনিটরিং ফাংশন দ্বারা বাধাপ্রাপ্ত হয় এবং তারপরে "আউটপুটপ্রসেস" এ মূল্যায়ন এবং আরও প্রক্রিয়াকরা যেতে পারে।
এই ফাংশনটি একটি বিদ্যমান নেটওয়ার্ক সংযোগে স্যুইচ করে এবং এটি শুরু করে। "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:>