こんにちわ。ishikawaです。
雨の日曜日なので、iBeaconを使ってプチIOTをしてみました。
ちなみに、iBeaconおよび携帯アプリを作るのは今回初めてで、
粗が目立つと思いますが、ご容赦ください。
今日作るもの
「○○さん、出社してる?」
フレックスタイム制の弊社では、よくこのようなやり取りが行われています。
出社しているのか、していないのか、来てるけど席を外しているだけなのかがわからなくて、
周りの人に聞いても「わかりません」という返事が返ってきたりします。
出社したタイミングで自動的に何かに通知されると
そういったコミュニケーションコストがおさえられて嬉しいなあ、
だけどメールよりもカジュアルなものがいいなあと考え、
slackに通知する方法でアプリを作ることにしました。
準備するもの
- iBeacon:1台(アプリックス社ビーコンモジュール「BM1」※同僚から借用)
- iBeacon用の単三電池:2本
- iPhone(iOS 9.1):1台
- mac(Xcode7.1) :1台
はい、どこのご家庭にもありますね。
では、早速アプリを作っていきましょう。
アプリの構成
- 出社したら、IBeaconの電波を受信し、IOSアプリから中間サーバにメッセージを送信
- 中間サーバはその人の出勤をログとして保存しており、その日初めての出勤であれば、ログを記録して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してみてはいかがでしょうか?
それではまた!