WiFi ルーターの RSSI を定期的にテキスト ファイルに記録する簡単なユーティリティを作成したいと考えています。ワイヤレス ルーターの RSSI 値を読み取るための Delphi ライブラリまたは API ラッパーを知っている人はいますか?
1 に答える
Native Wifi APIを使用して、アクティブなネットワーク wifi 接続の RSSI を取得できます。WlanOpenHandle
および関数を呼び出した後、列挙値と構造体へのポインターを渡すメソッドをWlanEnumInterfaces
実行する必要があります。ここから要素にアクセスし、最後にフィールドの値。WlanQueryInterface
wlan_intf_opcode_current_connection
WLAN_CONNECTION_ATTRIBUTES
wlanAssociationAttributes
wlanSignalQuality
これは、このフィールドの説明です。
wlan信号品質
A percentage value that represents the signal quality of the network.
WLAN_SIGNAL_QUALITY はタイプ ULONG です。このメンバーには、0 ~ 100 の値が含まれます。値 0 は、実際の RSSI 信号強度が -100 dbm であることを意味します。値 100 は、実際の RSSI 信号強度が -50 dbm であることを意味します。線形補間を使用して、1 ~ 99 の wlanSignalQuality 値の RSSI 信号強度値を計算できます。
このサンプルコードを試してください
uses
Windows,
SysUtils,
nduWlanAPI in 'nduWlanAPI.pas',
nduWlanTypes in 'nduWlanTypes.pas';
procedure Scan();
var
hClient : THandle;
dwVersion : DWORD;
ResultInt : DWORD;
pInterface : Pndu_WLAN_INTERFACE_INFO_LIST;
i : Integer;
pInterfaceGuid : TGUID;
pdwDataSize, RSSI : DWORD;
ppData : pndu_WLAN_CONNECTION_ATTRIBUTES;
begin
ResultInt:=WlanOpenHandle(1, nil, @dwVersion, @hClient);
try
if ResultInt<> ERROR_SUCCESS then
begin
WriteLn('Error Open CLient'+IntToStr(ResultInt));
Exit;
end;
ResultInt:=WlanEnumInterfaces(hClient, nil, @pInterface);
if ResultInt<> ERROR_SUCCESS then
begin
WriteLn('Error Enum Interfaces '+IntToStr(ResultInt));
exit;
end;
for i := 0 to pInterface^.dwNumberOfItems - 1 do
begin
Writeln('Interface ' + pInterface^.InterfaceInfo[i].strInterfaceDescription);
WriteLn('GUID ' + GUIDToString(pInterface^.InterfaceInfo[i].InterfaceGuid));
pInterfaceGuid:= pInterface^.InterfaceInfo[pInterface^.dwIndex].InterfaceGuid;
ppData:=nil;
pdwDataSize:=0;
ResultInt:=WlanQueryInterface(hClient, @pInterfaceGuid, wlan_intf_opcode_current_connection, nil, @pdwDataSize, @ppData,nil);
try
if (ResultInt=ERROR_SUCCESS) and (pdwDataSize=SizeOf(Tndu_WLAN_CONNECTION_ATTRIBUTES)) then
begin
Writeln(Format('Profile %s',[ppData^.strProfileName]));
Writeln(Format('Mac Address %.2x:%.2x:%.2x:%.2x:%.2x:%.2x',[
ppData^.wlanAssociationAttributes.dot11Bssid[0],
ppData^.wlanAssociationAttributes.dot11Bssid[1],
ppData^.wlanAssociationAttributes.dot11Bssid[2],
ppData^.wlanAssociationAttributes.dot11Bssid[3],
ppData^.wlanAssociationAttributes.dot11Bssid[4],
ppData^.wlanAssociationAttributes.dot11Bssid[5]]));
RSSI := (ppData^.wlanAssociationAttributes.wlanSignalQuality div 2) - 100;
Writeln(Format('RSSI %d dbm',[RSSI]));
end;
finally
if ppData<>nil then
WlanFreeMemory(ppData);
end;
end;
finally
WlanCloseHandle(hClient, nil);
end;
end;
begin
try
Scan();
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
Readln;
end.
注: 残念ながら、Native Wifi API ヘッダーの Delphi への正式な翻訳は私の知る限り存在しないため、当面はこれらを使用できます。