Ping в MQTT c Keenetic
Иногда бывает так, что хочется странного. То мороженного с беконом, то льда теплого, а то вдруг пинговать внешние сервера с роутера и складывать статистику в MQTT брокер. И если по первым двум пунктам все понятно, то третий я вчера реализовал в своем окружении. И что бы иметь возможность это когда-либо повторить – запишу это тут, а там глядишь и еще кому-то пригодится.
Итак, что мы имеем перед началом этого упражнения:
- Роутер Keenetic Ultra c развернутой на флешке Entware (сгодится и любой другой, где можно установить OPKG
- root доступ на него (роутер) в консоли
- развернутый с локальной сети где-то MQTT брокер (у меня установлен на отдельном сервере в контейнере, но некоторые ставят прямо на роутер)
- работающий шедулер, например cron
Дальше все просто
Ставим клиентскую часть для отправки сообщений в брокер
opkg update
opkg upgrade
opkg install mosquitto-client-nossl
Пишем скрипт
#!/opt/bin/sh
export PATH=/opt/sbin:/opt/bin:/opt/usr/sbin:/opt/usr/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Адрес хоста где установлен брокер
mqtthost='192.168.1.0'
# Порт на котором работает брокер
mqttport='1883'
# Пользователь и пароль для доступа к брокеру (если используется аутентификация)
mqttuser='mqtt-user'
mqttpass='mqtt-user-password'
# Топик в который складывать сообщения
mqtttopic='stat/keenetic/ping'
google_ping=$(ping -c 5 google.com | tail -1)
lupdate=$(date '+%d-%m-%Y %H:%M:%S')
google_min=$(echo $google_ping | awk -F '/' '{print $3}' | awk '{print $3}')
google_avg=$(echo $google_ping | awk -F '/' '{print $4}' | awk '{print $1}')
google_max=$(echo $google_ping | awk -F '/' '{print $5}' | awk '{print $1}')
mosquitto_pub -r -h $mqtthost -p $mqttport -u $mqttuser -P $mqttpass -t $mqtttopic/google -m "{\"min\":$google_min,\"avg\":$google_avg,\"max\":$google_max,\"Last Update\":\"$lupdate\"}" > /dev/null 2>&1
Для примера в скрипте пингую гугл, вам никто не мешает заменить это на нужный адрес или добавить по аналогии дополнительные.
Остается не забыть сделать скрипт исполняемым, запустить для проверки что все работает и засунуть его в cron для запуска например каждую минуту.
Сообщение сформировано в json формате, так что ничто не мешает собирать эту статистику тем же Home Assistant-ом и рисовать себе где-то красивые графики.