2017-11-30 1 views
1

Verwenden von wpa_supplicant 2.4 auf ARM Debian.Ermitteln des Signalpegels des verbundenen WiFi-Netzwerks

Gibt es eine Möglichkeit, den Signalpegel des drahtlosen Netzwerks, mit dem ich momentan verbunden bin, in Dezibel oder Prozent zu erhalten?

STATUS Befehl nur gibt den folgenden Satz von Werten: bssid, Freq, ssid, id, Modus, pairwise_cipher, group_cipher, key_mgmt, wpa_state, ip_adresse, p2p_device_address, Adresse, UUID

I SCAN anschließend ausgeführt werden kann, warten für Ergebnisse und Suche nach SSID. Aber das ist langsam und fehleranfällig, ich würde es gerne besser machen.

Der Treiber sollte diese Information bereits kennen (weil verbunden und Anpassung der Übertragungsstufen für die Energieeinsparung), gibt es eine Möglichkeit, nur dafür zu fragen?

Bei dieser Frage geht es nicht um allgemeine Computerhardware und -software. Ich benutze wpa_supplicant durch eine C-API definiert in wpa_ctrl.h Header, die Interaktion mit dem Dienst durch ein Paar von Unix-Domain-Sockets (eine für Befehle, eine andere für unerwünschte Ereignisse).

Ein Grund, warum ich meine aktuelle SCAN + SCAN_RESULT Lösung nicht mag, funktioniert es nicht für versteckte SSID-Netzwerke. Scan findet das Netzwerk nicht, daher bekomme ich auf diese Weise keine Signalpegel. Ein weiteres Problem ist ein geringfügiger visueller Fehler beim Start der Anwendung. Meine App wird von Systemd, After=multi-user.target gestartet. Sofern es nicht der allererste Start ist, ist Linux bis dahin bereits mit WLAN verbunden. In der GUI meiner App (das Produkt verfügt über einen Touchscreen) rendere ich eine telefonähnliche Statusleiste, die das Signal für die WLAN-Signalstärke enthält. Derzeit zeigt es zunächst minimale Ebene (ich weiß, es ist verbunden, weil STATUS Befehl zeigt SSID), nur nach ~ 1 Sekunde Ich bekomme CTRL-EVENT-SCAN-RESULTS Ereignis von wpa_supplicant, führen SCAN_RESULT Befehl und Update Signalstärke auf den richtigen Wert.

Auf der API-Ebene ist mein Code einfach. Ich habe zwei Threads, dass sowohl wpa_ctrl_open nennen, der Befehl Thread ruft wpa_ctrl_request, das Ereignis Faden hat eine endlose Schleife, die durch wpa_ctrl_pending und wpa_ctrl_recvpoll vorbei wpa_ctrl_get_fd() Deskriptors und POLLIN Ereignismaske, gefolgt aufruft.

Und hier ist die Liste der Dateien in/sys/class/net/wlan0:

./mtu 
./type 
./phys_port_name 
./netdev_group 
./flags 
./power/control 
./power/async 
./power/runtime_enabled 
./power/runtime_active_kids 
./power/runtime_active_time 
./power/autosuspend_delay_ms 
./power/runtime_status 
./power/runtime_usage 
./power/runtime_suspended_time 
./speed 
./dormant 
./name_assign_type 
./proto_down 
./addr_assign_type 
./phys_switch_id 
./dev_id 
./duplex 
./gro_flush_timeout 
./iflink 
./phys_port_id 
./addr_len 
./address 
./operstate 
./carrier_changes 
./broadcast 
./queues/rx-0/rps_flow_cnt 
./queues/rx-0/rps_cpus 
./queues/rx-1/rps_flow_cnt 
./queues/rx-1/rps_cpus 
./queues/rx-2/rps_flow_cnt 
./queues/rx-2/rps_cpus 
./queues/rx-3/rps_flow_cnt 
./queues/rx-3/rps_cpus 
./queues/tx-0/xps_cpus 
./queues/tx-0/tx_maxrate 
./queues/tx-0/tx_timeout 
./queues/tx-0/byte_queue_limits/limit 
./queues/tx-0/byte_queue_limits/limit_max 
./queues/tx-0/byte_queue_limits/limit_min 
./queues/tx-0/byte_queue_limits/hold_time 
./queues/tx-0/byte_queue_limits/inflight 
./queues/tx-1/xps_cpus 
./queues/tx-1/tx_maxrate 
./queues/tx-1/tx_timeout 
./queues/tx-1/byte_queue_limits/limit 
./queues/tx-1/byte_queue_limits/limit_max 
./queues/tx-1/byte_queue_limits/limit_min 
./queues/tx-1/byte_queue_limits/hold_time 
./queues/tx-1/byte_queue_limits/inflight 
./queues/tx-2/xps_cpus 
./queues/tx-2/tx_maxrate 
./queues/tx-2/tx_timeout 
./queues/tx-2/byte_queue_limits/limit 
./queues/tx-2/byte_queue_limits/limit_max 
./queues/tx-2/byte_queue_limits/limit_min 
./queues/tx-2/byte_queue_limits/hold_time 
./queues/tx-2/byte_queue_limits/inflight 
./queues/tx-3/xps_cpus 
./queues/tx-3/tx_maxrate 
./queues/tx-3/tx_timeout 
./queues/tx-3/byte_queue_limits/limit 
./queues/tx-3/byte_queue_limits/limit_max 
./queues/tx-3/byte_queue_limits/limit_min 
./queues/tx-3/byte_queue_limits/hold_time 
./queues/tx-3/byte_queue_limits/inflight 
./tx_queue_len 
./uevent 
./statistics/rx_fifo_errors 
./statistics/collisions 
./statistics/rx_errors 
./statistics/rx_compressed 
./statistics/rx_dropped 
./statistics/tx_packets 
./statistics/tx_errors 
./statistics/rx_missed_errors 
./statistics/rx_over_errors 
./statistics/tx_carrier_errors 
./statistics/tx_heartbeat_errors 
./statistics/rx_crc_errors 
./statistics/multicast 
./statistics/tx_fifo_errors 
./statistics/tx_aborted_errors 
./statistics/rx_bytes 
./statistics/tx_compressed 
./statistics/tx_dropped 
./statistics/rx_packets 
./statistics/tx_bytes 
./statistics/tx_window_errors 
./statistics/rx_frame_errors 
./statistics/rx_length_errors 
./dev_port 
./ifalias 
./ifindex 
./link_mode 
./carrier 

Antwort

1

Für iw compatible devices:

folgenden Befehl gibt die aktuelle Station (aka AP) Signalstärke:

iw dev wlp2s0 station dump -v 

Wenn Sie C-API benötigen, graben Sie einfach die source code von iw.

Nach einem schnellen Blick die Funktion benötigen Sie ist here

Für broadcom Geräte, versuchen broadcom wl suchen. Es ist nahe Quelle, weiß nicht, ob C API zur Verfügung gestellt wird.

+0

-bash: iw: Befehl nicht gefunden Ich denke nicht, dass es Broadcom ist, denke ich, die Karte ist Realtek RTL8723BS. – Soonts

+0

https://github.com/torvalds/linux/tree/master/drivers/staging/rtl8723bs scheint seine In-Kernel-Treiber ist ziemlich frisch. Hoffe, Sie können offizielle iw Unterstützung in 4.15 Kernel bekommen.Oder verwenden Sie proprietäre Lösung von vonder (alias Realtek) –

+0

Die Karte selbst funktioniert bisher einwandfrei, mit Kernel 4.4.71 und wpa_supplicant. Ich brauche nur den Signalpegel des drahtlosen Netzwerks, mit dem ich gerade verbunden bin. – Soonts