QT_QML WiFi连接(1/2)(windows篇)

2023-11-12

一、大概环境介绍

QT版本:5.12.1
编译器:MSVC2017
系统:Windows10_22H2

功能:扫描、连接(已配置直接连接,未配置输入密码连接,无密码WiFi连接),忘记WiFi等

ps.
(1)由于对wlanapi不太熟悉,所以这里wlanapi和windows控制台命令混合使用。
(2)代码写完有一段时间了,整理一下发出来当做一次复习,由于一些原因不能发源码,而且代码是截取出来的,直接复制可能会报错,仅当作给大家提供一个思路。
(3)代码注释可能不太全,但是每个我踩过坑的地方都有详尽的注释
(4)这里的代码相当于后端,给QML调用的,所以有些逻辑可能比较绕

二、实现功能&代码

1.包含文件&结构体&变量定义

(1)头文件

#include <QObject>
#include <QList>
#include <QString>
#include <QProcess>
#include <QTime>
#include <QCoreApplication>
#include "Windows.h"
#include "wlanapi.h"
#include "QNetworkInterface"
#include "QNetworkAddressEntry"
#include "sstream"

(2)wifi信息结构体

typedef struct _WifiListInfo{
    QString ssid;//ID
    QString level;//信号等级
    QString keyType;//加密类型
}WifiListInfo;

(3)连接过的WiFi信息结构体

typedef struct _windowsWifiHistoryInfo {
    QString ssid;//ID
    QString passWord;//密码——这份代码没用到
}windowsWifiHistoryInfo;

(4)变量、指针定义

	QList<WifiListInfo> wifiInfoList;//所有wifi信息列表
    QProcess  *m_Process;//windows控制台操作指针
    //网络连接部分
    HANDLE hClientHandle;//操作句柄
    PWLAN_INTERFACE_INFO_LIST pInterfaceList;//系统的网口信息
    QList<windowsWifiHistoryInfo>windowsWifiHistoryInfoList;//连接过的WiFi列表

(5)定义的WiFi连接XML文件

A、有密码

static const QString STR_PROFILE=
"<?xml version=\"1.0\"?> \
<WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">\
    <name>Home</name>\
    <SSIDConfig>\
        <SSID>\
            <hex>home</hex>\
        </SSID>\
    </SSIDConfig>\
    <connectionType>ESS</connectionType>\
    <connectionMode>auto</connectionMode>\
    <MSM>\
        <security>\
            <authEncryption>\
                <authentication>WPA2PSK</authentication>\
                <encryption>AES</encryption>\
                <useOneX>false</useOneX>\
            </authEncryption>\
            <sharedKey>\
                <keyType>passPhrase</keyType>\
                <protected>false</protected>\
                <keyMaterial>AAAAAA</keyMaterial>\
            </sharedKey>\
        </security>\
        </MSM>\
        </WLANProfile>";

B、无密码

static const QString STR_PROFILE_NoPossWord=
        "<?xml version=\"1.0\"?> \
        <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">\
            <name>Home</name>\
            <SSIDConfig>\
                <SSID>\
                    <hex>home</hex>\
                </SSID>\
            </SSIDConfig>\
            <connectionType>ESS</connectionType>\
            <connectionMode>auto</connectionMode>\
            <MSM>\
                <security>\
                    <authEncryption>\
                        <authentication>open</authentication>\
                        <encryption>none</encryption>\
                        <useOneX>false</useOneX>\
                    </authEncryption>\
                </security>\
                </MSM>\
                </WLANProfile>";

2、获取范围内WiFi信息

QStringList CWifiInfoManage::getWifiInfoList()
{
	QStringList vWifiInfoList;
    DWORD dwError = ERROR_SUCCESS;
    DWORD dwNegotiatedVersion;
    dwError = WlanOpenHandle(1, nullptr, &dwNegotiatedVersion, &hClientHandle);
    if (dwError != ERROR_SUCCESS)
    {
//        qDebug()<<"未打开成功!";
        WlanCloseHandle(hClientHandle,nullptr);
        return vWifiInfoList;
    }
    dwError = WlanEnumInterfaces(hClientHandle, nullptr,&pInterfaceList);//获取计算机上可用LAN口
    if ( dwError != ERROR_SUCCESS )
    {
//        qDebug()<<"未发现wifi相关列表!";
        WlanFreeMemory(pInterfaceList);//释放列表
        //释放内存,从Native Wifi函数返回的任何内存必须释放
        WlanCloseHandle(hClientHandle,nullptr);//关闭wlan
        return vWifiInfoList;
    }
    GUID &guid = pInterfaceList->InterfaceInfo[0].InterfaceGuid;//指定lan口,无线网卡一般是0
    PWLAN_AVAILABLE_NETWORK_LIST pWLAN_AVAILABLE_NETWORK_LIST = nullptr;
    dwError = WlanGetAvailableNetworkList(hClientHandle, &guid,2,nullptr, &pWLAN_AVAILABLE_NETWORK_LIST);//获取指定LAN口上的所有网络信息——扫描wifi
    if (dwError != ERROR_SUCCESS)
    {
//        qDebug()<<"未发现可用的网络!";
        WlanFreeMemory(pInterfaceList);
        WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);
        WlanCloseHandle(hClientHandle,nullptr);
        return vWifiInfoList;
    }
    WLAN_AVAILABLE_NETWORK wlanAN;
    //结构包含可用的无线网络信息
    //访问的是_WLAN_AUTH_CIPHER_PAIR_LIST结构体中的成员,表示可用网络的数量
    DWORD numberOfItems = pWLAN_AVAILABLE_NETWORK_LIST->dwNumberOfItems;//储存可用网络的个数
    QString NumberAvailWIFI = QString::number(numberOfItems,10);
    if (numberOfItems > 0)//遍历所有的
    {
        wifiInfoList.clear();
        for(DWORD i = 0; i <numberOfItems; i++)
        {
            //访问的是_WLAN_AUTH_CIPHER_PAIR_LIST结构体中的成员,表示可用网络的数目,每个ip都会存在Network数组里面
            wlanAN = pWLAN_AVAILABLE_NETWORK_LIST->Network[i];
            if (wlanAN.dot11Ssid.uSSIDLength != 0)
            {
                WifiListInfo wWifiListInfo;
                //获取SSID
                char *p = (char*) wlanAN.dot11Ssid.ucSSID;
                wWifiListInfo.ssid = QString::fromUtf8(p);
                bool uniqueName = true;
                for (int i=0;i<wifiInfoList.size();i++)
                {
                    if(wWifiListInfo.ssid == wifiInfoList[i].ssid)
                    {
                        uniqueName = false;
                    }
                }
                if(wWifiListInfo.ssid==""||uniqueName == false)
                    continue;
                //获取信号等级
                unsigned long int level = wlanAN.wlanSignalQuality;
                if(level>0&&level<=25)
                    wWifiListInfo.level = "0";
                else if (level>25&&level<=50)
                    wWifiListInfo.level = "1";
                else if (level>50&&level<=75)
                    wWifiListInfo.level = "2";
                else if (level>75&&level<=100)
                    wWifiListInfo.level = "3";
                //是否加密
                wWifiListInfo.keyType = "0";
                if(wlanAN.bSecurityEnabled)
                    wWifiListInfo.keyType = "1";
                wifiInfoList.append(wWifiListInfo);
                QString sWifiInfo = wWifiListInfo.ssid+","+wWifiListInfo.level+","+wWifiListInfo.keyType;
                vWifiInfoList.append(sWifiInfo);
            }
        }
    }
    return vWifiInfoList;
}

3、获取本机连接(配置)过的WiFi列表

没有找到wlanapi上的接口,使用命令行的方式。可是在CMD上实际试一试,可以很清楚的看到命令的作用

void CWifiInfoManage::getHistoryWifiList()
{
	m_Process =new QProcess();
    m_Process->start("netsh wlan show profiles");
    m_Process->waitForStarted();
    m_Process->waitForFinished();
    QString strConfig = QString::fromLocal8Bit(m_Process->readAllStandardOutput());
    strConfig.remove("\r");
    strConfig.remove("\n");
    strConfig.remove(" ");
    QStringList strConfigList = strConfig.split("所有用户配置文件:");
    windowsWifiHistoryInfoList.clear();
    windowsWifiHistoryInfo fillaWifi;
    fillaWifi.ssid = "fillaWifiInfo";
    windowsWifiHistoryInfoList.append(fillaWifi);//使用一个无效参数填充0位
    for (int i=1;i<strConfigList.length();i++)
    {
        windowsWifiHistoryInfo wifiConfig;
        wifiConfig.ssid = strConfigList[i];
        windowsWifiHistoryInfoList.append(wifiConfig);
    }
}

4、连接

这里分几种情况
1、未配置WiFi(使用定义的XML文件连接)(代码中有对XML文件部分的解释,仔细看)
(1)有密码
(2)无密码
2、已配置WiFi(通过SSID获取系统的XML文件用于连接)

//参数解释:依次为WiFi名称,密码(已配置的WiFi传空就可以了),加密类型,是否配置过(连接过)
//有没有配置过直接遍历windowsWifiHistoryInfoList列表
bool CWifiInfoManage::connectWifi(QString wifiName, QString passWord, int keyType, int index)
{
	//已配置wifi直接引用xml文件连接
	if(index!=0)
    {
        LPWSTR profile;
        DWORD dwFlags = WLAN_PROFILE_GET_PLAINTEXT_KEY | WLAN_PROFILE_USER;
        DWORD dwGrantedAccess = WLAN_READ_ACCESS;
        LPWSTR pProfileXml;
        std::wstring wlpstrstd = wifiName.toStdWString();
        LPCWSTR str = wlpstrstd.c_str();
		//根据WiFi名称获取对应的XML文件
        DWORD dwResult = WlanGetProfile(hClientHandle,
                                        &pInterfaceList->InterfaceInfo[0].InterfaceGuid,
                                        str,
                                        NULL,
                                        &pProfileXml,
                                        &dwFlags,
                                        &dwGrantedAccess);
        if(dwResult == ERROR_SUCCESS)
        {
            profile = pProfileXml;
        }
        DWORD dwReasonCode = 0;
        //使用这个XML文件进行连接
        dwResult  = WlanSetProfile(hClientHandle,
                                   &pInterfaceList->InterfaceInfo[0].InterfaceGuid,
                                   0,
                                   profile,
                                   NULL,
                                   TRUE,
                                   NULL,
                                   &dwReasonCode);
        if(dwResult == ERROR_SUCCESS)
        {
            wchar_t wifi[MAX_PATH] = {};
            wifiName.toWCharArray(wifi);
            WLAN_CONNECTION_PARAMETERS wlanConnPara;
            wlanConnPara.wlanConnectionMode =wlan_connection_mode_profile ;
            wlanConnPara.strProfile =wifi;
            wlanConnPara.pDot11Ssid = NULL;
            wlanConnPara.dot11BssType = dot11_BSS_type_infrastructure;
            wlanConnPara.pDesiredBssidList = NULL;
            wlanConnPara.dwFlags = WLAN_CONNECTION_HIDDEN_NETWORK;
            DWORD dwResult = 0;
            dwResult = WlanConnect(hClientHandle,
                                   &pInterfaceList->InterfaceInfo[0].InterfaceGuid,
                                   &wlanConnPara ,NULL);
            if(dwResult!=ERROR_SUCCESS)
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    //未配置wifi手动配置xml文件连接
    else
    {
        /*wifi名称为中文时会连接不上
         * ssid节点的<name>%1</name>直接传入中文会连接不上(ssid节点无<hex>%1</hex>属性时)(原因:可能是编码问题,但检查配置文件看不出来~)
         * 解决方法:在ssid节点有<hex>%1</hex>属性时,会优先调用此属性进行连接,所以这里直接将wifi名称转为HEX
        */
        std::string stdWifiName = wifiName.toStdString();
        const std::string hex = "0123456789ABCDEF";
        std::stringstream ss;
        for (std::string::size_type i = 0; i < stdWifiName.size(); ++i)
            ss << hex[(unsigned char)stdWifiName[i] >> 4] << hex[(unsigned char)stdWifiName[i] & 0xf];
        QString hexWifiName = QString::fromStdString(ss.str());
        wchar_t profile[1024] = {};
        if(keyType == 0)//未配置未加密wifi
        {
            QString strProfile = STR_PROFILE_NoPossWord;
            QRegExp regName("<name>.*</name>");
            regName.setMinimal(true);
            strProfile.replace(regName, QString("<name>%1</name>").arg(wifiName));
            QRegExp regHex("<hex>.*</hex>");
            regHex.setMinimal(true);
            strProfile.replace(regHex, QString("<hex>%1</hex>").arg(hexWifiName));
            std::wstring wlpstrstd = strProfile.toStdWString();
            strProfile.toWCharArray(profile);
        }
        else//未配置加密wifi
        {
            QString strProfile = STR_PROFILE;
            QRegExp regName("<name>.*</name>");
            regName.setMinimal(true);
            strProfile.replace(regName, QString("<name>%1</name>").arg(wifiName));
            QRegExp regHex("<hex>.*</hex>");
            regHex.setMinimal(true);
            strProfile.replace(regHex, QString("<hex>%1</hex>").arg(hexWifiName));
            QRegExp regPassword("<keyMaterial>.*</keyMaterial>");
            regPassword.setMinimal(true);
            strProfile.replace(regPassword, QString("<keyMaterial>%1</keyMaterial>").arg(passWord));
            std::wstring wlpstrstd = strProfile.toStdWString();
            strProfile.toWCharArray(profile);
        }
        DWORD dwReasonCode = 0;
        DWORD dwResult  = WlanSetProfile(hClientHandle,
                                         &pInterfaceList->InterfaceInfo[0].InterfaceGuid,
                                         0,
                                         profile,
                                         NULL,
                                         TRUE,
                                         NULL,
                                         &dwReasonCode);
        if(dwResult == ERROR_SUCCESS)
        {
            wchar_t wifi[MAX_PATH] = {};
            wifiName.toWCharArray(wifi);
            WLAN_CONNECTION_PARAMETERS wlanConnPara;
            wlanConnPara.wlanConnectionMode =wlan_connection_mode_profile ;
            wlanConnPara.strProfile =wifi;
            wlanConnPara.pDot11Ssid = NULL;
            wlanConnPara.dot11BssType = dot11_BSS_type_infrastructure;
            wlanConnPara.pDesiredBssidList = NULL;
            wlanConnPara.dwFlags = WLAN_CONNECTION_HIDDEN_NETWORK;
            DWORD dwResult = 0;
            dwResult = WlanConnect(hClientHandle,
                                   &pInterfaceList->InterfaceInfo[0].InterfaceGuid,
                                   &wlanConnPara ,NULL);
            if(dwResult!=ERROR_SUCCESS)
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    return true;
}

5、连接失败处理(已配置过的WiFi)

可能原因:
1、密码改了
2、信号弱
3、其他~
这里全都当作密码改了处理的,直接从系统删掉该配置信息

void CWifiInfoManage::removeWifiInfo(QString wifiName)
{
    std::wstring wlpstrstd = wifiName.toStdWString();
    LPCWSTR str = wlpstrstd.c_str();
    DWORD dwResult = WlanDeleteProfile(hClientHandle,
                                       &pInterfaceList->InterfaceInfo[0].InterfaceGuid,
                                       str,
                                       NULL);
}

三、总结

功能可能比较鸡肋~
但在一些特使场景还是会有需求的。
————————————————————————————————————————————
这是QT WiFi连接的第一篇,共两篇。
下一篇是安卓的,这个用处大一点~
等有时间整理了再发出来

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT_QML WiFi连接(1/2)(windows篇) 的相关文章

  • Node.js - 将数据缓冲到 Ffmpeg

    我使用 Node js 和 Ffmpeg 来创建动画 因为我试图避免第三方 avi mp4 解析器 所以我决定将动画输出为原始 rgb24 数据文件 然后使用一些程序将其转换为 mp4 文件 我发现 Ffmpeg 是免费且开源的 它完全可以
  • Excel的解析路径

    其实我想问以下问题 对于位于 目录中定义的 PATH 怎么能 我找出这些目录中的哪个 找到了 因为我需要使用 Process Run 从 C 运行 Excel 并且只需指示 Excel 即可正常工作 Windows 似乎知道在哪里可以找到它
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • “composer”在 Windows 服务器中未被识别为内部或外部命令

    我使用的是Windows Server 2008操作系统 我下载作曲家安装程序 exe https getcomposer org download 并安装到我的电脑上 当我尝试时composer install 我收到错误 compose
  • 如何编写 .bat 或 .cmd 文件来从 PATH 中删除元素?

    Related 如何列出批处理文件中路径的元素 https stackoverflow com questions 1424558 FOR 是如何运作的 https stackoverflow com questions 817280 ho
  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • Ruby On Rails 与 Windows Vista - 最佳设置? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您认为 Win Vista 环境中 RoR 的最佳设置是什么 我尝试过 radrails eclipse 插件 它对我来说似乎太庞大了 我也开始
  • 我可以在 Emacs 的 shell 模式下使用 PowerShell 吗?

    我可以在 emacs 的 shell 模式下使用 powershell 作为 shell 吗 How 请参阅 Jeffrey Snover 的博客文章在 Emacs 内运行的 PowerShell http blogs msdn com p
  • 如何使用C++在Windows中获取MAC地址? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Powershell 中的反斜杠

    为什么 split 参数的字符串需要两个反斜杠 而 join 参数的字符串只需要一个反斜杠 反引号是 Powershell 中的转义字符 字符前面的反斜杠有什么作用 path C folder test unit1 testing resu
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 在 Windows 上使用“perl6”命令和 Git Bash

    使用 Windows 我安装了乐道之星 https rakudo org files和 Git 并确保C rakudo bin and C rakudo share perl6 site bin位于我的 Path 环境变量中 现在 输入pe
  • 无法启动 Windows 快捷方式

    我正在尝试使用 python 启动 Windows 我已经尝试了 os system subprocess call os startfile 等多种方法 但总是收到错误消息 指出路径不存在 我知道路径是正确的 因为我尝试在 CMD EXE
  • 多个原始输入窗口接收器

    我有一个仅消息窗口 ATL CWindowImpl 它使用 RIDEV INPUTSINK 标志将自身注册为原始输入 这意味着无论该窗口是否是前台窗口 它都会获取所有输入 当该窗口只有一个实例时 这非常有效 但是 当我创建超过 1 个窗口实
  • 如何阻止“gem”实用程序访问我的主目录?

    当我跑步时 gem install
  • 无法在 cmd 中通过管道传递 cmdlet 对象

    我正在使用这个 powershell 命令来获取特定的用户配置文件 获取 WmiObject Class Win32 UserProfile Where Object LocalPath eq C Users Pela 但是当我通过调用 p
  • 虚拟USB设备的安装与仿真

    我已经读过创建虚拟USB设备 https stackoverflow com questions 5016363 creating a virtual usb device and 虚拟USB设备 https stackoverflow c
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • TCHAR 仍然相关吗?

    我是 Windows 编程新手 在读完 Petzold 的书后 我想知道 使用TCHAR类型和 T 函数来声明字符串或者我应该使用wchar t and L 新代码中的字符串 我将仅针对现代 Windows 截至撰写本文时版本 10 和 1
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您

随机推荐

  • 记一次swoole连接数太多导致的错误

    原先就有点担心这个项目正式上线会出现各种问题 所以刚上线就赶紧查看日志 果然 频繁出现错误 WARNING Server accept connection accept failed Error Too many open files 2
  • 使用python将excel表格中的A+,A等分数自动转换成百分制分数,并自动保存于excel中

    使用该简短程序 将excel表格中的A A A B 等转换成对应的百分制分数 再加和平均 并自动保存于excel表格中 本文较为适合学生数次作业分数的最终统计 本例是将学生的八次作业转换成百分制并综合平均得到最终分数 并自动将每位学生的分数
  • Java内存分配策略

    1 内存分配有哪些策略 我们从编译原理讲起 不同的开发环境 开发语言都会有不同的策略 一般来说 程序运行时有三种内存分配策略 静态的 栈式的 堆式的 静态存储 是指在编译时就能够确定每个数据目标在运行时的存储空间需求 因而在编译时就可以给它
  • 数组常用的方法

    穷举法是什么 穷举法 顾名思义 是指根据题目的条件确定答案的大致范围 并在此范围内对所有可能的情况逐一验证 直到全部情况验证完毕 若某个情况符合题目的条件 则为本问题的一个解 若全部情况验证后都不符合题目的条件 则本题无解 什么是数组 数组
  • 类模板案例_数组类封装

    案例描述 实现一个通用的数组类 要求如下 可以对内置数据类型以及自定义数据类型的数据进行存储 将数据中的数据存储到堆区 new 构造函数中可以传入数组的容量 提供对应的拷贝构造函数以及opertor 防止浅拷贝问题 提供尾插法和尾删法对数组
  • websocket 基本使用

    websocket 第一次创建连接的时候也是建立了一个http连接 之后才能传递消息 websocket特点 HTTP响应头 和 websocket响应头 的区别 websocket 响应头 前端代码 div div
  • Vue Hooks 让Vue开发更简单与高效

    Vue Hooks 让Vue开发更简单与高效 介绍 Vue Hooks 是一个基于 Vue js 的插件 它提供了一种新的方式来编写 Vue 组件 使得开发更加简单和高效 它借鉴了 React Hooks 的概念 通过使用 Hooks 我们
  • 杂项 Windows安装WSL

    WechatIMG188 jpeg 安装WSL 检查 gt wsl 适用于 Linux 的 Windows 子系统没有已安装的分发版 可以通过访问 Microsoft Store 来安装分发版 https aka ms wslstore c
  • 1.结合宏定义三目运算符实现两个数求最大值

    一 题目 结合宏定义三目运算符实现两个数求最大值 二 知识点 1 三目运算符 三目运算符又称条件运算符 格式 表达式1 表达式2 表达式3 运算规则 先执行表达式1 然后判断表达式1是否成立 如果成立就执行表达式2 否则就执行表达式3 2
  • 华为机试C语言-书籍叠放问题2

    题目描述 https www cnblogs com zucc 31701019 p 14967899 html https zhuanlan zhihu com p 526649048 这题贪心就可以了 强行动态规划有点勉强 但是也刚好练
  • spring data rest 缓存/spring boot Jpa 二级缓存 ehcache 与 redis

    这两天都在为学校的项目做准备 期间也遇到了很多问题 比如自己写代码生成器 比如授权这些 发现自己还是有点太弱了 但是最为棘手的莫过于缓存的问题 主要原因还是自己太想用 spring data rest 了 这个在假期就没有解决缓存的问题 现
  • [转]可绕过WAF的Burp Suite插件 – BypassWAF

    工具地址 https github com codewatchorg bypasswaf 工具原理 https www codewatch org blog p 408 quote Users can modify the X Origin
  • 【无监督】4、BYOL

    文章目录 一 背景和动机 二 方法 2 1 BYOL 网络结构 2 2 实现细节 三 效果 3 1 总体效果 3 2 和 SimCLR 的对比 四 BYOL 真的没有用到负样本吗 BN 之讨论 论文 Bootstrap Your Own L
  • xrd计算晶面间距_jade基本操作(6.残余应力计算)

    微信公众号试行乱序推送 为了不错过更新 请点击本页面最上方的 结构分析表征 进入公众号主页 点击右上角的三个小点点 在弹出的界面点击 设为星标 并在看完图文或视频后点击右下角的 在看 和 赞 本公众号以各类仪器的测试 分析教程 欢迎关注同名
  • 学习笔记(01):MySQL数据库从入门到搞定实战-DDL之数据库

    立即学习 https edu csdn net course play 27328 362512 utm source blogtoedu SQL 结构化查询语言 用于访问和操作数据库 主要包括数据定义 数据操纵 数据查询和数据控制 DDL
  • element-ui 关于日期范围选择控件,如何限制只能选择30天

    问题描述 element ui 日期选择器如何限制只能选择一个月 超过一个月不能选择 也就是在选定起始日期时 只能向后面选择30天 同时不能选择超过今天的日期 知识点 element ui日期选择组件地址 http element cn e
  • MAC 认证和 MAC 旁路认证

    一 MAC 认证原理 1 MAC认证是什么 MAC 认证 是指终端网络接入控制设备自动获取终端的 MAC 地址 作为接入网络的凭证发到RADIUS 服务器进行校验 MAC 认证是一种基于接口和 MAC 地址对用户的网络访问权限进行控制的认证
  • 【101】使用 nRF24L01 射频模块操控舵机云台

    Bill of Material 遥控器 9V 电池 x1 9V电池扣 x1 Arduino UNO x1 摇杆模块 x1 nRF24L01 射频通讯模块 x1 邦德线 面包板 云台端 9V 电池 x1 9V电池扣 x1 Arduino U
  • C#中Dictionary的用法

    转自 http www studyofnet com news 45 html 本文导读 在C 中 Dictionary提供快速的基于键值的元素查找 他的结构是这样的 Dictionary lt key value gt 当你有很多元素的时
  • QT_QML WiFi连接(1/2)(windows篇)

    目录 一 大概环境介绍 二 实现功能 代码 1 包含文件 结构体 变量定义 1 头文件 2 wifi信息结构体 3 连接过的WiFi信息结构体 4 变量 指针定义 5 定义的WiFi连接XML文件 A 有密码 B 无密码 2 获取范围内Wi