[Перевод] Мониторинг пропускной способности интернет-канала
Я использую для выхода в интернет LTE-модем. Меня часто интересует то, какую полосу пропускания канала обеспечивает провайдер. Поэтому я и подумал о том, что неплохо было бы сделать систему для мониторинга интернет-канала. Такая система должна была быть компактной и экономичной в плане потребления электроэнергии. В качестве её основы я решил использовать Raspberry Pi Zero. Этот одноплатный компьютер подключается к модему по беспроводной сети. В результате с помощью моей системы можно не только мониторить интернет-канал, но ещё и обнаруживать проблемы с сетью.
Готовая система мониторинга пропускной способности интернет-канала
Материалы
- Одноплатный компьютер Raspberry Pi Zero WH.
- E-ink-дисплей Waveshare с диагональю 2,9 дюйма.
- Преобразователь постоянного тока DEBO DCDC 20W.
- RGB-светодиод (взятый из старого устройства).
- Нажимная кнопка.
- Выключатель.
- Модуль реле DC5V 2 Way 2CH Channel Relay Module.
- Male-разъём и Female-разъём (оба — соответствующие разъёму питания модема).
- Корпус, напечатанный на 3D-принтере.
1. Особенности и возможности системы
E-ink-дисплей
Панель управления с данными, получаемыми из системы мониторинга, и с кнопкой для удалённой перезагрузки модема
- Raspberry Pi Zero подключён к интернету через беспроводную сеть. Каждые полчаса система тестирует скорость загрузки и выгрузки данных, а так же проверяет пинг. Для измерений используется утилита командной строки от speedtest.net.
- Результаты измерения полосы пропускания и проверки пинга выводятся на e-ink-дисплее. Там же выводится и время проведения испытаний.
- Если скорость загрузки данных падает ниже заданного порогового значения, реле быстро выключает и включает модем. В результате модем перезагружается. При этом сам модем модифицировать не нужно. Все манипуляции проводятся лишь с питанием модема.
- Кнопка, смонтированная на передней панели устройства, позволяет вручную запустить измерение полосы пропускания канала.
- Данные, собранные системой, выводятся в панели управления, созданной на портале Ubidots. Там, помимо графиков, есть сведения о причинах перезагрузок модема.
- В панели управления, кроме того, имеется кнопка, которая позволяет удалённо перезагрузить модем.
- Питание для системы мониторинга подаётся с блока питания модема. Дополнительный блок питания ей не нужен. Питание на модем поступает через систему мониторинга. При этом реле позволяет отключать питание от модема и включать его снова, то есть — позволяет перезагружать модем. Raspberry Pi при этом продолжает работать.
2. Соединение компонентов системы
Система в сборе
На снимке готового устройства со снятой крышкой корпуса можно видеть следующие элементы:
- Нажимная кнопка.
- E-ink-дисплей.
- Raspberry Pi Zero.
- Модуль реле.
- RGB-светодиод и резисторы (их состав зависит от используемого светодиода).
- Выключатель.
- Преобразователь постоянного тока.
- Female-разъём.
Схема подключения компонентов
На предыдущем рисунке показано, что плюсовой кабель от блока питания идёт через выключатель к преобразователю постоянного тока (он преобразует 12V, необходимые для питания модема, в 5V для Raspberry Pi). Потом, через реле (через нормально замкнутый контакт), питание идёт к выходному Female-разъёму. В результате оказывается, что питание подаётся на модем даже в том случае, если система мониторинга выключена.
Процесс измерений можно инициировать вручную, нажав на кнопку, смонтированную на передней панели. RGB-светодиод используется для того чтобы сообщать пользователю о том, чем именно занято устройство.
На схеме не показано подключение дисплея к Raspberry Pi. Данные о подключении дисплея представлены на следующем рисунке.
Подключение e-ink-дисплея к Raspberry Pi
GPIO-выводы Raspberry Pi
3. 3D-печать и сборка корпуса
Готовый корпус, вид спереди
Готовый корпус, вид сзади
Компоненты корпуса
Корпус состоит из следующих компонентов, пронумерованных на предыдущем рисунке:
- Нижняя часть.
- Верхняя часть.
- Передняя панель.
- Задняя панель.
- Крепёжные элементы (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
Если всё настроено правильно, то, что получится после запуска этой команды, будет напоминать следующий рисунок.
Проверка 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
Вот как это выглядит в окне терминала.
Настройка заданий 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
Панель управления Ubidots
В панели управления, созданной с помощью Ubidots, можно выделить следующие части:
- График измеренных значений скорости загрузки и выгрузки данных. Новое значение попадает сюда каждые полчаса.
- Сведения о пинге. Этот график тоже пополняется новым значением каждые полчаса.
- Средняя скорость загрузки данных. Здесь выводится среднее значение скорости загрузки, вычисленное за 24 часа.
- Таблица со сведениями о результатах текущих измерений и о времени их проведения.
- Кнопка для удалённой перезагрузки модема. Опрос её состояния проводится каждые 3 минуты. Это означает, что перезагрузка модема может быть произведена не сразу после её нажатия.
- Журнал со сведениями о перезагрузках модема и об их причинах. Среди этих причин — нажатие на кнопку для удалённой перезагрузки модема, отключение от электросети, падение показателей пропускной способности канала ниже заданного порогового значения.
Подробности о том, как создавать подобные панели управления, и о том, как интегрировать их с Python-кодом, можно найти здесь.
7. Устройство в действии
Загрузка и начало работы устройства
Возникало ли у вас желание сделать себе монитор пропускной способности интернет-канала?