iBeaconで、朝出勤したらslackに通知してみる

このエントリーをはてなブックマークに追加
こんにちわ。ishikawaです。
雨の日曜日なので、iBeaconを使ってプチIOTをしてみました。

ちなみに、iBeaconおよび携帯アプリを作るのは今回初めてで、
粗が目立つと思いますが、ご容赦ください。


今日作るもの

「○○さん、出社してる?」

フレックスタイム制の弊社では、よくこのようなやり取りが行われています。
出社しているのか、していないのか、来てるけど席を外しているだけなのかがわからなくて、
周りの人に聞いても「わかりません」という返事が返ってきたりします。

出社したタイミングで自動的に何かに通知されると
そういったコミュニケーションコストがおさえられて嬉しいなあ、
だけどメールよりもカジュアルなものがいいなあと考え、
slackに通知する方法でアプリを作ることにしました。


準備するもの

  • iBeacon:1台(アプリックス社ビーコンモジュール「BM1」※同僚から借用)
  • iBeacon用の単三電池:2本
  • iPhone(iOS 9.1):1台
  • mac(Xcode7.1) :1台

はい、どこのご家庭にもありますね。
では、早速アプリを作っていきましょう。


アプリの構成



  1. 出社したら、IBeaconの電波を受信し、IOSアプリから中間サーバにメッセージを送信
  2. 中間サーバはその人の出勤をログとして保存しており、その日初めての出勤であれば、ログを記録してslackにメッセージを送信する

#slackの設定

    ①「Slack Integrations」に「Incoming WebHooks」を追加します。

    「Incoming WebHooks」を利用すると、外部のサービスからSlack上へコメントの投稿ができます。
    今回はこの機能を使って、Slackの特定のチャンネルへの投稿を実現することにします。




    ②curlコマンドで動作確認します。

    「 Incoming WebHooks 」を追加すると、POSTするURLが発行されますので、
    念のため、curlコマンドで動作を確認します。
    $ curl -X POST --data-urlencode 'payload={"channel": "#rd", "username": "ishikawa", "text": "This is posted to #rd and comes from a bot named webhookbot.", "icon_emoji": ":beginner:"}' https://hooks.slack.com/services/your_webhook_url


    はい、問題なくメッセージが投稿されました。


    #iosアプリの作成

    中間サーバを用意する前に、IBeaconの電波を受信し、Slackに通知できるかどうか試してみます。

    ①Single View Applicationでプロジェクトを作成し、iBeacon受信用の実装を行います。

    IOS、iBeaconアプリ初心者なため、以下の参考ページの実装をほぼそのままコピペしました。
    参考にしたページ:
    iBeacon Receiver in Swift 2.0
    http://qiita.com/Shirade/items/ca9dcf111f2a7548cacf

    ただ、このままだと位置情報取得の許可が行われなかったため、
    Info.plistに「位置情報を使用する目的」を追加しました。

    追加したキー名
    • NSLocationAlwaysUsageDescription(使用中にのみ許可)
    • NSLocationWhenInUseUsageDescription(常に許可)


    ②Slack宛にPOSTするメソッドを作成します。

        @IBAction func postMessageToSlack() {
            // create the url-request
            let urlString = "https://hooks.slack.com/services/your_webhook_url"
            var request   = NSMutableURLRequest(URL: NSURL(string: urlString)!)
            
            // set the method(HTTP-POST)
            request.HTTPMethod = "POST"
            // set the headers
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            // set the request-body(JSON)
            var params: [String: AnyObject] = [
                "channel"   : "#rd",
                "username"  : "ishikawa",
                "text"      : "ishikawaが出社しました",
                "icon_emoji": ":beginner:"
            ]
            do {
                try request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions(rawValue: 0))
            } catch let parsingError as NSError {
                print(parsingError.description)
            }
            
            // use NSURLSessionDataTask
            var task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {
                (data, response, error) in
                    var result = NSString(data: data!, encoding: NSUTF8StringEncoding)
                    print(result)
            })
            task.resume()
        }
    


    ③iBeaconに乾電池をセットして、IOSアプリを起動します。

    はい、Slackに通知されましたね。



    #中間サーバの準備

    herokuに簡単なアプリをたてようと思ったんですが、本日は力尽きてしまいましたorz
    続きは次回の投稿までお待ち下さいm(_ _)m


    番外編

    #iBeaconのUUIDを取得する方法

    IBeaconはビーコン領域への出入りを監視するため、ビーコン領域の指定をIOSアプリ側でする必要があります。

    ビーコン領域指定パラメータ

    • proximity UUID
    • major value
    • minor value

    同僚から借りたIBeaconのUUIDがわからず、もじもじしていたのですが、
    Node.jsのbleaconパッケージを利用して、情報を取得することができました。

    参考にしたページ:
    たった5行!最も簡単にiBeaconの電波を「受信」する方法
    http://qiita.com/Morikuma_Works/items/c2899e548da1c5e2c28e


    まとめ


    • 雨の日は少し憂鬱ですが、IOTで時間を忘れて楽しむことができました。
    • iBeacon&Swiftのサンプルコードをネットで調べてもバージョンが古いものだと、コンパイルが通らなくて、悲しかったです。IOSの開発はバージョン周りの問題が結構しんどいなと感じました。

    休日、雨でどこにも行けなくなってしまった時、IOTしてみてはいかがでしょうか?

    それではまた!
    次の記事
    « Prev Post
    前の記事
    Next Post »

    1 コメント:

    Write コメント
    高津ベイ
    AUTHOR
    2015年11月27日 0:44 delete

    色々便利でみなさんどうやって使うことができたのかなと疑問に思っていましたが、このツールは個人で登録するのではなくて、グループで登録してその中でのツールですね。

    私は個人として登録して、それからSlackUserと連絡を取り合うものだと思っていました。ちょっと残念ですね。

    Reply
    avatar
    Related Posts Plugin for WordPress, Blogger...