2013年12月16日月曜日

iBeaconで海外渡航を楽しく



はじめに

飛行機を使った移動で一番困るのが到着時の荷物受け取り
いつまで待っても預けた荷物が出てこない、いやとっくの昔に出てしまったかも?、もしかしたらロストバゲット!?
流れるベルトコンベアを眺め続けながら、いつもこのような不安がよぎります・・・
今回はそんな悩みをiBeaconで解決してみたいと思います。



注意事項
近年、航空機内での電子デバイス利用が容認される風潮にありますが、航空会社によってはLowEnergyデバイスであってもBluetooth通信が禁止もしくは制限されることがあります。あらかじめ航空会社に確認を取っておくようにしてください。
また使用にあたっては目的地の国において無線の機器認証が有効かどうかも調べておくとよいでしょう

1.動作原理

iBeaconから発せられるBeacon信号をスマートフォンで受信し電波強度から距離を判定し、一定距離以内に近づいた場合もしくは離れたときにスマートフォンに通知を行います。

本来Bluetooth規格としてはこのような目的のために FindMeやPROXIMITYプロファイルがありますがこれらのデバイスはペアリングが必要だったり複数のデバイス使用が難しいものが多いことあり、今回は手軽に使えるiBeaconのアプリケーション事例として考えてみました。

2.アプリケーション

iBeaconのアプリが作成できる環境があれば、ものすごく簡単なアプリです。
今回はEstimoteのサンプルプログラムを参考に作成しました。

・初期化コード

使用するiBeaconの登録と受信待ちを行うための処理をしています。
今回はアプリ事例の紹介ということもありUUIDなどはハードコーディングにしています。

- (IBAction)startMonitoring:(UIButton *)sender
{
// /*
//  Estimote package #1
//
//  Beacon    Color  Major Minor Location
//
//  Mint cocktail  LightGreen 333  49637 Suitcase
//  Icy marshmallow LightBlue 38101 54169 Backpack
//  Blueberry pie  DarkBlue 56928 57267 -
//  */
 
 NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"];
 NSNumber *mintcocktailMajor = @333;
 NSNumber *mintcocktailMinor = @49637;
 NSString *mintcocktailIdentifier = @"jp.co.brilliantservice.BagTracker.suitcase";
 NSNumber *icymarshmallowMajor = @38101;
 NSNumber *icymarshmallowMinor = @54169;
 NSString *icymarshmallowIdentifier = @"jp.co.brilliantservice.BagTracker.backpack";
 
 CLBeaconRegion *region = nil;
 region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
              major:[mintcocktailMajor shortValue]
              minor:[mintcocktailMinor shortValue]
            identifier:mintcocktailIdentifier];
 if(region)
 {
  NSLog(@"Start monitor for region\n%@",region);
  self.textView.text = [NSString stringWithFormat:@"%@\nStart monitor for suitcase",self.textView.text];
  region.notifyOnEntry = YES;
  region.notifyOnExit = YES;
  region.notifyEntryStateOnDisplay = YES;
  
  [self.locationManager startMonitoringForRegion:region];
 }
 
 region = nil;
 region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
              major:[icymarshmallowMajor shortValue]
              minor:[icymarshmallowMinor shortValue]
            identifier:icymarshmallowIdentifier];
 if(region)
 {
  NSLog(@"Start monitor for region\n%@",region);
  self.textView.text = [NSString stringWithFormat:@"%@\nStart monitor for backpack",self.textView.text];
  region.notifyOnEntry = YES;
  region.notifyOnExit = YES;
  region.notifyEntryStateOnDisplay = YES;
  
  [self.locationManager startMonitoringForRegion:region];
 }
}

・iBeaconが圏内に入ったときのコールバック処理

初期化コードで登録したiBeaconが圏内に入ったら呼び出されるコードです。今回はスーツケースとバックパックの二つのiBeaconをトレースして通知を行うようにしました。
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    
 NSLog(@"Got didEnterRegion for region: %@",region);
 
 NSMutableString *string = [NSMutableString string];
 [string appendFormat:@"%@\n\nUpdated: %@",self.textView.text,[NSDate date]];
 [string appendFormat:@"\nCallback: %@",[[region.identifier componentsSeparatedByString:@"."] lastObject]];
 
 NSString *beacon;
 if([region.identifier isEqualToString:@"jp.co.brilliantservice.BagTracker.suitcase"])
 {
  beacon = @"suitcase";
 }
 else if([region.identifier isEqualToString:@"jp.co.brilliantservice.BagTracker.backpack"])
 {
  beacon = @"backpack";
 }
 else
 {
  beacon = @"unknown";
 }
 
 notification.alertBody = [NSString stringWithFormat:@"Your %@ is within range", beacon];
 [string appendFormat:@"\nYour %@ is within range", beacon];
 
 // If the application is in the foreground, it will get a callback to application:didReceiveLocalNotification:.
 // If its not, iOS will display the notification to the user.
 [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
 self.textView.text = string;
}

・iBeaconが圏外に出たときのコールバック処理

登録したiBeaconが圏外に出たら呼び出されるコードです。圏内の処理と同様スーツケースとバックパックの二つをトレースして通知を行うようにしています。
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    
 NSLog(@"Got didExitRegion for region: %@",region);
 
 NSMutableString *string = [NSMutableString string];
 [string appendFormat:@"%@\n\nUpdated: %@",self.textView.text,[NSDate date]];
 [string appendFormat:@"\nCallback: %@",[[region.identifier componentsSeparatedByString:@"."] lastObject]];
 
 NSString *beacon;
 if([region.identifier isEqualToString:@"jp.co.brilliantservice.BagTracker.suitcase"])
 {
  beacon = @"suitcase";
 }
 else if([region.identifier isEqualToString:@"jp.co.brilliantservice.BagTracker.backpack"])
 {
  beacon = @"backpack";
 }
 else
 {
  beacon = @"unknown";
 }
 
 notification.alertBody = [NSString stringWithFormat:@"Your %@ is out of range", beacon];
 [string appendFormat:@"\nYour %@ is out of range", beacon];
 
 // If the application is in the foreground, it will get a callback to application:didReceiveLocalNotification:.
 // If its not, iOS will display the notification to the user.
 [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
 self.textView.text = string;
 
}

3.実際に使ってみる

空港カウンターで預ける荷物の中にiBeaconデバイスを忍ばせておきます。
預ける前にあらかじめテストは済ませておいてください。

荷物を預けると荷物は貨物スペースに送られ、Beacon信号が届かなくなることから
スマートフォンには"Your suitcase is out of range"が通知されます




目的地の空港に着いたらベルトコンベアの近くで待ちましょう。
もうベルトコンベアの前に並んで流れてくる荷物を探し続ける必要はありません。
リラックスして本を読んだり音楽を聴くのもよいでしょう。
荷物が近づいてくるとスマートフォンに"Your suitcase is within range"が通知されます


あとはコンベアの前に行って荷物をピックアップするだけです。


またアプリにログ機能を付けておくと荷物の状況が判って便利です。
意外な話ですが一般的な航空機はエコノミークラスの真下が荷物スペースになっているので飛行中でもBeacon信号が受信できそうです。乗り継ぎの多い渡航のときに荷物が同じ飛行機に載っていると判れば心強いですよね。




4.今後のアイデア

今回は入手が簡単なEstimoteのBeaconを使いましたが、今後オリジナル機能としてピックアップした瞬間にチャイムが鳴ったり、持ち主以外の人が開けたら通知される機能を持ったBeaconを作ったら面白いかもしれません。
またiBeaconは同時に多数のビーコンを検出できますので、複数の荷物を同時トラッキングし荷物が1つでもはぐれたら警告されるようなアイデアもありだと思います。

まとめ

簡単なアイデア一つで海外渡航の不安が一つ減れば、旅行はもっと楽しくなると思います。
ぜひ皆さんもお試しください。


ブランド戦略部 - Johannes Lundberg , 中村和貴
140 180 Bluetooth , iBeacon , iOS , iPhone便利グッズ

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...