Wifi: detect channel and frequency

This commit is contained in:
李通洲
2024-11-21 16:08:40 +08:00
parent 9a1d18556d
commit d48c76b597
7 changed files with 56 additions and 5 deletions
+2
View File
@@ -18,6 +18,8 @@ struct FFWifiConnection
double signalQuality; // Percentage
double rxRate;
double txRate;
uint16_t channel;
uint16_t frequency; // MHz
};
typedef struct FFWifiResult
+2
View File
@@ -43,6 +43,8 @@ const char* ffDetectWifi(FFlist* result)
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->conn.channel = 0;
item->conn.frequency = 0;
ffStrbufAppendS(&item->inf.status, yyjson_get_str(yyjson_obj_get(root, "supplicant_state")));
if(!item->inf.status.length)
+11
View File
@@ -80,6 +80,8 @@ const char* ffDetectWifi(FFlist* result)
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->conn.channel = 0;
item->conn.frequency = 0;
ffStrbufAppendS(&item->inf.description, inf.interfaceName.UTF8String);
ffStrbufSetStatic(&item->inf.status, inf.powerOn ? "Power On" : "Power Off");
@@ -289,6 +291,15 @@ const char* ffDetectWifi(FFlist* result)
ffStrbufAppendF(&item->conn.security, "Unknown (%ld)", inf.security);
break;
}
item->conn.channel = (uint16_t) inf.wlanChannel.channelNumber;
switch (inf.wlanChannel.channelBand)
{
case kCWChannelBand2GHz: item->conn.frequency = 2400; break;
case kCWChannelBand5GHz: item->conn.frequency = 5000; break;
case kCWChannelBand6GHz: item->conn.frequency = 6000; break;
default: item->conn.frequency = 0; break;
}
}
return NULL;
}
+2
View File
@@ -34,6 +34,8 @@ const char* ffDetectWifi(FFlist* result)
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->conn.channel = 0;
item->conn.frequency = 0;
ffParsePropLines(ifconfig.chars, "ssid ", &item->conn.ssid);
if (item->conn.ssid.length)
+2
View File
@@ -339,6 +339,8 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED FFlist* result)
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->conn.channel = 0;
item->conn.frequency = 0;
ffStrbufSetF(&buffer, "/sys/class/net/%s/operstate", i->if_name);
if (!ffAppendFileBuffer(buffer.chars, &item->inf.status))
+35 -5
View File
@@ -49,6 +49,7 @@ const char* ffDetectWifi(FFlist* result)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanQueryInterface)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanFreeMemory)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanCloseHandle)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanGetNetworkBssList)
DWORD curVersion;
HANDLE hClient = NULL;
@@ -82,21 +83,23 @@ const char* ffDetectWifi(FFlist* result)
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->conn.channel = 0;
item->conn.frequency = 0;
convertIfStateToString(ifInfo->isState, &item->inf.status);
if(ifInfo->isState != wlan_interface_state_connected)
continue;
DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES);
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid;
WLAN_CONNECTION_ATTRIBUTES* connInfo = NULL;
DWORD bufSize = sizeof(*connInfo);
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_query_only;
if(ffWlanQueryInterface(hClient,
&ifInfo->InterfaceGuid,
wlan_intf_opcode_current_connection,
NULL,
&connectInfoSize,
&bufSize,
(PVOID*)&connInfo,
&opCode) != ERROR_SUCCESS
) continue;
@@ -107,8 +110,8 @@ const char* ffDetectWifi(FFlist* result)
(const char *)connInfo->wlanAssociationAttributes.dot11Ssid.ucSSID);
for (size_t i = 0; i < sizeof(connInfo->wlanAssociationAttributes.dot11Bssid); i++)
ffStrbufAppendF(&item->conn.bssid, "%.2X-", connInfo->wlanAssociationAttributes.dot11Bssid[i]);
ffStrbufTrimRight(&item->conn.bssid, '-');
ffStrbufAppendF(&item->conn.bssid, "%.2X:", connInfo->wlanAssociationAttributes.dot11Bssid[i]);
ffStrbufTrimRight(&item->conn.bssid, ':');
switch (connInfo->wlanAssociationAttributes.dot11PhyType)
{
@@ -201,7 +204,34 @@ const char* ffDetectWifi(FFlist* result)
else
ffStrbufAppendS(&item->conn.security, "Insecure");
WLAN_BSS_LIST* bssList = NULL;
if (ffWlanGetNetworkBssList(hClient,
&ifInfo->InterfaceGuid,
&connInfo->wlanAssociationAttributes.dot11Ssid,
connInfo->wlanAssociationAttributes.dot11BssType,
connInfo->wlanSecurityAttributes.bSecurityEnabled,
NULL,
&bssList) == ERROR_SUCCESS && bssList->dwNumberOfItems > 0
) {
item->conn.frequency = (uint16_t) (bssList->wlanBssEntries[0].ulChCenterFrequency / 1000);
ffWlanFreeMemory(bssList);
}
ffWlanFreeMemory(connInfo);
ULONG* channelNumber = 0;
bufSize = sizeof(*channelNumber);
if(ffWlanQueryInterface(hClient,
&ifInfo->InterfaceGuid,
wlan_intf_opcode_channel_number,
NULL,
&bufSize,
(PVOID*)&channelNumber,
&opCode) == ERROR_SUCCESS
) {
item->conn.channel = (uint16_t) *channelNumber;
ffWlanFreeMemory(channelNumber);
}
}
exit:
+2
View File
@@ -181,6 +181,8 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut
yyjson_mut_obj_add_real(doc, conn, "signalQuality", wifi->conn.signalQuality);
yyjson_mut_obj_add_real(doc, conn, "rxRate", wifi->conn.rxRate);
yyjson_mut_obj_add_real(doc, conn, "txRate", wifi->conn.txRate);
yyjson_mut_obj_add_uint(doc, conn, "channel", wifi->conn.channel);
yyjson_mut_obj_add_uint(doc, conn, "frequency", wifi->conn.frequency);
}
FF_LIST_FOR_EACH(FFWifiResult, item, result)