Управление android устройством POST и GET-запросами
Я упоминал уже о приложении для управления android устройствами, необходимость в таком приложении появилась с "часами", об которых я писал. Изначально я пользовался tasker - это приложение для автоматизации android устройства, но пользуясь им я столкнулся с рядом неудобств:
- Чтобы настроить одно устройство (даже перенеся backup с уже настроенного), уходит много времени.
- При увеличении функционала, становится трудно разбираться во всем этом разнообразии профилей, задач и переменных.
- Плагины не всегда поддерживают различными версиями android.
- В случаи изменения функционала, необходимо перенастроить все устройства в доме.
- Пока разберешься во всех тонкостях и нюансах Tasker- уйдет достаточно много времени.
Я перепробовал разные приложения для автоматизации, но все они не давали того базового функционала, который нужен был мне. Во время одного из таких поисков, я наткнулся на приложение PAW Server. PAW Server предоставляет доступ к android устройству через web-интерфейс, позволяет управлять и получать информацию, по средствам скриптового языка BeanShell. Код встраивается непосредственно в html страницу, по аналогии с PHP, но с синтаксисом языка JAVA. Расширение таких файлов должно быть .xhtml. Таким образом, можно создать xhtml файлы с нужным кодом и получить возможность управлять android устройством. На тот момент я мало, что знал о языке JAVA, но по мере изучения и добавления функционала для моих "хотелок", пришлось знакомиться с ним поближе.
String\[\] opts = { "BOARD", "BRAND", "DISPLAY", "MODEL", "PRODUCT",
"TIME", "TYPE", "USER", "VERSION.INCREMENTAL",
"VERSION.RELEASE", "VERSION.SDK"};
for(o : opts) {
print("<b>" + o + ":</b>" + eval("android.os.Build." + o) + "<br>");
}
Например вот так, можно вывести на страницу информацию об устройстве.
import java.io.\*;
import org.json.\*;
import de.fun2code.android.pawserver.AndroidInterface;
pawHome = server.props.get("serviceContext").pawHome;
json = new JSONObject();
// разбиваем get-запрос и преобразуем в json
set = parameters.entrySet();
for (me : set) {
try {
json.put(me.getKey(), me.getValue());
} catch(e) {
json.put("error", e);
}
}
request.sendResponse(json.toString().getBytes(), "text/plain; charset=UTF-8");
request.out.flush();
request.out.close();
Так можно обработать полученные данные от GET или POST запроса, преобразовать их JSON формат и вывести их на страницу.
Написав несколько файлов (скачать можно тут) set.xhtml (для управления устройством), get.xhtml (для получения информации от устройства) и скопировать их в папку где хранятся файлы веб сервера (память устройство/paw/html), я получил доступ к android устройству из своей локальной сети и по средствам POST и GET запросов управлять им.
Например, отправив GET запрос по адресу http://<IP>:8080/get.xhtml можно получить основную информацию об устройстве в формате JSON о состоянии батареи, количество памяти, показаний датчиков и многое другое. Некоторые данные могут отличаться, так как разные устройства имею разный набор датчиков, в остальном же все будут идентично.
Для того чтобы управлять устройством, нужно отправить запрос по адресу http://<IP>:8080/set.xhtml, и в зависимости от команды, передать соответствующие параметры. Ответ выполнения команды, вернется в формате JSON.
Список доступных команд :
- /set.xhtml?send=volume&number=15&mode=STREAM_NOTIFICATION - установка громкости от 0 до 15 (максимальная громкость устанавливается системой, также проверяется чтобы не выходило за пределы установленных значений) mode= может быть (STREAM_NOTIFICATION, STREAM_MUSIC ,STREAM_ALARM, STREAM_RING, STREAM_SYSTEM, STREAM_VOICE_CALL) если не указан, то по умолчанию стоит STREAM_MUSIC
- /set.xhtml?send=say&text=привет текст отправляем на синтез речи.
- /set.xhtml?send=app_start&value=lcf.clock запуск программы Tablet Clock value=lcf.clock
- /set.xhtml?send=apps получить список установленных приложений "название":"системное название".
- /set.xhtml?send=sms&text=привет&number=123456789 отправить смс на номер = number text = текст сообщения
- /set.xhtml?send=call&number=123456789 (Позвонить) на номер number (для USSD запросов символ # меняем на %23 )
- http://IP:8080/set.xhtml?send=dial&number=123456789 (Набрать)на номер number (для USSD запросов символ # меняем на %23 )
- /set.xhtml?send=vibrate&number=1000 включает вибрацию number (время в миллисекундах)
- /set.xhtml?send=noti&texthead=название уведомления&text=текст уведомления
- /set.xhtml?send=alert&texthead=название предупреждения&text=текст предупреждения
- /set.xhtml?send=alertinput&texthead=название предупреждения&text=текст предупреждения ответ вернет в json "return":"данные"
- /set.xhtml?send=openurl&text=http://ya.ru откроет страницу в браузере
- /set.xhtml?send=speech&texthead=Говорите texthead=название (можно не указывать тогда по у молчанию будет равно texthead=Говорите) ответ вернет в json "return":"текст"
- /set.xhtml?send=endсall положить трубку
- /set.xhtml?send=screen_off_time&number=5000 установка времени подсветки экрана в миллисек. -1 - не гасить экран (работает не на всех уст.)
- /set.xhtml?send=task&text=test&value=1111,,1212 запустить задачу [test] таскер и передать параметры %par1 = 1111 %par2 = 1212 и т.д (,,) разделение
- /set.xhtml?send=lcd_on активировать экран на устройстве
- /set.xhtml?send=gong Проигрывает файл ..paw/html/gong.mp3
- /set.xhtml?send=sound_noti проигрывает стандартный звук уведомления
- /set.xhtml?send=sound_ring проигрывает стандартный звук звонка
- /set.xhtml?send=brightness&number=30 уровень яркости подсветки от 1-255
- http://<IP>:8080/set.xhtml?send=exec&text=input tap 100 100 выполнить команду (нужен root) "input tap 100 100" эмитирует нажатие на экран
- /set.xhtml?send=clipboard&text=тест отправить text в буфер обмена
- /set.xhtml?send=rec&number=5000 включить диктофон. number = время записи в миллисекундах. записи сохраняются ../paw/voice/
- /set.xhtml?send=server&text=restart перезагрузка paw сервера
- /set.xhtml?send=server&text=kill остановка paw сервера
- /set.xhtml?send?send=delete_sms_thread&number=36 удалить ветку сообщений с thred_id = 36
- /set.xhtml?send?send=delete_sms_id&number=171 удалить сообщение с id = 171
- /set.xhtml?send?send=mark_all_read&number=36 пометить как прочитанные с thred_id = 34
- /set.xhtml?send?send=scan запускает сканер штрих кода
- /call.xhtml?send=all&date=01-05-2017 Получить все контакты "all" за число (date) 01-05-2017
Из минусов данного способы отсутствие двухстороней связи, сервер умного дома должен постоянно отправлять команды чтобы мониторить сосотояние android, да и нет возможности получать данные о событиях от устройства, например, о звонка, смс или датчиков. Так я пришел к выводу, что нужно делать свое приложение. Перечитывая доки на PAW Server, я наткнулся на его исходники и начал написал cвое приложение - ioBroker.paw. Симбиоз (ioBroker и PAW Server. ioBroker.paw имеет весь функционал PAW Server, но и новые возможности, которые не могли быть реализованы в предыдущей версии. Конечно, теперь в приложении сделан упор на интеграцию с ioBroker, но позволяет использовать его в других системах УД посредством HTTP запросов.
