Androidスマホのバッテリーが少なくなったらWindows 10パソコンに通知するプログラムについて紹介します。
なんとなく需要ありそうなので書いてみた。
androidのバッテリーが15%になったときにパソコン上で音声通知をします。
全体の流れ
ひとつひとつやってることは難しいことではないのですが、使う技術は相変わらず多いので、場合によっては時間がかかるかもしれませんが、これができると他のandroidのデータのやりとりにも応用できるのでぜひがんばってみてください。
- androidがバッテリー少なくなったらIFTTTでウェブリクエストする
- ubuntuのsinatraサーバーでそれを受け取って任意のコマンドをファイルに書き込む
- ファイルのテキストをコマンドとして実行する。(ポップアップ通知する;ttsする;etc)
事前準備
- ポートフォワーディングができるWifiルーターにしましょう。
ポート転送をすることで、ローカルで動かしているサーバーをグローバルIPの公開URLからリクエストするため、そういうルーターでない方は買いましょう。幸運にも、どのルーターを買えばいいのかは明白です。
光回線工事後、4台のルーターを実際に買って検証した結果導き出された最高のwifiルーターとは
- WSL
WSL(Windows Subsystem for Linux)を初期から使っている僕がLinuxやプログラミングの初心者向けにWSLのメリットを解説してみる
WSL bash on ubuntu on windows インストール手順
- Ruby環境を作りましょう
Rubyでsinatraを動かします。3分でできるのでささっと環境を作りましょう。
sudo apt update ; sudo apt install build-essential patch zlib1g-dev liblzma-dev ruby{,-dev} -y ; sudo gem install bundler
mkdir -p /mnt/c/pg/ruby_dev && cd $_
sudo bundle init
vim Gemfile
sudo bundle install
vim Gemfile
# add
gem "pry"
gem "sinatra"
手順
- wifiルーターでポートフォワーディングの設定をします
- IFTTTでアプレットを作ります
this … android battely
that … webhooks
title(例) … If Battery drops below 15%, then get request to server
URL(例) … http://220.247.111.111:8005/android-battely
method … get
type … json
body … (空欄)
- android側でIFTTTの設定をします
もしまだなら、androidでIFTTTのアプリをインストールし、当該のアプレットを有効化します。
- Windowsのフォルダをマウントしてファイルを同期できるようにしておきます
sudo mount -t cifs //192.168.0.167/_sync_ ~/share -o user=ifgm2,pass=hoge,dir_mode=0777,file_mode=0777
Ubuntu 18.04でWindows 10の共有フォルダをマウントする方法
windows 10のシェア(共有)フォルダをubuntu16.04でマウント(同期)する
シェアディレクトリのcommand.txt
にコマンドとして実行するテキストをストアしておき、それをWSLで定期的に読み取って実行する、ということをあとで実装します。
サーバー上でダイレクトにコマンドを実行しても、音が出る系などプロセスがサブプロセス(?)だと動かないため意味がなく、ファイルを経由する必要があるからです。
- sinatraを動かします
dev.rb
require "sinatra"
require "open3"
require 'json'
require 'pry'
Encoding.default_external = 'UTF-8'
get "/android-battely" do
# binding.pry
stdout, stderr, statusCode = Open3.capture3( %( bash -c " host #{request.ip} | awk '{print $5}' | awk '/amazonaws.com|ifttt.com/' || echo '' " ) )
if stdout.to_s.strip.empty? then redirect to('/404') end
# puts "ok"
puts @body = request.body.read
stdout, stderr, statusCode = Open3.capture3( %( bash -ic "printf 'tts \\"android battery low\\"' > /home/yuis/share/command.txt || echo '' " ) )
puts stdout, stderr, statusCode
end
sudo bundle exec ruby dev.rb -o 0.0.0.0
簡単な解説 …
stdout, stderr, statusCode = Open3.capture3( %( bash -c " host #{request.ip} | awk '{print $5}' | awk '/amazonaws.com|ifttt.com/' || echo '' " ) )
if stdout.to_s.strip.empty? then redirect to('/404') end
サーバーを公開していると、ハッカーによる悪意のあるアクセスが結構来ます。これを放置していると、最悪パソコンがハッキングされるか壊れるか、今回の例でいえば少なくとも一日中通知が来ます。
んで、そういうのをフィルタするには、sinatraでは、面倒ですが、404ページへリダイレクトさせるのがよいみたいです。
どういうアクセスを404へ飛ばすか、IFTTTからのアクセスでないアクセスを全て遮断します。IFTTTはawsなんで、それだけを許可するようにします。
これでもawsって結構広範囲なので、もしかすると変なアクセスがくるかもしれません。その場合はIFTTT側でgetリクエストにトークン的な意味でパラメータをつけて、サーバー側で認証してやると確実です。
printf 'tts \\"android battery low\\"'
RubyとBashの二段階でエスケープをする必要があるので、バックスラッシュは二回つけます。
- WSL側で使用する関数を定義してください
今回はtts
を使っています。これは、tts text
のようにすることでpowershellを経由してテキストを音読させるものです。
PowershellでTTS(text-to-speech)
以下をbashで実行するか.bashrcへ入れてください。
tts ()
{
/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe - <<EOF
tts "${1}"
EOF
}
はじめてのBash。関数やエイリアスを読み込むまで [初心者向け]
- WSL側で定期的にコマンドテキストの入ったファイルを監視するスクリプトを実行します
conemuなどで以下のスクリプトを実行して放置。
while true; do
echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r"
[[ -s "$SHAREDDIR/command.txt" ]] && {
eval "$(cat "$SHAREDDIR/command.txt")" ; > "$SHAREDDIR/command.txt" ; printf "A command excuted." ;
}
sleep 2s
done
- 実際に動くかテストします
なんか問題があればコメントしてください。