Я использую для выхода в интернет LTE-модем. Меня часто интересует то, какую полосу пропускания канала обеспечивает провайдер. Поэтому я и подумал о том, что неплохо было бы сделать систему для мониторинга интернет-канала. Такая система должна была быть компактной и экономичной в плане потребления электроэнергии. В качестве её основы я решил использовать Raspberry Pi Zero. Этот одноплатный компьютер подключается к модему по беспроводной сети. В результате с помощью моей системы можно не только мониторить интернет-канал, но ещё и обнаруживать проблемы с сетью.
Готовая система мониторинга пропускной способности интернет-канала
E-ink-дисплей
Панель управления с данными, получаемыми из системы мониторинга, и с кнопкой для удалённой перезагрузки модема
Система в сборе
На снимке готового устройства со снятой крышкой корпуса можно видеть следующие элементы:
Схема подключения компонентов
На предыдущем рисунке показано, что плюсовой кабель от блока питания идёт через выключатель к преобразователю постоянного тока (он преобразует 12V, необходимые для питания модема, в 5V для Raspberry Pi). Потом, через реле (через нормально замкнутый контакт), питание идёт к выходному Female-разъёму. В результате оказывается, что питание подаётся на модем даже в том случае, если система мониторинга выключена.
Процесс измерений можно инициировать вручную, нажав на кнопку, смонтированную на передней панели. RGB-светодиод используется для того чтобы сообщать пользователю о том, чем именно занято устройство.
На схеме не показано подключение дисплея к Raspberry Pi. Данные о подключении дисплея представлены на следующем рисунке.
Подключение e-ink-дисплея к Raspberry Pi
GPIO-выводы Raspberry Pi
Готовый корпус, вид спереди
Готовый корпус, вид сзади
Компоненты корпуса
Корпус состоит из следующих компонентов, пронумерованных на предыдущем рисунке:
Все эти части можно напечатать без поддержек. Файлы с моделями лежат здесь.
Дисплей крепится к передней панели с помощью крепёжных элементов и двустороннего скотча. Кнопка, выключатель и Female-разъём прикручены к передней и задней панелям корпуса. Для соединения верхней и нижней частей корпуса использованы винты 3x20 мм. Передняя и задняя панели довольно плотно прилегают к верхней и нижней частям корпуса. Если понадобится, то их, чтобы они хорошо стали на свои места, можно обработать наждачной бумагой (с внутренней стороны — чтобы не повредить их внешнюю поверхность).
Моё руководство по настройке Raspberry Pi основано на различных материалах, взятых из разных источников (например, с сайта производителя e-ink-дисплея). Я, действуя в соответствии с нижеприведёнными инструкциями, смог добиться желаемого результата. Я не являюсь Linux-экспертом, поэтому никаких оптимизаций или чего-то подобного не производил. Я знаю о том, что, наверняка, существуют более совершенные и более эффективные методы достижения тех же результатов.
Я исхожу из предположения о том, что сейчас читатель этого материала работает в следующих условиях. На его Raspberry Pi уже установлена ОС Raspbian (есть много руководств по её установке). К плате подключён дисплей (через miniHDMI), мышь и клавиатура. Имеется правильно настроенное беспроводное подключение платы к маршрутизатору или к интернету. Все процедуры, если не указано иное, производятся в терминале.
Это нужно для подключения к Raspberry Pi с компьютера.
Ещё можно работать через SSH (инструкции по настройке имеются здесь).
Далее, нужно изменить пароль. Инструкции смотрите здесь.
Для проверки работоспособности
Если всё настроено правильно, то, что получится после запуска этой команды, будет напоминать следующий рисунок.
Проверка speedtest-cli
Вот более подробная инструкция по загрузке и установке wiringPI.
Альтернативный способ установки wiringPi:
Подробности об этом ищите здесь.
Подробности о соответствующей библиотеке вы можете найти на этой странице.
Сначала нужно загрузить файл
Альтернативный способ установки:
Выполните следующую команду для того чтобы приступить к настройке Raspberry Pi:
Для запуска I2C-драйвера перейдите по пути
В него надо добавить две строки:
Подробности об установке библиотек на Raspberry Pi можно найти здесь.
Выполним следующую команду:
Для включения драйвера SPI перейдём по следующему пути:
Сначала установим
Теперь загрузим и установим нужные шрифты (Roboto и Droid):
Это нужно для запуска менеджера файлов с root-привилегиями. Файлы TrueType-шрифтов надо скопировать в папку
Альтернативный способ установки шрифтов заключается в их копировании в папку
Для доступа к папке
Создадим новую папку —
Crontab используется для планирования выполнения заданий. Например — для запуска проверки полосы пропускания интернет-канала каждые 30 минут. Добавим следующие строки в файл
Вот как это выглядит в окне терминала.
Настройка заданий cron
Здесь представлена настройка следующих заданий:
В следующем разделе поговорим о программной части проекта.
Программная часть моего монитора пропускной способности интернет-канала представлена следующими Python-файлами:
Для того чтобы программа могла работать с панелью управления Ubidots, нужно ввести свои данные (токен доступа, имена устройства и переменных) в раздел файла
Панель управления Ubidots
В панели управления, созданной с помощью Ubidots, можно выделить следующие части:
Подробности о том, как создавать подобные панели управления, и о том, как интегрировать их с Python-кодом, можно найти здесь.
Загрузка и начало работы устройства
Возникало ли у вас желание сделать себе монитор пропускной способности интернет-канала?
Готовая система мониторинга пропускной способности интернет-канала
Материалы
- Одноплатный компьютер 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-разъём прикручены к передней и задней панелям корпуса. Для соединения верхней и нижней частей корпуса использованы винты 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, можно выделить следующие части:
- График измеренных значений скорости загрузки и выгрузки данных. Новое значение попадает сюда каждые полчаса.
- Сведения о пинге. Этот график тоже пополняется новым значением каждые полчаса.
- Средняя скорость загрузки данных. Здесь выводится среднее значение скорости загрузки, вычисленное за 24 часа.
- Таблица со сведениями о результатах текущих измерений и о времени их проведения.
- Кнопка для удалённой перезагрузки модема. Опрос её состояния проводится каждые 3 минуты. Это означает, что перезагрузка модема может быть произведена не сразу после её нажатия.
- Журнал со сведениями о перезагрузках модема и об их причинах. Среди этих причин — нажатие на кнопку для удалённой перезагрузки модема, отключение от электросети, падение показателей пропускной способности канала ниже заданного порогового значения.
Подробности о том, как создавать подобные панели управления, и о том, как интегрировать их с Python-кодом, можно найти здесь.
7. Устройство в действии
Загрузка и начало работы устройства
Возникало ли у вас желание сделать себе монитор пропускной способности интернет-канала?