[Перевод] Мониторинг пропускной способности интернет-канала

Я использую для выхода в интернет LTE-модем. Меня часто интересует то, какую полосу пропускания канала обеспечивает провайдер. Поэтому я и подумал о том, что неплохо было бы сделать систему для мониторинга интернет-канала. Такая система должна была быть компактной и экономичной в плане потребления электроэнергии. В качестве её основы я решил использовать Raspberry Pi Zero. Этот одноплатный компьютер подключается к модему по беспроводной сети. В результате с помощью моей системы можно не только мониторить интернет-канал, но ещё и обнаруживать проблемы с сетью.

4f2eeaa17087e3b7c2bab1092a1b6caf.jpg


Готовая система мониторинга пропускной способности интернет-канала

Материалы


  • Одноплатный компьютер Raspberry Pi Zero WH.
  • E-ink-дисплей Waveshare с диагональю 2,9 дюйма.
  • Преобразователь постоянного тока DEBO DCDC 20W.
  • RGB-светодиод (взятый из старого устройства).
  • Нажимная кнопка.
  • Выключатель.
  • Модуль реле DC5V 2 Way 2CH Channel Relay Module.
  • Male-разъём и Female-разъём (оба — соответствующие разъёму питания модема).
  • Корпус, напечатанный на 3D-принтере.


1. Особенности и возможности системы


8570da66034ea7e1797a918e87c961f5.png


E-ink-дисплей

fe8c2a8969875e9f01a192271b5c5fef.png


Панель управления с данными, получаемыми из системы мониторинга, и с кнопкой для удалённой перезагрузки модема

  • Raspberry Pi Zero подключён к интернету через беспроводную сеть. Каждые полчаса система тестирует скорость загрузки и выгрузки данных, а так же проверяет пинг. Для измерений используется утилита командной строки от speedtest.net.
  • Результаты измерения полосы пропускания и проверки пинга выводятся на e-ink-дисплее. Там же выводится и время проведения испытаний.
  • Если скорость загрузки данных падает ниже заданного порогового значения, реле быстро выключает и включает модем. В результате модем перезагружается. При этом сам модем модифицировать не нужно. Все манипуляции проводятся лишь с питанием модема.
  • Кнопка, смонтированная на передней панели устройства, позволяет вручную запустить измерение полосы пропускания канала.
  • Данные, собранные системой, выводятся в панели управления, созданной на портале Ubidots. Там, помимо графиков, есть сведения о причинах перезагрузок модема.
  • В панели управления, кроме того, имеется кнопка, которая позволяет удалённо перезагрузить модем.
  • Питание для системы мониторинга подаётся с блока питания модема. Дополнительный блок питания ей не нужен. Питание на модем поступает через систему мониторинга. При этом реле позволяет отключать питание от модема и включать его снова, то есть — позволяет перезагружать модем. Raspberry Pi при этом продолжает работать.


2. Соединение компонентов системы


eae98dafb24e0e54a5ad2ddccbdfc1b0.jpg


Система в сборе

На снимке готового устройства со снятой крышкой корпуса можно видеть следующие элементы:

  1. Нажимная кнопка.
  2. E-ink-дисплей.
  3. Raspberry Pi Zero.
  4. Модуль реле.
  5. RGB-светодиод и резисторы (их состав зависит от используемого светодиода).
  6. Выключатель.
  7. Преобразователь постоянного тока.
  8. Female-разъём.


6d121ccfbbca69fad7b97f9df07ba671.jpg


Схема подключения компонентов

На предыдущем рисунке показано, что плюсовой кабель от блока питания идёт через выключатель к преобразователю постоянного тока (он преобразует 12V, необходимые для питания модема, в 5V для Raspberry Pi). Потом, через реле (через нормально замкнутый контакт), питание идёт к выходному Female-разъёму. В результате оказывается, что питание подаётся на модем даже в том случае, если система мониторинга выключена.

Процесс измерений можно инициировать вручную, нажав на кнопку, смонтированную на передней панели. RGB-светодиод используется для того чтобы сообщать пользователю о том, чем именно занято устройство.

На схеме не показано подключение дисплея к Raspberry Pi. Данные о подключении дисплея представлены на следующем рисунке.

f0d01949795673c506310f7b2f4bd810.png


Подключение e-ink-дисплея к Raspberry Pi

3b4e0d754a596781a8f49a600cd4de34.png


GPIO-выводы Raspberry Pi

3. 3D-печать и сборка корпуса


4f2eeaa17087e3b7c2bab1092a1b6caf.jpg


Готовый корпус, вид спереди

a83e536be6b2d6945f7f0af6febe1517.jpg


Готовый корпус, вид сзади

6efa22215ee347a4e607e1664a121993.png


Компоненты корпуса

Корпус состоит из следующих компонентов, пронумерованных на предыдущем рисунке:

  1. Нижняя часть.
  2. Верхняя часть.
  3. Передняя панель.
  4. Задняя панель.
  5. Крепёжные элементы (4 штуки).


Все эти части можно напечатать без поддержек. Файлы с моделями лежат здесь.

Дисплей крепится к передней панели с помощью крепёжных элементов и двустороннего скотча. Кнопка, выключатель и Female-разъём прикручены к передней и задней панелям корпуса. Для соединения верхней и нижней частей корпуса использованы винты 3×20 мм. Передняя и задняя панели довольно плотно прилегают к верхней и нижней частям корпуса. Если понадобится, то их, чтобы они хорошо стали на свои места, можно обработать наждачной бумагой (с внутренней стороны — чтобы не повредить их внешнюю поверхность).

4. Настройка Raspberry Pi


Моё руководство по настройке Raspberry Pi основано на различных материалах, взятых из разных источников (например, с сайта производителя e-ink-дисплея). Я, действуя в соответствии с нижеприведёнными инструкциями, смог добиться желаемого результата. Я не являюсь Linux-экспертом, поэтому никаких оптимизаций или чего-то подобного не производил. Я знаю о том, что, наверняка, существуют более совершенные и более эффективные методы достижения тех же результатов.

Я исхожу из предположения о том, что сейчас читатель этого материала работает в следующих условиях. На его Raspberry Pi уже установлена ОС Raspbian (есть много руководств по её установке). К плате подключён дисплей (через miniHDMI), мышь и клавиатура. Имеется правильно настроенное беспроводное подключение платы к маршрутизатору или к интернету. Все процедуры, если не указано иное, производятся в терминале.

▍Установка Remote Desktop


Это нужно для подключения к Raspberry Pi с компьютера.

sudo apt-get update
sudo apt-get install xrdp


Ещё можно работать через SSH (инструкции по настройке имеются здесь).

Далее, нужно изменить пароль. Инструкции смотрите здесь.

▍Установка speedtest-cli

sudo apt-get install python-pip
sudo pip install speedtest-cli


Для проверки работоспособности speedtest-cli в терминале нужно выполнить такую команду:

speedtest-cli


Если всё настроено правильно, то, что получится после запуска этой команды, будет напоминать следующий рисунок.

1ff260d41ba4aef7cf666675b815a8d1.jpg


Проверка speedtest-cli

▍Установка wiringPI

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build


Вот более подробная инструкция по загрузке и установке wiringPI.

Альтернативный способ установки wiringPi:

sudo apt-get install wiringpi


Подробности об этом ищите здесь.

▍Установка библиотеки для BCM2835


Подробности о соответствующей библиотеке вы можете найти на этой странице.

Сначала нужно загрузить файл bcm2835-1.60.tar.gz (или архив с более свежей версией библиотеки).

tar zxvf bcm2835-1.60.tar.gz
cd bcm2835-1.60
./configure
make
sudo make check
sudo make install


▍Установка Python-библиотеки для работы с изображениями

sudo apt-get install python-imaging


Альтернативный способ установки:

sudo apt-get install python-pil


▍Включение I2C


Выполните следующую команду для того чтобы приступить к настройке Raspberry Pi:

sudo raspi-config


Для запуска I2C-драйвера перейдите по пути Options-> I2C -> yes. После этого нужно будет модифицировать конфигурационный файл. Для того чтобы его открыть — выполните следующую команду:

sudo nano /etc/modules


В него надо добавить две строки:

i2c-bcm2708 
i2c-dev


Подробности об установке библиотек на Raspberry Pi можно найти здесь.

▍Включение SPI


Выполним следующую команду:

sudo raspi-config


Для включения драйвера SPI перейдём по следующему пути: Options-> SPI -> yes.

▍Установка дополнительных шрифтов


Сначала установим ttf-mscorefonts-installer:

sudo apt-get install ttf-mscorefonts-installer


Теперь загрузим и установим нужные шрифты (Roboto и Droid):

gksudo
pcmanfm


Это нужно для запуска менеджера файлов с root-привилегиями. Файлы TrueType-шрифтов надо скопировать в папку /usr/share/fonts/truetype.

Альтернативный способ установки шрифтов заключается в их копировании в папку Downloads с использованием WinSCP (для использования WinSCP нужно работающее SSH-соединение):

sudo cp -r /home/pi/Downloads/droid /usr/share/fonts/truetype
sudo cp -r /home/pi/Downloads/roboto /usr/share/fonts/truetype


Для доступа к папке fonts нужны root-права. Возможно, есть лучший способ решения этой задачи (я уже говорил, что не отношу себя к Linux-экспертам), но оба вышеприведённых способа позволили мне сделать то, что было нужно.

▍Python-файлы и sh-скрипт


Создадим новую папку — bandwidth_monitor. Скопируем в неё все необходимые файлы. Сделаем эти файлы и sh-скрипт исполняемыми.

chmod +x *.py
chmod +x speedtest-cron.sh


▍Настройка crontab

crontab -e


Crontab используется для планирования выполнения заданий. Например — для запуска проверки полосы пропускания интернет-канала каждые 30 минут. Добавим следующие строки в файл crontab:

@reboot /usr/bin/python /home/pi/bandwidth_monitor/post_restart_message.py &
@reboot sleep 30 && /usr/bin/python /home/pi/bandwidth_monitor/poll_test_now_button.py

*/30 * * * * /home/pi/bandwidth_monitor/speedtest-cron.sh
*/3 * * * * /usr/bin/python /home/pi/bandwidth_monitor/poll_killswitch.py
13 03 * * * /usr/bin/python /home/pi/bandwidth_monitor/refresh_display.py


Вот как это выглядит в окне терминала.

653c4f8d974ab7a6dba8eea48940b9c3.jpg


Настройка заданий cron

Здесь представлена настройка следующих заданий:

  • При перезагрузке соответствующее сообщение отправляется в панель управления Ubidots.
  • При перезагрузке начинается опрос кнопки для ручного запуска процесса измерений.
  • Каждые 30 минут выполняется измерение пропускной способности канала.
  • Каждые 3 минуты проверяется состояние кнопки для перезагрузки модема, присутствующей на панели управления Ubidots.
  • Один раз в день запускается цикл обновления дисплея.


В следующем разделе поговорим о программной части проекта.

5. Программная часть проекта


Программная часть моего монитора пропускной способности интернет-канала представлена следующими Python-файлами:

  • bandwidth_monitor_0_4.py — главная программа, которую crontab вызывает каждые полчаса. Она выполняет тест пропускной способности канала (посредством speedtest-cli). В процессе проведения измерений RGB-светодиод светится синим цветом. Если измеренные показатели выше заданного порога — они выводятся на дисплее (с указанием времени проведения измерений) и отправляются на панель управления Ubidots. Если оказалось, что измеренные показатели ниже заданного порога — светодиод светит красным и через небольшой промежуток времени измерения проводятся снова. Если после трёх попыток проведения измерений удовлетворительных результатов получить не удалось — выполняется перезагрузка модема путём отключения и включения его питания с помощью реле. В журнал, который имеется на панели управления Ubidots, записывается код перезагрузки (2).
  • poll_killswitch.py — этот код наблюдает за состоянием логической переменной killswitch_state. Если в эту переменную записано true — активируется реле и выполняется выключение и включение питания модема. При опросе этой переменной светодиод светит зелёным. После перезагрузки модема переменная сбрасывается в состояние false и в журнале делается запись с кодом 1.
  • poll_test_now_button.py — код из этого файла ждёт нажатия кнопки, находящейся на передней панели корпуса. Эта кнопка позволяет вручную запустить процесс измерения пропускной способности канала. Когда эта программа запускается (при перезагрузке Raspberry Pi) — светодиод мигает красным цветом.
  • post_restart_message.py — эта программа записывает код перезагрузки (3) в журнал панели управления Ubidots. Это указывает на то, что система мониторинга была перезагружена. При запуске программы светодиод мигает синим.
  • test_LED.py и test_relay.py — это простые скрипты, которые можно использовать для тестирования светодиода и реле.
  • epdconfig.py и epd2in9.py — это драйверы для e-ink-дисплея, предоставленные производителем.
  • refresh_display.py — это программа, выполняющая цикл обновления дисплея.


Для того чтобы программа могла работать с панелью управления Ubidots, нужно ввести свои данные (токен доступа, имена устройства и переменных) в раздел файла bandwidth_monitor_0_4.py, представленный ниже.

TOKEN = "XXXXXXXXXXXXXXXXXXXX"
DEVICE_LABEL = "raspberry-bandwidth-monitor"
VARIABLE_LABEL_1 = "Upload"
VARIABLE_LABEL_2 = "Download"
VARIABLE_LABEL_3 = "Ping"
VARIABLE = "killswitch"
VARIABLE_2 = "reset-code"


6. Панель управления Ubidots


602b4a556e4b0e60d0bb71c502c00b22.png


Панель управления Ubidots

В панели управления, созданной с помощью Ubidots, можно выделить следующие части:

  1. График измеренных значений скорости загрузки и выгрузки данных. Новое значение попадает сюда каждые полчаса.
  2. Сведения о пинге. Этот график тоже пополняется новым значением каждые полчаса.
  3. Средняя скорость загрузки данных. Здесь выводится среднее значение скорости загрузки, вычисленное за 24 часа.
  4. Таблица со сведениями о результатах текущих измерений и о времени их проведения.
  5. Кнопка для удалённой перезагрузки модема. Опрос её состояния проводится каждые 3 минуты. Это означает, что перезагрузка модема может быть произведена не сразу после её нажатия.
  6. Журнал со сведениями о перезагрузках модема и об их причинах. Среди этих причин — нажатие на кнопку для удалённой перезагрузки модема, отключение от электросети, падение показателей пропускной способности канала ниже заданного порогового значения.


Подробности о том, как создавать подобные панели управления, и о том, как интегрировать их с Python-кодом, можно найти здесь.

7. Устройство в действии

Загрузка и начало работы устройства

Возникало ли у вас желание сделать себе монитор пропускной способности интернет-канала?

oug5kh6sjydt9llengsiebnp40w.png

3piw1j3wd_cgmzq9sefgferaumu.png

© Habrahabr.ru