2013年12月15日日曜日

【iBeacon】部屋に帰ると「おかえり」って言ってくれるiPhoneアプリを作る【iMac→iPhone】

iBeacon Advent Calendar 2013 - Qiita [キータ]の16日目を書きます。

iMacとiPhoneをいじって、iBeaconを使って部屋帰ったらにおかえりと言ってくれるアプリを作りました。
クリスマスまであと10日もないのに、彼女もいないのに、仕事もあるのに、大学院の研究もしなきゃ行けないのに何してんだろう。。。という気持ちを殺しiMacでなにか作りたくてやりました。

日曜日まるまる使いました。


*やったことと結論

・吉高由里子さんの声でやりたかったけど音源が見つからなかった
・旧世代のiMacをペリフェラル(送信側)、
 iPhone5sをセントラル(受信側)として実験して成功した
・旧世代iMacはBLEが使えないのでBluetooth ドングルを買った 
 

とりあえず、部屋にあるiMacに近づくとと「お帰り」と言われます。
音源が見つからなかったのでニコニコモンズさんからクリエイティブ・コモンズの音源を取ってきました。
ついでに部屋から出ると「いってらっしゃい」も言ってくれるようにしました

*技術紹介

1, iMacでBLE(Bluetooth 4.0)

iMacってBluetooth使えるし、BLEも大丈夫でしょう?いけるでしょう?と考えてたんですが甘かったです。2011年以降発売のものじゃないと無理っぽいです。Bluetooth4.0が対応したのがそこらへんからなので
なので以下のようなBluetooth ドングルを買いました。



OS X対応してていい感じのがこれしかなかったので選びました。
ヨドバシで1700円くらいだったけど、秋葉なら800円くらいな気がする。

またこちらを参考にして外付けのBluetooth ドングルを優先して認識するようにしました。
MacでのBluetoothホストコントロールデバイスの優先順位の変更 - unknownplace.org

 
$ sudo nvram bluetoothHostControllerSwitchBehavior="always"

ビヘイビァの指定するパラメータはリンクを参考にしてください。

これで外部のBluetoothドングルが使えます。
あとこの方法を使うとiPhoneシミュレータでもiBeaconの検証が出来ます
【すいません】
http://www.doubleencore.com/2013/09/whats-new-in-bluetooth-le-ios-7/
これによるとiOS6までらしいです、iOS7以降は実機でやってね♫って公式だったそうで。勉強不足でした。。。

iOS シミュレータで Bluetooth 通信のテストをする方法 - 強火で進め







2, iMacでiBeacon

BeaconOSX
MacをiBeaconにする ステータスバー常駐アプリXBeaconを作ってみた
Mavericks as an iBeacon
BLE - MacOS-X / iOS
を参考にさせて頂きました。

BeaconOSXに関してはBSDライセンスです。

今回はOSX applicationということでやったことなくて迷いまくったんですが、
Beacon周りのロジックは大体一緒でした。

大事な部分のメソッドはこんな感じ。

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {
    
    [self BLEchecker:peripheral];
    if (peripheral.state == CBPeripheralManagerStatePoweredOn) {

        NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDString:[self.uuidTextField stringValue]];
        
        BLCBeaconAdvertisementData *beaconData = [[BLCBeaconAdvertisementData alloc] initWithProximityUUID:proximityUUID
major:self.majorValueTextField.integerValue                              minor:self.minorValueTextField.integerValue
measuredPower:self.measuredPowerTextField.integerValue];
    
        [_manager startAdvertising:beaconData.beaconAdvertisement];
    }
}


-(void)BLEchecker:(CBPeripheralManager *)peripheral{
    switch (peripheral.state) {
        case CBPeripheralManagerStateResetting:
            NSLog(@"CBPeripheralManagerStateResetting");
            break;
        case CBPeripheralManagerStateUnsupported:
            NSLog(@"CBPeripheralManagerStateUnsupported");
            break;
        case CBPeripheralManagerStateUnauthorized:
            NSLog(@"CBPeripheralManagerStateUnauthorized");
            break;
        case CBPeripheralManagerStatePoweredOff:
            NSLog(@"CBPeripheralManagerStatePoweredOff");
            break;
        case CBPeripheralManagerStatePoweredOn:
            NSLog(@"CBPeripheralManagerStatePoweredOn");
            break;
            
        default:
            break;
    }
}

peripheralManagerDidUpdateStateが使われるなど大体一緒でした。
最初 peripheral.state の値がずっとCBPeripheralManagerStatePoweredOffだったけどこれはBluetoothドングルが認識されてなくて、搭載されているiMac自体のBluetoothは4.0になってるからデバイスの電源がついてないとみなされてなかったらしい。

その時はターミナルからbluetoothHostControllerSwitchBehaviorのパラメータを確認してみてください。

あと少し違うところはIOBluetooth.frameworkを使っているところ。ここにPeripheralManagerなどが入っている。
iOSならCoreBluetoothなところだが、OSXではもうちょい色んなとこ出来る事からより多機能にBLuetooth扱えるこのフレームワークがある。

ただiMacを受信側にしようとした時、CLRegionStateがOSXのほうだとCoreLocation.frameworkに入ってなくてどうやるのかなーって思った。


3, 受信側(iPhone5s OS 7.0)


これに関してはiBeacon触った人なら100%みれるんじゃないかっていう

iBeacon Tips: 正しいビーコン監視方法 | ブライテクノBlog






こちらを参考にさせていただきました。

ロジック的にはCLBeaconのproximityがNearになった時にAVFoundation.Frameworkを使い、AVAudioPlayerで「おかえり」と言わせる。今度はエリア外に出た時に同じように「いってらっしゃい」と言ってもらう。

ニコニ・コモンズで探したら使える音源が「マスター、お帰りなさい」「マスター、いってらっしゃい」という頭にマスターとついてるのしかなかった。
意図せずマスターになってしまったがそれも仕方の無い事だと思いあきらめました。


*まとめ


Bluetooth ドングルの存在に気づかず半日くらい消化してしまったorz
iMacからBeacon使うのにも同じ事考えてた人がいたらしく、結構簡単にできました。
技術的には難しい事は一切してないですがこんな簡単に作れて
「作業で使うiMacに近づいた人にアクションをおこす」って結構面白い事色々出来ると思うんですがいかがでしょう?

また今回せっかくBluetooth発信のドングルを買ったのでRasberry Piでも買ってもっとハードよりな事させたいと思います。(もうやってる人がけっこういた→How to Make an iBeacon Out of a Raspberry Pi



https://github.com/jumbo-in-Jap/iBeacon-Okaeri-ittekimasu


Tech Tech walker: ヤフー株式会社 vs クラスメソッド「iOS 炎の7番勝負」で話してきました





Tech Tech walker: 【ios】cocoapodで顔認識でエラー【background_segm.hpp 'list' file not found】





Tech Tech walker: iOSエンジニアがiBeaconアプリを開発してみて将来に思う事





こんな記事も書きました!!

0 件のコメント:

コメントを投稿

ShareThis