iBeaconで濡れしらず
この記事はおうちハック Advent Calendar 2014 の18日目の記事です。
お題目
外出してから雨が降ってきて、「傘がない!」という経験がある方は多いと思います。 天気予報を見る習慣がある方はいいのですが無い方もそれなりの数いると思います。
こんな悩みを解消しよう!というのが今回の目的です。
ちなみにこのコンセプトのプロダクトは実はもう既に世の中には存在しております。
KickStarter案件だとairfy Beaconというプロジェクトが存在しています。 日本国内だと最近、そら用心というものがリリースされて一部の間でちょっとした話題となっております。
こういったものを自分でも比較的簡単に作れるよ!というのを知ってもらうのも目的であったりもします。
使用する技術要素
今回はAppleのiBeaconを使用します。私の知っている範囲だとiBeaconを決済のものと思い込んでいる方も世の中にはまだそれなりにいるようなので、こういう使い方をするものなのだよということを示したいのでiBeaconでやってみました。
iBeacon自体の詳細は今回は述べません。ググればたくさんヒットすると思いますのでそちらを参照して下さい。
一つだけお勧めするとしたら以下の書籍です。非常に良くまとまっているのでこれを読んどけば大体は分かるかと思います。
使用する機器
以下のいずれかのiOS搭載デバイス
※なお今回のサンプルはiOS8以降での動作を確認しております。動作させるためには端末のBluetoothがONになっている必要があります。- iPhone 4s 以降
- iPad (3rd generation) 以降
- iPad mini 以降
- iPod touch (5th generation) 以降
Beacon
Beaconを自分で用意する必要があります。昨今けっこういろいろと出てきているので、「iBeacon モジュール」とかで検索してみて自分の好きなモノを選んで下さい。電波強度が調整できるものを選択した方が良いです。以下にいくつか紹介しておきます。- Braveridge iBeacon/Beacon端末
Amazonでも購入できるのでおすすめです。 - アプリックス Beaconシリーズ
国内で一番有名どころ。個人でも買えるはず? - Bluegiga BLE112-A
基板です。Friskケースにピッタリと入るのがなんかいいです。モジュールに書き込みが必要なのでCC-Debuggerを既に持っている場合はおすすめ。
- Braveridge iBeacon/Beacon端末
実装
今回はObjective-Cで実装します。気が向いたらSwift版のサンプルも用意したいと思います。
天気情報の取得ですがいくつかのサービスがAPIを提供しています。有名どころで言うとlivedoorのお天気Webサービスでしょうか。 今回は傘を持っていくかどうかを知りたいので降水確率が欲しいです。しかしlivedoorのAPIは降水確率が取得できません。他のサービスも調べてみると降水確率が取得できるものが全然ありません。
そんな中見つけたのがこれです。
1分間に10リクエスト、一日で500リクエストまでは無料とのことなのでこれを使うことにしました。
※予報の情報が正しいかは保証できません。ちょっと試している限り問題無いとは思うのですが。。。もっと降水確率の精度を求めるのならば気象庁の予報ページとかをスクレイピングして情報を取得するのも手かもしれません。
ソースコードの全体は以下に上げてありますのでこちらをご覧下さい。
動作確認
- まずはBeaconを玄関の隅の方に置きます。
- アプリを端末にインストールして玄関に近づきます。
- 今日は傘を持っていくべきかどうかを通知してくれます。
さいごに
このように比較的簡単に目的のものが作成できました。iBeaconを使うと他にも、「家に帰ってきたらhueのスイッチをONして電気を付ける」とか、「IRKitを使ってTVとエアコンのスイッチをオン」とかも今回の応用でできます。
みなさんも是非いろいろなおうちハックをしてみてはいかがでしょうか?
補足
- Beaconの設定とか細かいことは購入した製品の説明書をお読み下さい。
- このサンプルはiBeaconによる降水確率の通知にのみ焦点を当てています。CoreDateのベースだけ作ってあるので通知情報を保存したい場合はそのように実装し直して下さい。(つまり細かい実装をサボりました。。。すいません。必要あれば言って下さい。)
- サンプルだとBeaconのリージョンに入った時に情報を通知するようにしています。ですので、帰宅時も通知が来てしまいます。これを回避したい場合はリージョンの入出も管理して帰宅時は通知をしないように実装し直して下さい。