天天看點

qt獲得mac位址下面代碼為linux下獲得mac位址的方式:

我們在和伺服器進行通訊時,有時需要上傳本機相關資訊:賬号、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;
}