iPhone と SORACOM Air のSIM を使って センサーアプリを動かしてみた

はじめに

iPhone は様々なセンサーデバイスを内蔵しています。この iPhone をセンサーデバイスとして活用し、SORACOM Air のSIM を使って、面白いことが出来ないか考えてみました。

ストーリー

今回実現するのは、周囲の音の大きさや明るさを検知し、その値を SORACOM Air のSIMを使ってデータ通信をし、ツイートするものです。

音の大きさや、光の強さが、大きく変化した場合、屋内であれば、人が活動しているとみなすことができます。

活用方法として、以下のストーリーが考えられます。

fe7d99e7ab07b13e471ebf26d8426d5a_s

  • 共働きの夫婦。子どもたちが家に帰ってきたか、直ぐ知りたい。
  • 一人暮らしの青年。前に一度空き巣に入られている。家が無事かを手軽に確認したい。
  • 高齢の親を持つ子供。起床しているか、家にいるかを確認したい。

こういった生活に密着したもの以外に、以下の活用方法もあると思います。

87cd218812a5f38195b7e1203a4838c0_s

  • 喫茶店の天井に設置。客数が多い時、少ない時が、音の大きさに寄って判別できる。証明がついているかによって、現在開店中かも推測可能。

こうしたセンサーを様々な喫茶店が配置すれば、以下の様な効果が期待できます。

  • 作業をしたいノマドワーカー。なるべくそこそこ静かな作業スペースを探している。一定以下の静かさの喫茶店を調べ、快適に作業。
  • 店舗側としては、客数の少ない時にもすぐに客が入るので、売上アップに繋がる。

方法

これらのストーリーの主人公たちのニーズに答えるアプリを、SORACOM Air のSIMと iPhone を使って実現してみます。

方法は、以下の通りです。

  • iPhoneに SORACOM Air のSIMを入れる
  • アプリの側では、音センサー・光センサーを使う
  • 特定のツイッターアカウントに向けて、定期的に現在の部屋の明るさ・音量を送信

SORACOM Air の SIM があれば、Wi-Fi の機器の設置や設定の必要なく、手軽に使うことが出来ます。

実現

以下の流れで進めます

  1. SORACOM のコンソール画面で通信プランを選択
  2. SORACOM Air のSIMを iPhone に入れる
  3. Xcode でコードを書く
  4. 実行する

1.SORACOMコンソール画面

SORACOM では通信速度毎にプランが用意されており、従量課金です。開通後はまったく通信しなければ1日あたり10円のみでしようできます。

スクリーンショット_2015-11-26_12_05_37

通信プランは、文字をツイートするだけなので、一番安い s1.minimum(上り・下り 32kbps) でOKです。 その他の通信プランについてはこちらをご参照下さい。

このプランの場合、上り通信については、1MB あたり0.2円となります。 1ツイート当たりの通信量を考えてみます。Twitter API にアクセスする際、メッセージ以外にも情報のやり取りは発生します。また、iPhone の場合、システムが外部と通信することがあるかと思います。そこは一旦忘れてメッセージのみの通信量で計算してみます。

すべて日本語で構成されるツイートの場合、140 × 2バイト = 280バイトとなります。

10分に1回ツイートする場合、24時間で144回ツイートされ、合計 40KB ほどになります。遠く課金には及ばないレベルかと思います。

仮に、この100倍の通信が行われたとしても、1日当たり4MB、0.8円で済むことになります。

最低限の通信で済み、月額料金もかなり低く抑えることが出来ることをおわかり頂けたのではないかと思います。

2.SORACOM Air のSIM をiPhoneに入れる

IMG_8024

SIM を入れる前に、あらかじめセットアップページからプロファイルをインストールしています。

IMG_0011

画面左上に docomo LTE の文字が確認できます。その後、ネットワークに繋ぎ、無事、通信が出来ることが確認できました。

スクリーンショット 2015-11-26 12.04.07

コンソール画面を見ると、通信量が増加している事を確認できます。

3.Xcode でコードを書く

今回はObjective-Cで書いています。ポイントとしては、以下の通りです。

明るさを取得

return [UIScreen mainScreen].brightness * 100;

音量レベルを取得

#import <AudioToolbox/AudioToolbox.h>
static void AudioInputCallback(
                               void* inUserData,
                               AudioQueueRef inAQ,
                               AudioQueueBufferRef inBuffer,
                               const AudioTimeStamp *inStartTime,
                               UInt32 inNumberPacketDescriptions,
                               const AudioStreamPacketDescription *inPacketDescs)
{
}
- (void)initSoundMeter
{
    AudioStreamBasicDescription dataFormat;
    dataFormat.mSampleRate = 11025.0f;
    dataFormat.mFormatID = kAudioFormatLinearPCM;
    dataFormat.mFormatFlags = kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
    dataFormat.mBytesPerPacket = 2;
    dataFormat.mBytesPerFrame = 2;
    dataFormat.mChannelsPerFrame = 1;
    dataFormat.mBitsPerChannel = 16;
    
    AudioQueueNewInput(&dataFormat, AudioInputCallback, (__bridge void *)(self), CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &_queue);
    AudioQueueStart(_queue, NULL);
    
    UInt32 enabledLevelMeter = true;
    AudioQueueSetProperty(_queue, kAudioQueueProperty_EnableLevelMetering, &enabledLevelMeter, sizeof(UInt32));
}

今回、音の大きさを取る処理の初期化処理は、上記の通りです。

UInt32 enabledLevelMeter = true;
    AudioQueueSetProperty(_queue, kAudioQueueProperty_EnableLevelMetering, &enabledLevelMeter, sizeof(UInt32));

の部分で、音量レベルの取得を有効にしています。

- (AudioQueueLevelMeterState)getLevelMeterState
{
    // レベルを取得
    AudioQueueLevelMeterState levelMeter;
    UInt32 levelMeterSize = sizeof(AudioQueueLevelMeterState);
    AudioQueueGetProperty(_queue, kAudioQueueProperty_CurrentLevelMeterDB, &levelMeter, &levelMeterSize);
    return levelMeter;
}

音量レベルの取得はコチラの処理で行います。AudioQueueLevelMeterState は構造体です。

[self getLevelMeterState].mPeakPower]

mPeakPower が音量を表しています。

AdventCalendar - iPhoneで取得・検知できる情報10連発!(サンプルアプリもあるよ) - Qiitaを参考にさせていただいております。

結果

IMG_8025

定期的に iPhone のセンサーを通して取得した音量と明るさのデータが、Twitterアカウントにつぶやかれているのが確認できます! 更に、一定以上の音量の差を検知した時には、あらかじめ指定したアカウントに向けてメンションが付くようになっており、部屋の中で物音がした時に、すぐにわかるようになっています。

考察

今回は、iPhone を使いました。しかし、常に充電しておかねばならないこと、iPhone は高価であることなどから、今回のような、センサー情報を呟き続けるといったひとつの目的に特化させることは、やや難しい側面があるかと思います。

今回は、iPhone を使いましたが、他の省電力センサーデバイスに置き換えることも出来ます。

その場合、たとえば Raspberry Pi といった IoT デバイスに、適当な OS をインストールし、ブレッドボードに音センサーと光センサーをつなぎ、3G デバイスを USB を使ってつなぐ、といったことが考えられます。あとは、センサーが動くようコーディングし、Twitter API を使って POST 出来るようにすれば、「センサー情報ツイート装置」の出来上がりです!

安価に装置を組み上げることができれば、複数の部屋に置くことも出来ます。さらにスケールをアップして、製品化を考えてみましょう。

より手軽に、安価に、と考えた時、SORACOM Air のSIM がプリセットされていればどうでしょう?何の設定もいりません。また、通常のMVNOなSIMとは異なり、従量課金なので、転送情報量の小さなIoTデバイスのおいては、とても安価にセンサーデバイスを活用できます。買って来て電源をいれれば直ぐ使える、そんな分かりやすい未来がすぐそこに来ています。

8b697a9aac2f22374c708c1c820510ed_s

まとめ

今回は、iPhone を センサーデバイスとして活用し、SORACOM Air のSIMを使って情報をツイートすることを実現しました。この方法は、単機能のセンサー情報ツイート装置にも応用出来ます。こうした装置があれば、家族間の見守りや防犯、そして静かな店を求めるノマドワーカー向けの情報提供などが手軽に実現できるかと思います。