2

WiFi ルーターの RSSI を定期的にテキスト ファイルに記録する簡単なユーティリティを作成したいと考えています。ワイヤレス ルーターの RSSI 値を読み取るための Delphi ライブラリまたは API ラッパーを知っている人はいますか?

4

1 に答える 1

4

Native Wifi APIを使用して、アクティブなネットワーク wifi 接続の RSSI を取得できます。WlanOpenHandleおよび関数を呼び出した後、列挙値と構造体へのポインターを渡すメソッドをWlanEnumInterfaces実行する必要があります。ここから要素にアクセスし、最後にフィールドの値。WlanQueryInterfacewlan_intf_opcode_current_connectionWLAN_CONNECTION_ATTRIBUTESwlanAssociationAttributeswlanSignalQuality

これは、このフィールドの説明です。

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 への正式な翻訳は私の知る限り存在しないため、当面はこれらを使用できます。

于 2013-01-15T03:45:01.993 に答える