2255.41
Rating
RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Мониторинг пропускной способности интернет-канала

RUVDS.com corporate blogSystem administrationNetwork technologiesDevelopment for Raspberry PiDIY
Original author: Legufix
Я использую для выхода в интернет 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. Соединение компонентов системы



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

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

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


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

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

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

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


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


GPIO-выводы Raspberry Pi

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



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


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


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

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

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

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

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

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, можно выделить следующие части:

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

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

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




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

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



Tags:Raspberry Pi Zeroразработкаruvds_переводspeedtest
Hubs: RUVDS.com corporate blog System administration Network technologies Development for Raspberry Pi DIY
+38
9.1k 77
Comments 25

Information

Founded
Location
Россия
Website
ruvds.com
Employees
11–30 employees
Registered

Habr blog