Навязчивое желание иметь постоянный и свободный доступ к домашнему компьютеру и нежелание тратить электроэнергию привели меня на Google Play в поисках приложения, позволяющего включать компьютер через Wake on LAN. Таких приложений там огромное множество, но ни одно из них мне так и не удалось научить включать компьютер из внешней сетки. Ни проброс портов на роутере, ни добавление статических записей в ARP роутера не дали нужного результата. Судя по всему это всё-таки можно реализовать, но потратив кучу сил и нервов, я решил поступить по-другому.
У меня на роутере стоит прошивка от Merlin, которая включает в себя функцию WOL из веб-интерфейса. В эту сторону я и начал копать. Не сильно много времени ушло чтобы выяснить, какая именно команда роутера выполняет рассылку WOL-пакета. Для моего роутера это:
ether-wake -i br0 AA:BB:CC:DD:EE:FF
Следующим шагом стал поиск приложения, которое позволило бы подключиться к роутеру и выполнить указанную команду. Ну а т.к. приложений-терминалов и SSH клиентов в Google Play достаточно, то я без труда смог научить свой смартфон включать компьютер из любой точки мира через терминал.
Однако на этом я не остановился, т.к. каждый раз заходить в приложение терминала, вставлять нужную команду, которую надо где-то сохранять — это очень неудобно. И я пошёл по пути создания своего приложения.
В первой версии приложения, которая совершенно не имела никакого дизайна — я реализовал лишь возможность подключения по SSH.
Изначально я добавил лишь команду ether-wake, указанную выше.
Однако позже выяснилось (благодаря пользователям приложения), что, например, на DD-WRT прошивках используется команда wol, и она тоже была добавлена:
/usr/sbin/wol -i 192.168.1.255 -p 9 AA:BB:CC:DD:EE:FF
А на OpenWRT прошивках чаще всего используется команда:
/usr/bin/etherwake -D -i "br-lan" AA:BB:CC:DD:EE:FF
Приложение (в котором указаны данные для доступа к роутеру) подключается к роутеру посредством SSH (вскоре была добавлена также поддержка Telnet). Для реализации SSH соединения я использовал jar-библиотеку com.jcraft.jsch, а для Telnet соединения — класс TelnetClient из пакета org.apache.commons.net
В итоге появилось приложение, которое отличается от нескольких десятков аналогичных по функционалу приложений маркета. Отличается оно не столько визуально, сколько идеей и технологией. Сейчас у приложения чуть больше 2000 скачиваний и количество установок постоянно растёт.