ioctl SIOCGIWSTATS 신호 레벨은 일반적으로 0입니다.

ioctl SIOCGIWSTATS 신호 레벨은 일반적으로 0입니다.

네트워크 인터페이스, 즉 SSID 및 dBm 단위의 신호 레벨에 대한 다양한 정보를 얻는 C 코드 블록이 있습니다.

#include <ctype.h>
#include <errno.h>
#include <linux/wireless.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <time.h>

#define WIRELESS_INTERFACE "wlp2s0"

int main () {
      // Communicate using ioctl to get information
      struct iwreq wreq;
      int sockfd;
      char *ssid[32];

      // Allocate memory for the request
      memset(&wreq, 0, sizeof(struct iwreq));
      // Assign our interface name to the request
      sprintf(wreq.ifr_name, WIRELESS_INTERFACE);

      // Open socket for ioctl
      if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        fprintf(stderr, "FAILED 1");
        exit(1);
      }

      // Get SSID
      wreq.u.essid.pointer = ssid;
      wreq.u.essid.length = 32;
      if (ioctl(sockfd, SIOCGIWESSID, &wreq) == -1) {
        fprintf(stderr, "FAILED 2");
        exit(2);
      }

      fwrite(wreq.u.essid.pointer, 1, wreq.u.essid.length, stdout);

      struct iw_statistics *stats;
      int8_t signalLevel = 0;

      wreq.u.data.pointer = (struct iw_statistics *)malloc(sizeof(*stats));
      wreq.u.data.length = sizeof(*stats);
      wreq.u.data.flags = 1;
      if (ioctl(sockfd, SIOCGIWSTATS, &wreq) == -1) {
        fprintf(stderr, "FAILED 3");
        exit(3);
      }
      if (((struct iw_statistics *)wreq.u.data.pointer)->qual.updated &
          IW_QUAL_DBM) {
        fputs("\nSignal valid\n", stdout);
        // signal is measured in dBm and is valid for us to use
        signalLevel =
            ((struct iw_statistics *)wreq.u.data.pointer)->qual.level - 256;
      }
      fprintf(stdout, "\nsignalLevel %d\n", signalLevel);
}

컴파일하고 실행하면 gcc stackoverflow.c -o stackoverflow && ./stackoverflow항상 다음이 출력됩니다.

Erebus
Signal valid

signalLevel 0

각 호출마다 새 변수를 시도했지만 sockfd작동하지 않았습니다.wreqioctl

다른 도구가 신호 레벨을 올바르게 보고하는지 확인할 수 있습니다.

➜ nmcli -f IN-USE,SIGNAL,SSID device wifi

IN-USE  SIGNAL  SSID
        84      other1
        80      other2
        75      Erebus
        75      --
        75      other3
        75      Erebus
*       72      Erebus
        65      other3
        25      other5
        20      other6

그러나 동일한 ioctl 호출을 사용하는 확인된 도구 중 하나는 작동하지 iwconfig wlp2s0않습니다 Signal level=0 dbm.

내 시스템에 대한 정보:

➜ uname -a
Linux jack-laptop 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

우분투22.04

편집: 이것이 드라이버 관련 문제라고 생각하므로 무선 드라이버에 대한 정보를 추가하십시오.

02:00.0 Network controller: Qualcomm Atheros QCNFA765 (rev 01)
    Subsystem: Lenovo Device 9309
    Kernel driver in use: ath11k_pci
    Kernel modules: ath11k_pci

관련 정보