logo

nixscript

Keep it simple, stupid !

Ссылка на статью в формате MarkDown для Curl, кодировка RU.UTF-8

Отображение состояния смартфона (Android) на сайте

Адрес страницы: https://nixscript.ru/mstatus2site

ВНИМАНИЕ!!! Всё что в этой статье описано может быть небезопасно для вашей конфиденциальной информации и для вашего смартфона!

Я решил написать об этом, просто для того, чтобы показать возможности termux, а вовсе не для того, чтобы все начали бездумно делиться конфиденциальной информацией с миром. Результат можно посмотреть здесь.

Скриншот сайта

Требования

Для того, чтобы всё получилось, мне потребовалось:

Установка необходимого

С установкой 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

Теперь надо определиться со списком параметров смартфона, передаваемых на сайт. Как видно, я выбрал следующий безопасный список:

То есть подобрал именно то, что не должно мне навредить, если попадёт в чужие руки, и то, я не уверен, что даже эту информацию стоит публиковать в современном мире... как минимум меня начнёт затрахивать МТС своими рекламными "супер-предложениями" и скидками...

Чтобы получить перечисленную информацию, необходимо задействовать три команды 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.

Вверх 🡑