我們在和伺服器進行通訊時,有時需要上傳本機相關資訊:賬号、IP、mac、硬碟序列号、cpu等等資訊,關于擷取這些資訊的方式有:
QHostInfo【擷取自己機器的主機名,也能擷取遠端伺服器的IP位址資訊或者根據IP位址找到對應的主機名稱,查詢方式也有阻塞式】,具體使用直接百度;
QNetworkInterface【這個主要是擷取IP位址和mac位址等資訊】
這裡總結下在擷取mac位址時,實際的場景中有虛拟機,自己項目的需求是:優先取實體機,且最多取兩個(一般的個人PC也就兩個:有線網卡和無線網卡),如果沒有實體機網卡,然後再取虛拟網卡(非實體網卡),關鍵代碼如下:
由于筆者是linux環境,linux下獲得虛拟網卡的方式參考的該博文:
https://blog.csdn.net/weixin_34055787/article/details/94046205
問題來了:windows下就自行百度了,方法也應該很多,估計從系統資料庫擷取吧。
下面代碼為linux下獲得mac位址的方式:
QString MainWindow::getMacAddress(bool deleteColon)
{
QString macAddr = "";
QStringList physicsMacDevices = QStringList();
QStringList virtualMacDevices = QStringList();
QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces(); // 擷取所有網絡接口清單
//獲得所有的虛拟網卡
QStringList allVirtualMac = QStringList();
QProcess *process = new QProcess(this);
connect(process, static_cast<void (QProcess::*)(int exitCode, QProcess::ExitStatus exitStatus)>(&QProcess::finished),
this, [&](int exitCode, QProcess::ExitStatus exitStatus) {
if(exitCode == 0 && exitStatus == QProcess::ExitStatus::NormalExit) {
allVirtualMac << QString::fromLocal8Bit(process->readAllStandardOutput()).split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
qDebug() << "all virtual mac " << allVirtualMac;
}
process->deleteLater();
});
process->start("ls", QStringList()<<"/sys/devices/virtual/net/");
//等待process執行結束
process->waitForFinished();
int macCount = nets.count();
QString strMacAddr = "";
for (int i = 0; i < macCount; i++) {
// 非回環位址:127.0.0.1
if (!nets[i].flags().testFlag(QNetworkInterface::IsLoopBack)) {
strMacAddr = nets[i].hardwareAddress();
if (deleteColon)
strMacAddr.replace(":", "");
qDebug() << "-----" << i << strMacAddr;
if (allVirtualMac.contains(nets[i].humanReadableName())) {
virtualMacDevices.append(strMacAddr);
qDebug() << "virtual address" << strMacAddr;
} else {
physicsMacDevices.append(strMacAddr);
qDebug() << "Physics address" << strMacAddr;
}
}
if (physicsMacDevices.size() == 2)
break;
}
if (!physicsMacDevices.isEmpty()) {
macAddr = QString(physicsMacDevices.join(","));
qDebug() << "return physics macAddr" << macAddr;
return macAddr;
}
if (!virtualMacDevices.isEmpty()) {
if (virtualMacDevices.size() > 1)
macAddr = virtualMacDevices.at(0) + "," + virtualMacDevices.at(1);
else
macAddr = virtualMacDevices.at(0);
}
qDebug() << "return macAddr" << macAddr;
return macAddr;
}