#include "WifiHelper.h"
#include <qdebug.h>
void WlanNotificationCallback(PWLAN_NOTIFICATION_DATA Arg1, PVOID Arg2) {
if (Arg1 != NULL) {
switch (Arg1->NotificationSource) {
case WLAN_NOTIFICATION_SOURCE_ACM:
const auto wifi_list_refresh = [&] {
auto obj = static_cast<WifiHelper*>(Arg2);
if (obj != nullptr) {
WCHAR GuidString[39] = { 0 };
int iRet = StringFromGUID2(Arg1->InterfaceGuid, (LPOLESTR)&GuidString, sizeof(GuidString) / sizeof(*GuidString));
obj->getNewInterfaceGuid(QString::fromStdWString(GuidString));
}
};
switch (Arg1->NotificationCode) {
case wlan_notification_acm_connection_complete:
{
if (Arg1->dwDataSize < sizeof(WLAN_CONNECTION_NOTIFICATION_DATA)) {
break;
}
auto data = (PWLAN_CONNECTION_NOTIFICATION_DATA)Arg1->pData;
QString ssid = QByteArray((char*)data->dot11Ssid.ucSSID, data->dot11Ssid.uSSIDLength);
if (data->wlanReasonCode == WLAN_REASON_CODE_SUCCESS) {
qDebug() << QString("%1 connection successed!").arg(ssid);
wifi_list_refresh();
} else {
wchar_t reasonCodeStr[1024] = { 0 };
WlanReasonCodeToString(data->wlanReasonCode, 1024, reasonCodeStr, NULL);
auto obj = static_cast<WifiHelper*>(Arg2);
if (obj != nullptr) {
obj->printErr(QString("%1 connection failed!").arg(ssid), QString::fromWCharArray(reasonCodeStr));
}
}
}
break;
case wlan_notification_acm_scan_complete:
case wlan_notification_acm_disconnected:
wifi_list_refresh();
break;
default:
break;
}
break;
}
}
qDebug() << "notifycode = " << Arg1->NotificationCode;
}
WifiHelper::WifiHelper(QString profileTemplateStr, QObject* parent)
: QObject(parent)
, profileTemplateStr(profileTemplateStr)
, pIfList(NULL)
{
DWORD dwMaxClient = 2;
DWORD dwCurVersion = 0;
DWORD dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
Q_ASSERT(dwResult == ERROR_SUCCESS);
DWORD dwNotifSourcePre;
dwResult = WlanRegisterNotification(hClient, WLAN_NOTIFICATION_SOURCE_ACM, TRUE, (WLAN_NOTIFICATION_CALLBACK)WlanNotificationCallback, this, NULL, &dwNotifSourcePre);
connect(this, &WifiHelper::getNewInterfaceGuid, this, &WifiHelper::reloadWifiListInMainThread);
}
WifiHelper::~WifiHelper() {
if (pIfList != NULL) {
WlanFreeMemory(pIfList);
pIfList = NULL;
}
WlanCloseHandle(hClient, NULL);
}
void WifiHelper::loadWifiInfo() {
wifiList.clear();
if (pIfList != NULL) {
WlanFreeMemory(pIfList);
pIfList = NULL;
}
DWORD dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
Q_ASSERT(dwResult == ERROR_SUCCESS);
for (int i = 0; i < (int)pIfList->dwNumberOfItems; i++) {
PWLAN_INTERFACE_INFO pIfInfo = (WLAN_INTERFACE_INFO*)&pIfList->InterfaceInfo[i];
WifiInfo wifiInfo;
wifiInfo.description = QString::fromStdWString(pIfInfo->strInterfaceDescription);
WCHAR GuidString[39] = { 0 };
int iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR)&GuidString, sizeof(GuidString) / sizeof(*GuidString));
wifiInfo.guid = pIfInfo->InterfaceGuid;
wifiInfo.guidStr = iRet == 0 ? "StringFromGUID2 failed" : QString::fromStdWString(GuidString);
switch (pIfInfo->isState) {
case wlan_interface_state_not_ready:
wifiInfo.status = "Not ready";
break;
case wlan_interface_state_connected:
wifiInfo.status = "Connected";
break;
case wlan_interface_state_ad_hoc_network_formed:
wifiInfo.status = "First node in a ad hoc network";
break;
case wlan_interface_state_disconnecting:
wifiInfo.status = "Disconnecting";
break;
case wlan_interface_state_disconnected:
wifiInfo.status = "Not connected";
break;
case wlan_interface_state_associating:
wifiInfo.status = "Attempting to associate with a network";
break;
case wlan_interface_state_discovering:
wifiInfo.status = "Auto configuration is discovering settings for the network";
break;
case wlan_interface_state_authenticating:
wifiInfo.status = "In process of authenticating";
break;
default:
wifiInfo.status = "Unknown state " + QString::number(pIfInfo->isState);
break;
}
wifiList << wifiInfo;
}
findActiveWireless(wifiList[0]);
wifiListRefreshed(wifiList.at(0));
}
void WifiHelper::connectWifi(int entryInfoIndex, QString passwordIfNeed) {
if(wifiList.size() > 0)
connectWifi(wifiList.at(0).guid,
wifiList.at(0).entryList.at(entryInfoIndex), passwordIfNeed
);
}
void WifiHelper::disconnectWifi() {
if(wifiList.size() > 0)
disconnectWifi(wifiList.at(0).guid);
}
void WifiHelper::reloadWifiListInMainThread(QString guidStr) {
loadWifiInfo();
for (int i = 0; i < wifiList.size(); i++) {
if (wifiList.at(i).guidStr == guidStr) {
findActiveWireless(wifiList[i]);
wifiListRefreshed(wifiList.at(i));
break;
}
}
}
void WifiHelper::connectWifi(const GUID& interfaceGuid, const EntryInfo& entryInfo, QString password) {
if (entryInfo.dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)
return;
disconnectWifi();
wchar_t profile[WLAN_MAX_NAME_LENGTH] = {};
if (!(entryInfo.dwFlags & WLAN_AVAILABLE_NETWORK_HAS_PROFILE)) {
setProfile(interfaceGuid, entryInfo, password);
}
entryInfo.ssid.toWCharArray(profile);
auto fstr = getProfileStr(interfaceGuid, entryInfo.ssid);
WLAN_CONNECTION_PARAMETERS parameter;
parameter.strProfile = profile;
parameter.pDot11Ssid = NULL;
parameter.pDesiredBssidList = NULL;
parameter.wlanConnectionMode = wlan_connection_mode_profile;
parameter.dot11BssType = entryInfo.dot11BssType;
parameter.dwFlags = WLAN_CONNECTION_HIDDEN_NETWORK;
DWORD dwResult = WlanConnect(hClient, &interfaceGuid, ¶meter, NULL);
if (dwResult != ERROR_SUCCESS) {
if (dwResult == ERROR_INVALID_PARAMETER) {
printErr(u8"无法连接", u8"不支持的连接!修改profile模板!");
} else {
Q_ASSERT(dwResult == ERROR_SUCCESS);
}
}
}
void WifiHelper::disconnectWifi(const GUID & interfaceGuid) {
DWORD dwResult = WlanDisconnect(hClient, &interfaceGuid, NULL);
Q_ASSERT(dwResult == ERROR_SUCCESS);
}
bool WifiHelper::setProfile(const GUID& interfaceGuid, const EntryInfo& entryInfo, QString password) {
wchar_t profile[2048] = { 0 };
QString profileStr = getProfileStr(entryInfo, password);
profileStr.toWCharArray(profile);
DWORD dwReasonCode;
wchar_t reasonCodeStr[1024] = { 0 };
DWORD dwResult = WlanSetProfile(hClient, &interfaceGuid, 0, profile, NUL
- 1
- 2
前往页