プログラマでありたい

おっさんになっても、プログラマでありつづけたい

アプリ側からSORACOMのSIMの回線速度の操作

 SORACOM使って色々やりたいと妄想しております。本命はIoTですが、スマホを使って手軽に出来ることから試していきましょう。その中の1つが、スマホアプリのSlow Testです。

何故、スマホアプリのスローテストが必要なのか?



 何故スマホアプリのスローテストが必要になのでしょうか?スマホアプリは様々な環境で利用されます。当然ながら、通信事情が悪くてレスポンスが遅い場合もあります。その辺りを考慮してUXを作りこまないと、利用者からのイライラはつのります。しかし、このレスポンスを遅く返すというのは中々むずかしいです。以前、API Gateway+LambdaでSleepをいれてレスポンスするとかを紹介したことがあります。これでだいぶ簡単にできるようになりましたが、APIのスタブを作らないといけないなど面倒くさいといえば面倒くさいです。ここにSORACOM使えば、実際に回線速度が変えられるので手軽ですよね。ということで試してみましょう。

SORACOMの管理者画面から変更する



 まず管理者画面で変更してみましょう。ログインして、対象のSIMの速度クラスを変更します。
f:id:dkfj:20151205050733p:plain

 一瞬で出来ますが、ネタとしては面白くないです。

APIを使って変更する



 AWSの遺伝子をひくSORACOMは、プログラマブルに操作ができるようにAPIが用意されています。嬉しいですね。それでは、さっそく試してみましょう。最初は、SORACOMのAPIリファレンスから操作してみましょう。APIリファレンスは、Swaggerで作られていて実際のAPIリクエストを簡単に投げられるようになっています。

まずは、ID,Passwordによる認証をします。
API リファレンス | SORACOM Developers
f:id:dkfj:20151205051051p:plain

API KeyとTokenが発行されます。この時点では必要ないですが、後で利用するのでどこかにコピっておきましょう。

 速度クラスの変更は、update_subscriber_speed_classを利用します。引き渡すパラメータとしては、imsi(SIMの一意の識別子)とspeed_classです。imsiは、管理画面の一覧等から取得できます。speed_classは、現在はs1.minimum,s1.slow,s1.standard,s1.fastの4種類です。
f:id:dkfj:20151205051452p:plain

リクエストを投げると簡単に変更できましたね。でも、スマホのテストするのにわざわざブラウザから変更するんかいと思いますよね

APIを呼び出すスマホアプリを作ってみる iOS編



 ということで、スマホアプリからAPIを呼んで回線速度を変更してみましょう。いろいろな所からマサカリが飛んできそうですが、肝の部分は下記のようなコードになっています。JSONファイル作って、NSURLRequestで同期呼び出ししているだけです。imsiとspeedClassを引数にし、認証の為のAPI KeyとTokenはハードコーディングしています。ごめんなさい

※2015/12/05 21:05追記 認証の部分は、メタデータサービスを利用することにより省略できます。SIMの情報により認証をスキップできるとのことです。
SORACOM Air メタデータサービスのご紹介 - SORACOM Blog
Getting Started | SORACOM Developers

- (void)updateSpeedClass:(NSString *)imsi speedClass:(NSString *)speedClass {
    NSString *jsonPostBody = [NSString stringWithFormat:@"{\"speedClass\": \"%@\"}",speedClass];
    NSData *postData = [jsonPostBody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSString* postDataLengthString = [[NSString alloc] initWithFormat:@"%lu", (unsigned long)[postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    NSString *url = [NSString stringWithFormat:@"https://api.soracom.io/v1/subscribers/%@/update_speed_class",imsi];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request addValue:API_KEY forHTTPHeaderField:@"X-Soracom-API-Key"];
    [request addValue:TOKEN forHTTPHeaderField:@"X-Soracom-Token"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:postDataLengthString forHTTPHeaderField:@"Content-Length"];
    NSError *error;
    NSURLResponse *response;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"responseText = %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}

 ちなみにismiについては、スマホのSIM情報を取得して自動でセットしようと思ったのですがiOSではできません。Androidだと出来るようです。

 あとは、UISegmentControlとかを使って切り替えればよいと思います。
f:id:dkfj:20151205052047j:plain

 他にも通信量の取得等も簡単に出来たので、利用量のグラフ化とかも作ると面白いですよね。また、前述の通りAndroidはismiの取得が出来るので、SIMを挿した後にスマホの名前を送信して登録とかもできますね。