Centrum skryptów - Systemy operacyjne

Jak określić siłę sygnału połączenia bezprzewodowego?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak określić siłę sygnału połączenia bezprzewodowego?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Kiedy jestem podłączony do sieci bezprzewodowej, mogę otworzyć okno dialogowe Wireless Network Connection Status i zobaczyć kilka słupków oznaczających siłę sygnału. Jak otrzymać taką samą informację za pomocą skryptu?

-- RK

Cześć Skrypciarze! Odpowiedź

Cześć, RK. Zanim odpowiemy na dzisiejsze pytanie, musimy wyjaśnić jedną rzecz. Przez ostatni tydzień Skrypciarz piszący te słowa doszedł do wniosku, że obecna pora roku jest jego ulubioną, a wszystko dzięki męskiej koszykówce uniwersyteckiej. Ale jak się okazało, mylił się. Jest to jego najmniej ulubiona pora roku. Powodem są skautki z Girl Scouts of America.

Nie żeby Skrypciarz miał coś przeciwko Girls Scout of America, o nie. Jest to wspaniała organizacja, czyniąca wiele dobra dla swoich członków i całego społeczeństwa. Chodzi o to, że jest to ten czas w roku, kiedy skautki organizują sprzedaż ciasteczek. A to oznacza tylko jedno: każdy cent będący w posiadaniu Skrypciarza (wraz z tym pieniędzmi, w których posiadaniu nie jest) zostaje wydany na ciasteczka skautek. Ciasteczka, których Skrypciarz nie chce, nie potrzebuje i nawet nie bierze ze sobą. (Skautki dają możliwość przekazania ciasteczek żołnierzom stacjonującym za granicą.)

Najgorsze, że ciasteczka sprzedają dziewczynki w wieku 7 czy 8 lat, z dużymi brązowymi oczami i drżącymi głosikami, przesympatyczne, a gdy proszą o zakup ciasteczek, strasznie się wstydzą. Nie można im odmówić. To po prostu nie fair!

Oznacza to, że Skrypciarz będzie potrzebował sporo pieniędzy na ciasteczka, a jedynym sposobem na ich zarobienie jest napisanie skryptu pokazującego siłę sygnału połączenia bezprzewodowego. Oto i on:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")



Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_ReceivedSignalStrength")



For Each objItem in colItems

    intStrength = objItem.NDIS80211ReceivedSignalStrength



    If intStrength > -57 Then

        strBars = "5 Bars"

    ElseIf intStrength > -68 Then

        strBars = "4 Bars"

    ElseIf intStrength > -72 Then

        strBars = "3 Bars"

    ElseIf intStrength > -80 Then

        strBars = "2 Bars"

    ElseIf intStrength > -90 Then

        strBars = "1 Bar"

    Else

        strBars = "Strength cannot be determined"

    End If

    

    Wscript.Echo objItem.InstanceName & " -- " & strBars

Next
Uwaga: Skrypt ten nie działa, niestety, w Windows Vista. Jak więc uzyskać te informacje w nowym systemie? Póki co, nie wiemy. Ale ci z Was, którzy jeszcze nie uaktualnili systemu, mogą spokojnie używać powyższego skryptu.

Zobaczmy, jak nasz skrypt działa. Zaczynamy od połączenia się z usługą WMI na lokalnym komputerze (chociaż moglibyśmy uruchomić ten skrypt także na komputerze zdalnym). Zauważmy, że nie łączymy się z przestrzenią nazw root\cimv2, ale z root\wmi:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")

Po połączeniu używamy poniższego wiersza kodu do pobrania wszystkich wystąpień klasy o przepysznej nazwie MSNdis_80211_ReceivedSignalStrength:

Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_ReceivedSignalStrength")

To zwraca nam kolekcję wszystkich połączeń bezprzewodowych i siły ich sygnałów.

Kiedy to mamy już z głowy, następnym krokiem jest uruchomienie pętli For Each, aby przejść przez wszystkie elementy kolekcji; wewnątrz pętli używamy poniższego wiersza kodu, aby przypisać wartość właściwości NDIS80211ReceivedSignalStrength do zmiennej o nazwie intStrength:

intStrength = objItem.NDIS80211ReceivedSignalStrength

I tu sprawy stają się dziwaczne.

Właściwość NDIS80211ReceivedSignalStrength, jak się okazuje, będzie wartością ujemną (np. -55). Szczerze mówiąc, mieliśmy spory kłopot, próbując się dowiedzieć, jak dokładnie ta wartość jest uzyskiwana i co oznacza. Znaleźliśmy trochę informacji, wyjaśniających mniej-więcej, jak te wartości przekładają się na słupki siły sygnału w oknie dialogowym Wireless Network Connection Status. Opierając się na sugerowanych wartościach (Twoje mogą się nieco różnić), zdecydowaliśmy użyć konstrukcji If-Then, aby przypisać wartość do zmiennej nazwanej strBars:

If intStrength > -57 Then

    strBars = "5 Bars"

ElseIf intStrength > -68 Then

    strBars = "4 Bars"

ElseIf intStrength > -72 Then

    strBars = "3 Bars"

ElseIf intStrength > -80 Then

    strBars = "2 Bars"

ElseIf intStrength > -90 Then

    strBars = "1 Bar"

Else

    strBars = "Strength cannot be determined"

End If

To co robimy, jest całkiem jasne: po prostu działamy, opierając się na wartości zmiennej intStrength. Na przykład, przypuśćmy, że intStrength jest większe niż 57. (A oczywiście 55 jest większe niż 57, nie daj się zmylić liczbom ujemnym). Jeśli intStrength jest większe niż 57, to przypisujemy zmiennej wartość 5 bars (czyli 5 kresek) i kończymy działanie tego fragmentu. Jeśli wartość intStregth nie jest większa niż 57, to sprawdzamy czy wartość jest większa niż 68. Jeśli tak, to zmiennej strBars przypisujemy wartość 4 kresek i kończymy kod. Itd.

Kiedy skończymy, otrzymujemy wartości właściwości InstanceName oraz strBars, a następnie wracamy na początek pętli i robimy to samo z kolejnym połączeniem bezprzewodowym.

Wadą skryptu jest to, że można otrzymać kilka zgłoszeń odnoszących się do jednego połączenia bezprzewodowego. Na przykład:

Broadcom 802.11a/b/g WLAN -- 5 Bars

Broadcom 802.11a/b/g WLAN - Virtual Machine Network Services Driver -- 5 Bars

Broadcom 802.11a/b/g WLAN - Packet Scheduler Miniport -- 5 Bars

Dzieje się tak, gdyż usługa WMI bierze pod uwagę zarówno fizyczne, jak i wirtualne karty sieciowe. Jeśli chcemy, możemy napisać kod ograniczający otrzymywane dane zwrotne tylko do fizycznych kart sieciowych (prawdopodobnie uzyskując najpierw listę kart z włączonym IP za pomocą klasy Win32_NetworkAdapterConfiguration). Nie będziemy się teraz tym zajmować, ale jeśli ktoś wpadłby na pomysł, jak to zrobić, niech da nam znać.

Jeśli zaś chodzi o skautki, to Skrypciarz już postanowił – za rok o tej porze po prostu ustawi przekaz wypłaty tak, by wpłynął bezpośrednio na konto Girl Scouts. To powinno wszystkim oszczędzić wiele czasu i kłopotów. I przynajmniej raz pieniądze Skrypciarza zostaną dobrze spożytkowane.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne