
Ссылка на статью в формате MarkDown для Curl, кодировка RU.UTF-8
Отображение состояния смартфона (Android) на сайте
Адрес страницы: https://nixscript.ru/mstatus2site
ВНИМАНИЕ!!! Всё что в этой статье описано может быть небезопасно для вашей конфиденциальной информации и для вашего смартфона!
Я решил написать об этом, просто для того, чтобы показать возможности termux, а вовсе не для того, чтобы все начали бездумно делиться конфиденциальной информацией с миром. Результат можно посмотреть здесь.
Требования
Для того, чтобы всё получилось, мне потребовалось:
- termux и termux-api
- jq установленный в termux, он позволяет манипулировать данными в формате JSON. Именно в этом формате termux-api выдаёт данные.
- NetCat. Можно использовать ping, но он дольше работает.
- Свой настроенный веб-сервер. В зависимости от ваших потребностей, вам он может и не понадобиться.
- На веб-сервере должны работать Apache2 и PHP5.6+
Установка необходимого
С установкой termux и termux-api нет ничего сложного. Если у вас Android 7 и выше, разработчик termux рекомендует добавить termux-api в защищённые приложения, иначе, к примеру, запрос статуса АКБ может зависнуть наглухо.
После этого надо запустить termux и выполнить в нём:
apt update
apt upgrade
apt install termux-api
Нет, я не ошибся. В терминале тоже надо установить пакет termux-api, иначе не будет связи между termux и termux-api
Установка jq и NetCat
С этим тоже нет особых проблем. Просто заходите в терминал termux и выполняете следующее:
apt install jq netcat
Веб-сервер
Будем считать, что на сервере всё установлено и настроено. Ничего особенного для реализации не требуется, надо просто, чтобы сервер работал, PHP присутствовал и был запущен любой сайт на PHP. О том как это сделать написано море инструкций.
Начинаем со смартфона
Для удобства, я создал директорию ~/bin, чтобы держать в ней свои скрипты.
В этой директории создаём скрипт с именем info2site:
mkdir ~/bin
touch info2site
Теперь надо определиться со списком параметров смартфона, передаваемых на сайт. Как видно, я выбрал следующий безопасный список:
- Имя оператора сотовой связи
- Тип сети
- Статус подключения Wi-Fi
- Статус доступа по IPv4
- Статус доступа по IPv6
- Состояние аккумулятора
- Уровень заряда аккумулятора
- Статус подключения к зарядному устройству
- Температура аккумулятора
То есть подобрал именно то, что не должно мне навредить, если попадёт в чужие руки, и то, я не уверен, что даже эту информацию стоит публиковать в современном мире... как минимум меня начнёт затрахивать МТС своими рекламными "супер-предложениями" и скидками...
Чтобы получить перечисленную информацию, необходимо задействовать три команды termux-api:
И так, открываем наш скрипт любым текстовым редактором (я бы посоветовал micro, но в Android больше возможностей, в play market море всяких) и пишем следующее.
#!/bin/bash
# Делаем проверку доступности IPv6
nc -vz ipv6.nixscript.ru 80
I6=$?
# Делаем проверку доступности IPv4
nc -vz ip.nixscript.ru 80
I4=$?
# Получаем и компонуем статус wi-fi и IP-адресов
W=$(termux-wifi-connectioninfo | jq -c "{wifi: (.network_id > 0), ipv4: ($I4 == 0), ipv6: ($I6 == 0)}")
# Получаем и компонуем информацию о сотовой сети
S=$(termux-telephony-deviceinfo | jq -c '{o: .network_operator_name, t: .network_type}')
# Получаем и компонуем информацию о состоянии АКБ
B=$(termux-battery-status | jq -c '{b: .health, bp: .percentage, bl: .plugged, bt: .temperature}')
# Теперь у нас есть три массива в формате JSON, но нам надо один общий массив.
# К счастью, формат JSON является очень простым, текстовым форматом, поэтому
# нам надо лишь удалить несколько символов у каждого массива и объединить их в один с помощью BASH
echo "${W:0:-1},${S:1:-1},${B:1}">~/.mstatus
# И отправляем это всё на веб-сервер
rsync -e "ssh -p 22" ~/.mstatus userlogin@remote.tld:/path/to/www/web-site.ru/
Остаётся дать скрипту права на запуск, чтобы он мог передавать данные на веб-сервер.
chmod +x bin/info2site
Переходим к веб-серверу
На сервере, в индексном файле (обычно index.php) или в любом другом, если у вас CMS супер-пупер какая нибудь хрень (у меня простенький велосипед), нужно вбить следующий код:
<?php
...
# Открываем и распаковываем из JSON в массив данные переданные со смартфона
$ml=json_decode(file_get_contents('.mstatus'),TRUE);
# Получаем дату и время изменения данных со смартфона
$mlt=date("d.m.Y H:i",filemtime('.mstatus'));
# Формируем код HTML для отображения на сайте
$mlo="<div style='background:rgba(255,255,255,0.5);padding:10px;font-size:0.8em;'>
<strong>Оператор:</strong> ".$ml['o']."<br>
<strong>Сеть:</strong> ".$ml['t']."<br>
<strong>Wi-Fi:</strong> <span style='color:".(($ml['wifi'])?"#050'>Подключен":"#500'>Неподключен")."</span><br>
<strong>IPv4:</strong> <span style='color:".(($ml['ipv4'])?"#050'>Да":"#900'>Нет")."</span><br>
<strong>IPv6:</strong> <span style='color:".(($ml['ipv6'])?"#050'>Да":"#900'>Нет")."</span><br>
<strong>Состояние АКБ:</strong> <span style='color:".(($ml['b']=="GOOD")?"#050'>Ok":"#900'>".$ml['b'])."</span><br>
<strong>Уровень заряда:</strong> <span style='color:".(($ml['bp']<25)?"#900'>".$ml['bp']:(($ml['bp']<50)?"#550'>".$ml['bp']:(($ml['bp']<75)?"#250'>".$ml['bp']:"#050'>".$ml['bp'])))."%</span><br>
<strong>На зарядке:</strong> <span style='color:".(($ml['bl']=="UNPLUGGED")?"#900'>Нет":"#050'>Да")."</span><br>
<strong>Температура АКБ:</strong> ".$ml['bt']."°<br>
<span style='font-size:0.8em;'>Обновлен {$mlt}msk</span></div>";
# Теперь необходимо выбрать место в шаблоне страницы и устроить так, чтобы данные
# вставлялись именно в это место. Я выбрал левый aside (тег HTML), вертикальный блок,
# который всегда располагается слева.
# В шаблоне, между тегами <aside> и </aside> я поставил метку [MLINK], а здесь я
# задал замену этой метки блоком данных. $tmpl - загруженный в переменную шаблон.
$tmpl=str_replace('[MLINK]',$mlo,$tmpl);
# И вывод сформированной страницы в браузер
echo $tmpl;
Завершаем всё действо
Теперь у нас всё подготовлено, осталось лишь добавить задачу в cron на смартфоне, чтобы он периодически запускал наш скрипт info2site. Соответственно на смартфоне в termux, выполняем следующее:
crontab -e
И вбиваем задачу на запуск:
*/5 * * * * /data/data/com.termux/files/home/bin/info2site
И если cron не запущен - запускаем его. Теперь, с периодичностью в 5 минут, смартфон будет отправлять данные на веб-сервер, а тот будет выводить их любому, кто запросит страницу в браузере.
Чтобы cron запускался по-умолчанию при входе в termux, я добавил его запуск в ~/.bashrc просто добавив эту строку:
if [[ -n $(pgrep crond) ]]; then crond; fi
Автор: Grigruss 18.04.2019
Статья написана в формате MarkDown и сконвертирована в HTML с помощью скрипта Parsedown.