Как отобразить скорость передачи беспроводного интерфейса на панели Unity?

Я выполнял 16.04 LTS на старой Lenovo T410. Я нахожу, что мое состояние сетевого подключения варьируется много. Я хотел бы иметь более легкий способ видеть, какой уровень мой Wi-Fi соединяет в (300Mb/s, 150Mb/s, и т.д.) с момента до момента, не имея необходимость копать к Индикатору сети>, Информация о соединении> "Ускоряется" каждый раз.

Вот вывод, я надеюсь вставлять индикатор

connection info

Я уже работаю indicator-multiload, так добавление другого раздела к этому было бы большим, но я ищу цифровой, а не вывод графических данных, и мне нужно состояние соединения, а не использование пропускной способности. Мультизагрузка индикатора может сделать это?

3
задан 4 April 2017 в 15:17

1 ответ

Пользовательские индикаторы для отображения скорости передачи

Этот ответ предоставляет два решения создания пользовательского индикатора для отображения скорости передачи беспроводного интерфейса на панели Unity. Пользователи поощряются выбрать который иски их потребности более соответственно. Ответ сделан максимально подробным, поэтому извините стену текста.

Обоснование для двух решений

Именно моя частая практика для предоставления решений пользователя требует минимальных зависимостей и максимально уверенна в себе при нахождении простого решения. Решение № 1 полагается на использование indicator-sysmonitor созданный fossfreedom - один из наших великих членов сообщества и модераторов, и требует использования двух объектов - пользовательский сценарий и упомянутый индикатор. То, что я не мог найти путь к уровню бита запроса от файла статистики где-нибудь в /proc или /sys файловые системы также беспокоили меня. Следовательно я создал второй индикатор, который однако полагается на Администратора сети и dbus. Таким образом преимущество и недостаток каждого метода очевидны: каждый требует установки indicator-sysmonitor и пользовательский сценарий, но будет работать, если пользователь избежит Администратора сети, в то время как другой более подходит для стандартной системы Ubuntu, которая использует Администратора сети.

Идеально, решение было бы максимально уверенно в себе, запросив определенную библиотеку и/или файл в /proc или /sys файловые системы. В моем исследовании до сих пор, однако, я не нашел такой файл, и iw команда, на которую полагается одно из решений, делает так внутренне. То, что также усложняет вещи, - то, что, по-видимому, 802,11 стандарта беспроводной связи имеют различные способы модуляции для кодирования сообщения, и вычисления скорости передачи сделаны, рассмотрев способ модуляции и частоту интерфейса, который используется. В то время как существуют способы получить TX и RX байты в секунду, данные отличаются от какой iw выходные дисплеи. С другой стороны, движение полностью к C и системному уровню кажется слишком много для этой задачи. Таким образом, даже при том, что я не совсем удовлетворен обоими решениями, они обеспечивают соответствующие результаты для того, что спрашивает этот вопрос.

Решение 1: индикатор-sysmonitor с пользовательским сценарием оболочки

enter image description here

Индикатор Sysmonitor является индикатором, созданным fossfreedom, и обычно используется для отображения общих статистических данных как ЦП и использование памяти, но лучшая вещь об этом состоит в том, что это позволяет использование пользовательских сценариев. Таким образом идея состоит в том, чтобы иметь сценарий, который может запросить скорость передачи так или иначе и отобразить ее через indicator-sysmonitor. Ради TL; DR здесь сократил список шагов:

  1. индикатор-sysmonitor установки путем выполнения в терминале

    sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
    sudo apt-get update
    sudo apt-get install indicator-sysmonitor
    
  2. Создайте ~/bin/bitrate_script.sh сценарий, сделайте это исполняемым файлом с chmod +x ~/bin/bitrate_script.sh со следующим содержанием

    #!/bin/bash
    iw dev wlan7 link | awk -F '[ ]' '/tx bitrate:/{print $3,$4}'
    
  3. Настройте индикатор-sysmonitor для отображения вывода сценария как пользовательский датчик от Предпочтений-> Усовершенствованный-> Новый, с помощью br для датчика и полного пути к сценарию как команда.

Индикатор Obtaining sysmonitor

Как объяснено на странице GitHub проекта, можно установить его из источника или через PPA. Метод PPA, по-моему, является самым простым, следовательно данный здесь:

sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
sudo apt-get update
sudo apt-get install indicator-sysmonitor

После того, как установленный, это можно назвать через командную строку как indicator-sysmonitor или от тире Единицы.

Установка сценария оболочки скорости передачи

Такой сценарий оболочки может быть сделан через парсинг iw dev <IFACE> link команда. Команда берет беспроводной интерфейс в качестве аргумента, например wlan1 или wlp6s5 (отметьте различие из-за прогнозирующего именования интерфейса в systemd), и отображает различные данные, среди которых мы имеем tx bitrate. Например:

$ iw dev wlan7 link
Connected to XX:XX:XX:XX:XX:XX (on wlan7)
    SSID: my_wifi
    freq: 2447
    RX: 102456319 bytes (171120 packets)
    TX: 6992103 bytes (50371 packets)
    signal: -46 dBm
    tx bitrate: 150.0 MBit/s MCS 7 40MHz short GI

    bss flags:  short-preamble short-slot-time
    dtim period:    1
    beacon int: 100

Как Вы видите, вывод требует, чтобы обработка текста произвела одну строку текста (так как это что indicator-sysmonitor требует), и это может быть сделано через awk команда. Вот, например, способ, которым я настроил свой сценарий:

#!/bin/bash
iw dev wlan7 link | awk -F '[ ]' '/tx bitrate:/{print $3,$4}'

Если Вы запустите скрипт на командной строке, то вывод будет просто скоростью передачи и строкой единиц:

$ iw dev wlan7 link | awk -F '[ ]' '/tx bitrate:/{print $3,$4}'
135.0 MBit/s

Не забудьте делать свой исполняемый файл сценария с chmod +x команда, иначе это не будет работать.

Отображение вывода сценария в индикаторе-sysmonitor

Чтобы быть точным, индикатор имеет несколько настроек в предпочтениях, которые он называет "датчиками". Например, если Вы устанавливаете на дисплей CPU: {cpu} это отобразилось бы CPU как текст и заменяют фактическим процентом использования ЦП вместо строки фигурных скобок. Большая вещь об этом состоит в том, что путем нажатия кнопки New, можно добавить пользовательский сценарий, который будет отображен как "датчик".

В снимке экрана Вы видите, что я добавил свой пользовательский сценарий как br строка форматирования датчика, и для Команды, которую я дал полному пути сценарию, который живет в моем ~/WIP папка. Нет ничего специального о той папке, это просто, оказалось, было местоположением для материала, над которым я в настоящее время работаю (Происходящий работой, в основном). Пользователи однако обычно поощряются поместить сценарии в ~/bin папка, таким образом я рекомендовал бы сделать это.

Если Вы следовали инструкциям правильно до этой точки, Вы должны иметь indicator-sysmonitor покажите скорость передачи точно так же, как в снимке экрана.


Решение 2: Пользовательский индикатор с помощью Python и dbus свойств Администратора сети

indicator-bitrate in action

Я не был довольно удовлетворен вышеупомянутым решением, которое полагается indicator-sysmonitor и пользовательский сценарий. Я хотел иметь исключительный индикатор, который делает задание все из себя. Следовательно я записал мой собственный индикатор в Python 3, который полагается на информацию, через которую выставляет Администратор сети dbus система межпроцессного взаимодействия. Короче говоря, большая работа сделана Администратором сети - мы просто используем информацию, которую она предоставляет. Преимущество этого индикатора состоит в том, что пользователь не должен определять беспроводной интерфейс, который будет использоваться - он сделан автоматически.

Теория операции

Индикатор эффективно повторяет то же действие - get_bitrates функционируйте каждая 1 секунда. Та функция запрашивает dbus свойства в нескольких интерфейсах в последовательности. Во-первых, это получает все устройства и отфильтровывает 802,11 беспроводных устройства. Затем, мы выполняем итерации по каждому устройству Wi-Fi и запрашиваем их имя и скорость передачи. Все создается в одну строку текста, который затем отображен на маркировке индикатора.

В теории индикатор должен смочь определить скорость передачи для нескольких беспроводных интерфейсов. Например, у пользователей могут быть внутренний беспроводной чипсет PCI-e и микросхема USB. К сожалению, я не добирался для тестирования, это из-за проблем с моим ноутбуком, а также из-за времени ограничивает. Я могу протестировать это на другом ноутбуке, после того как я имею шанс и отредактирую ответ соответственно.

Исходный код

Также доступный на GitHub в моем персональном репозитории.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import dbus
import gi
gi.require_version('AppIndicator3', '0.1')
import signal
from gi.repository import AppIndicator3,Gtk,GLib

class IndicatorBitrate(object):

    def __init__(self):
        self.app = AppIndicator3.Indicator.new(
            'indicator-bitrate', "gtk-network",
            AppIndicator3.IndicatorCategory.HARDWARE
        )
        self.app_menu = Gtk.Menu()
        self.quit_button = Gtk.MenuItem('quit')
        self.quit_button.connect('activate', lambda *args: Gtk.main_quit())
        self.app_menu.append(self.quit_button)
        self.app.set_menu(self.app_menu)
        self.app_menu.show_all()
        self.app.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
        self.update_label()

    def call_dbus_method(self, bus_type, obj, path, interface, method, arg):
        """ utility: executes dbus method on specific interface"""
        if bus_type == "session":
            bus = dbus.SessionBus()
        if bus_type == "system":
            bus = dbus.SystemBus()
        proxy = bus.get_object(obj, path)
        method = proxy.get_dbus_method(method, interface)
        if arg:
            return method(arg)
        else:
            return method()

    def get_dbus_property(self, bus_type, obj, path, iface, prop):
        """ utility:reads properties defined on specific dbus interface"""
        if bus_type == "session":
            bus = dbus.SessionBus()
        if bus_type == "system":
            bus = dbus.SystemBus()
        proxy = bus.get_object(obj, path)
        aux = 'org.freedesktop.DBus.Properties'
        props_iface = dbus.Interface(proxy, aux)
        try:
            props = props_iface.Get(iface, prop)
            return props
        except:
            return None

    def update_label(self):
        self.app.set_label(self.get_bitrates(), '')
        GLib.timeout_add_seconds(1, self.set_app_label)

    def set_app_label(self):
        self.update_label()

    def get_bitrates(self):
        # https://people.freedesktop.org/~lkundrak/nm-docs/nm-dbus-types.html#NMDeviceType
        base = ['system', 'org.freedesktop.NetworkManager']
        call = base + [ '/org/freedesktop/NetworkManager', 'org.freedesktop.NetworkManager',
                        'GetAllDevices',None]
        devs = list(self.call_dbus_method(*call))

        wifi_devs = []
        for dev in devs:
            call = base + [dev,'org.freedesktop.NetworkManager.Device',
                           'DeviceType']

            if int(self.get_dbus_property(*call)) == 2:
                wifi_devs.append(dev)

        stats = []
        for dev in wifi_devs:
            # org.freedesktop.NetworkManager.Device.ActiveConnection
            call = base + [dev, 'org.freedesktop.NetworkManager.Device', 'IpInterface']
            iface = self.get_dbus_property(*call)
            call = base + [dev, 'org.freedesktop.NetworkManager.Device.Wireless',
                           'Bitrate']
            bitrate = int(self.get_dbus_property(*call))/1000
            # bitrate given by this property is in kilobits/second (Kb/s)
            # according to documentation 
            stats.append((iface,bitrate))
        return " ".join([str(i[0])+": "+str(i[1])+'Mb/s' for i in stats]) if stats else "None"

ind = IndicatorBitrate()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Установка индикатора

Все стандартные правила того, чтобы заставлять исполняемый файл файлов применяться здесь также.

  1. Сохраните код как indicator-bitrate файл в ~/bin папка
  2. Сделайте исполняемый файл файла с chmod +x ~/bin/indicator-bitrate
  3. Выполненный от командной строки через ~/bin/indicator-bitrate. Если Вы хотите, чтобы это запустилось автоматически, когда Вы входите, открываете Startup Applications from Unity Dash и добавляете полный путь к сценарию как команда.

Заключение

Эти два решения, данные в этом ответе, должны удовлетворить несколько случаев, чтобы предоставить желаемые результаты пользователям. Первый индикатор немного более гибок - он позволяет отображать другую информацию и статистику в дополнение к скорости передачи, в то время как второе решение делает задание для скорости передачи, но только этого; однако, это действительно использует dbus информацию Администратора сети, таким образом мы можем быть уверены, что информация совпадает с тем, что требовали в вопросе.

Пользовательский индикатор может быть далее разработан или становиться основой для других индикаторов для отображения беспроводной информации более подробно. Отчеты об ошибках и запросы новых функций приветствуются на связанной странице GitHub.

4
ответ дан 1 December 2019 в 15:51

Другие вопросы по тегам:

Похожие вопросы: