Вредные советы, выпуск №4

Автор: myxa78, 05 февраля 2014, 05:00
Вредные советы, выпуск №4

Не расстраивайтесь, если

Вызывают в школу маму

Или папу.

Не стесняйтесь,

Приводите всю семью…

(Григорий Остер)

Сегодня хочу рассмотреть одну не совсем стандартную задачу. Как и в прошлых выпусках, она базируется на возможностях Tasker и не только. Суть задачи: имеем три Android-смартфона в семье, за их финансовым состоянием должен следить один человек (по непонятным причинам выбор пал на меня). Один из смартфонов имеет две SIM-карты, таким образом, необходимо отслеживать баланс четырех телефонных номеров, все номера предоплаты, и если за одним номером я могу следить сам, то вот с тремя другими не все так просто.

Вредные советы, выпуск №4-2 Adams Android family

Варианты решения:

  • воспользоваться услугами своего банка и подключить автоматическое пополнение номеров на определенную сумму каждый месяц;
  • воспользоваться услугами операторов и в ручном режиме через личный кабинет отслеживать состояние баланса;
  • сделать один смартфон «сервером», который будет получать уведомления с других смартфонов о том, что баланс счета достиг критической отметки, и либо в ручном режиме предлагать пополнить необходимый номер, либо делать это автоматически (без участия человека);
  • какой-то еще вариант.

Первый вариант слишком простой, и мне не подходит, так как, например, один из номеров (телефон первоклашки) нет необходимости пополнять каждый месяц. Второй вариант напрягает тем, что необходим доступ к сети, и все будет происходит в ручном режиме.

Третий вариант интересен и достаточно просто реализуем.

Начнем с того, что необходимо на каждом смартфоне получать текущий баланс, сохранять его, сравнивать с критическим значением и в случае достижения этого значения отправлять данные на «сервер».

Для получения баланса используем USSD-запросы оператора, а вот для обработки этих запросов одного Tasker мало (можно, конечно, реализовать и с его помощью, но это долгий путь). На оба смартфона устанавливаем USSD Dual Widget Pro (существует и бесплатная полнофункциональная версия с небольшими ограничениями), который позволяет получать баланс через USSD-запрос и выводить его в виде виджета на рабочий стол.

Вредные советы, выпуск №4-3

Изобретать велосипед я не стал и просто решил взять уже готовые данные из этой программы. Для этого уже необходимы

  • Root-права;
  • наличие sqlite3;

Необходимые нам данные USSD Dual Widget хранит в своей базе данных по пути /data/data/com.mdnsoft.ussddualwidgetpro/databases/Data.db (путь указан для Pro-версии)

Вот как выглядит эта база изнутри:

Вредные советы, выпуск №4-4

Данные выдергиваем в задаче (назовем ее USSDbalance) tasker: Script->Run shell

Для первой SIM-карты:

sqlite3 /data/data/com.mdnsoft.ussddualwidgetpro/databases/Data.db 'select VALUE from vStat param=1 order by _id desc limit 1'

Выполнять с Root-правами.

Сохраняем результат в свою переменную: store output in->%BALANCE1

Для второй SIM-карты:

sqlite3 /data/data/com.mdnsoft.ussddualwidgetpro/databases/Data.db 'select VALUE from vStat param=2 order by _id desc limit 1'

Выполнять с Root-правами.

Сохраняем результат в свою переменную: store output in->%BALANCE2

Самую сложную часть мы выполнили, теперь остались мелочи. Нам необходимо получать данные в свои переменные, после того как они обновляются в базе данных. Решение этой задачи также имеет несколько вариантов, я решил просто «мониторить» файл базы данных на изменения. В Tasker есть функция для этого: Event (событие)->File(файл)->File modified (файл изменен). Но мне не повезло, Tasker не видел нужный мне файл в /data/data/… (на некоторых версиях Android и отдельных прошивках этот баг пока не решен). Казалось бы, это состояние может ввести в ступор или заставит искать иное решение (я сначала впал в ступор, а потом начал искать выход). На помощь как всегда пришел Root и busybox. Вот такая строчка является решением этой задачи:

inotifyd - /data/data/com.mdnsoft.ussddualwidgetpro/databases/Data.db:c | while read code; do am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -e task_name USSDbalance; done &

(можно было задействовать grep и/или awk)

inotifyd - команда из busybox, которая позволяет отслеживать открытие, изменение файлов и так далее;

/data/data/com.mdnsoft.ussddualwidgetpro/databases/Data.db – файл, который мониторим;

:c - ключ который фильтрует только изменения файла (в нашем случае запись в Data.db);

while read code; do am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -e task_name USSDbalance; done - в случае изменения файла, запускаем нашу задачу USSDbalance;

& - в конце строки заставит нашу команду висеть постоянно в памяти и мониторить изменения.

Запуск этой задачи осуществляем после загрузки Tasker: Event (событие)->Tasker->Monitor start boot. Теперь в Tasker’е в переменных живут показания баланса, и остается их только проверять на предмет достижения критического значения: Event (событие)->Variables (переменные)-> Variable Set (переменная установлена) %BALANCE1. Создаем задачу с проверкой: Task->If(если) %BALANCE1 Math.Less than (матем. «меньше чем»), указываем свое значение. Теперь в этой же задаче можем осуществить отправку данных на свой «сервер». Это возможно сделать отправкой SMS-сообщения, но так как в моих тарифных планах это приведет к дополнительным расходам, решил реализовать процесс немного иначе. На моем телефонном номере подключена услуга, которая позволяет получать SMS через emai (использую ее во многих задачах). То есть, отправив email на адрес вида мой_телефонный_номер@sms.имя_оператора.домен, я его получу в виде сообщения (удобно тем, что нет потребности в постоянно включенном режиме передачи данных 2G/3G/WiFi).

Для отправки email из Tasker есть бесплатный вариант, но для этого необходимо установить «прослойку» и один из удобных вам интерпретаторов, например, python. Думаю, многим это может показаться сложным, да и объемы статьи приблизятся к критическому значению. Поэтому предлагаю пойти более легким путем, но легкий путь имеет свою цену: Locale SendSilentMail Plug-In. В текущей задаче после строки проверки критического значения: Plugin->SendSilentMail, настраиваем по своему вкусу (можно, например, отсылать текущее значение «проблемного» баланса).

На этом работа с «клиентами»-смартфонами окончена, от себя могу лишь добавить, что можно задействовать озвучивание текущего баланса при достижении критического уровня, используя советы из пилотного выпуска. А благодаря приемам из второго выпуска «Вредных советов» («Организовываем автоматическое включение Wi-Fi дома»), отправка писем происходит автоматически, как только появится соединение с сетью.

Осталось настроить наш «сервер» на обработку сообщений: Event (событие)->Phone (Телефон)->Text Received (получено текстовое сообщение). Указываем имя отправителя, у меня это SMS_z_Email, содержание не указываем, так как мы его будем обрабатывать внутри задачи.

Создаем задачу под этот профиль:

  1. Variables (переменные)-> Variable Set (установить переменную) - %SMSTXT to(до) %SMSRB (это внутренняя переменная tasker, в ней хранится текст сообзения sms/mms)
  2. Task->If (если) %SMSTXT совпадает с нужным вам значением
  3. Выполнить нужные действия. У меня это автоматическая отправка SMS для пополнения телефонного номера с которого пришел запрос (услуга SMS-банкинг), но перед этим выполняем проверку, так как может прийти несколько запросов от одного «клиента», и чтобы не осуществить задублированные платежи, необходимо все четко проверить.
  4. Тут идут проверки идентичные пункту 2 для других телефонных номеров.

На деле это работает так: после каждого исходящего звонка (SMS-сообщения) проверяется текущий баланс, если он меньше определенной суммы, то смартфон желает сообщить об этом «серверу». Включается Wi-Fi, пытается установить соединение, если соединение установлено, то отсылается SMS через email на «сервер». Если не удалось соединиться, то письмо с запросом находится в очереди и будет отправлено, как только смартфоны окажутся дома и сработает профиль, определяющий местоположение, включится Wi-Fi и запрос уйдет на «сервер». Смартфон-«сервер» получает SMS-сообщение, анализирует его, совершает отправку SMS услугой SMS-банкинг с пополнением телефонного номера, получает сообщение от банка, анализирует его и при успешном списании сообщает об этом. Можно усложнить задачу, выставить несколько уровней критического баланса, и в случае, если он критически-критичен, осуществить звонок на «сервер» за счет «сервера». В общем, было бы желание, а места для полета фантазии предостаточно.

Возможно, некоторым покажется, что некий СМ варит кашу из топора (в данном контексте это не CyanogenMod, см. рисунок ниже), но сложного в этой задаче и ее решении ничего нет.

Вредные советы, выпуск №4-5

Подписывайтесь на наш нескучный канал в Telegram, чтобы ничего не пропустить.

Поделиться

Ваш комментарий
25 комментариев
alexapod читатель (2 комментария)
5 февраля 2014 г. 7:30:25 #

Мне кажется, для четвертой статьи слишком сложно. Думаю много новичков читают эту тему. Могут не понять и бросить. Про настройку смарта для ребенка было бы как раз. ИМХО. А так, в остальном, молодец. Продолжай в том же духе. Читаю с удовольствием, хотя эти шаги уже давно позади- к ним все равно приходится возвращаться. А у тебя все наглядно и весело как-то )))

Ответить
alexapod
0
myxa78 ветеран (732 комментария)
5 февраля 2014 г. 8:39:22 #

согласен, что сложновато чуть-чуть, но все в пределах образовательной программы (все выпуски согласованы с советом Галактик и министерством образования ;)

Ответить
myxa78
0
crab читатель (5 комментариев)
5 февраля 2014 г. 9:54:51 #

Вопрос не по конкретной теме статьи. Сделал профиль, который при приближении к GSM вышке включает WIFI. Проблема в том, что WIFI на телефоне реально включается лишь при разблокировке экрана. Не подскажете куда копать?

Ответить
crab
0
myxa78 ветеран (732 комментария)
5 февраля 2014 г. 10:07:34 #

самое простое решение: установить secure settings и используя его как плагин к таскеру перед включением wifi зажигать экран на минимальное время...

Ответить
myxa78
0
crab читатель (5 комментариев)
5 февраля 2014 г. 12:48:11 #

А если посложнее?))

Ответить
crab
0
myxa78 ветеран (732 комментария)
5 февраля 2014 г. 12:56:12 #
  1. кривой драйвер, не умеющий поднимать автоматом из спячки, обычно, помогает передернуть интерфейс - iwconfig down/up
  2. попытки обрезать мощность сигнала (iwconfig/iwlist/iwpriv, параметры сигнала, особенно, txpower)
  3. попытки поиграть режимами сна контроллера (опять iwconfig с компанией; dumpsys на сервисы net, connectivity, wifi)
  4. несовместимость по crda с AP (но это уже экзотика) (c)
Ответить
myxa78
0
crab читатель (5 комментариев)
7 февраля 2014 г. 14:23:58 #

Поставил Secure Settings, выбрал в задаче разбудить экран и клавиатуру на 30 секунд, но почему то ничего не происходит. Не пойму, что ещё подкрутить.

Ответить
crab
0
myxa78 ветеран (732 комментария)
7 февраля 2014 г. 14:51:13 #

ничего не происходит в смысле не загорается экран?

Ответить
myxa78
0
crab читатель (5 комментариев)
7 февраля 2014 г. 14:52:43 #

да

Ответить
crab
0
myxa78 ветеран (732 комментария)
7 февраля 2014 г. 23:27:18 #

версия android и какое устройство?

Ответить
myxa78
0
crab читатель (5 комментариев)
8 февраля 2014 г. 8:19:22 #

4.2, Jiayu G3S

Ответить
crab
0
myxa78 ветеран (732 комментария)
8 февраля 2014 г. 12:53:09 #

tasker включен в админ устройствах ?

Ответить
myxa78
0
Блефов старожил (464 комментария)
5 февраля 2014 г. 10:40:10 #

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

Ответить
Блефов
0
myxa78 ветеран (732 комментария)
5 февраля 2014 г. 10:42:59 #

я в первой статье четко все описал о данном цикле статей.

  1. назовите хоть одно приложение которое сможет пополнять (отсылать уведомления на один номер в виде email,sms и тд.) сторонние номера при достижении определенного порога? до конца статью дочитали? :)
  2. рисовать руками свои виджеты с балансами сейчас позволяет всего одно приложение (и то в этом рисовании сейчас есть бока, в таскере их нет... пока :)
Ответить
myxa78
0
Блефов старожил (464 комментария)
5 февраля 2014 г. 14:00:17 #

"Кое-кто" сказал, что всё гениальное просто. Так вот вариант в статье чуть ли не максимально возможно сложный. Серверы, клиенты, уведомления, куча приложений, куча разнопротокольных связей, куча "если". Больше похоже на технологии ради технологий. Не говоря уже о том, что чем сложнее система, тем больше вероятность нестабильности работы или отказа.

Есть приложения, которые просто выводят на один из рабочих столов баланс по разным счетам. Один свайп и все счета перед глазами. Не надо множество манипуляций и "если".

Ответить
Блефов
0
myxa78 ветеран (732 комментария)
5 февраля 2014 г. 14:05:55 #

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

моя задача автоматическое отслеживание баланса нескольхих тел. номеров и их автоматическое пополнение (без моего участия)...

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

p.s. не спорю с одним, для когото телефон (даже если это смарт) только, чтобы звонить, но ведь есть и иная категория людей

Ответить
myxa78
0
alexapod читатель (2 комментария)
5 февраля 2014 г. 12:20:02 #

Кстати, насчет плагина Locale SendSilentMail Plug-In. Бесплатный вариант- почтовый клиент Aqua Mail. Плагин для Tasker присутствует. Сам недавно обнаружил

Ответить
alexapod
0
myxa78 ветеран (732 комментария)
5 февраля 2014 г. 12:28:58 #

да, еще помоему K9 можно использовать (тоже поддержка должна быть в таскере). можно в принципе через intent и стандартным почтовиком это делать (визуально чуть усложнит задачу)

Ответить
myxa78
0
Torez351 читатель (1 комментарий)
6 февраля 2014 г. 12:06:36 #

По теме intent'ов и взаимодействию Tasker'а с "обычными" приложениями хотелось бы увидеть примеры в последующих выпусках. А, вообще, спасибо такие "вредные советы". Особенно интересно было в выпусках 2 и 4. Успехов!

Ответить
Torez351
0
Arslan 9 читатель (21 комментарий)
6 февраля 2014 г. 13:16:32 #

очень все как то запутано и обычному пользователю не понять всего что необходимо сделать. имхо

Ответить
Arslan 9
0
myxa78 ветеран (732 комментария)
6 февраля 2014 г. 15:16:40 #

эти примеры не совсем для повторения (хотя если читать их не диагонально, а последовательно, то повторить не сложно:) у каждого свои задачи стоят. советы на то и советы, чтобы "вынести", чтото своё.

представьте себе цикл статей который позволит 5-ти класнику собрать свой дистр linux подобной системы:) а ведь такие статьи есть, но к счастью они также запутаны для обычного пользователя, но несмотря на это кол-во дистров все растет и растет:)

так, что если есть желание/необходимость понять то...

например из статьи можно вынести очень полезную вещь: root,busybox,sqlite3 - вот используя 3 эти вещи можно даже обойтись и без таскер, но вот это будет не то, чтобы не понятно, а совсем страшно! :)

Ответить
myxa78
0
alex04210 читатель (5 комментариев)
4 марта 2014 г. 11:27:50 #

Вы упоминали о функции создания app. Я себе установил её но возник вопрос. Ей можно создавать апп'ы только из задач? У меня получается создавать только приложение которое работает только если по тепу 'тапнуть'. События (Events) оно не отслеживает.так ? Или чета не так сделал?

Ответить
alex04210
0
myxa78 ветеран (732 комментария)
4 марта 2014 г. 19:31:35 #

должен отслеживать... какое именно событие?

Ответить
myxa78
0
alex04210 читатель (5 комментариев)
7 марта 2014 г. 9:18:28 #

Профайл "будние дни" по будним дня запускает задачу "включить Профайл погода утром" Таким образом по будним дням Включается профйл Погода утром. Которые каждое утро в 8:00 когда включён читает сводку погоды (ваш первый совет)

И как из этого всего сделать один апп? Функция сделать апп применяется только к задаче - по длинному нажатию я выбирают экспорт в Апп

Ответить
alex04210
0
myxa78 ветеран (732 комментария)
7 марта 2014 г. 12:19:28 #

нужно создать проект (долгий тап на домик)...в нем профили и задачи... проект экспортируется в апп

Ответить
myxa78
0