SSIDとパスワードの変更

最終更新: 2013/7

このチュートリアルではSSIDとパスワードの変更方法について学びます。
現在のSSIDとパスワードを、任意のSSIDとパスワードに変更できるアプリケーションを作成します。
登録に使用するCGIは config.cgiSSIDの設定ネットワークセキュリティキーの設定 です。
現在のSSIDとパスワードの表示も行いますので、こちらは command.cgiSSIDの取得ネットワークパスワードの取得 を使用して取得します。

それではさっそく作ってみましょう。

画面レイアウトの作成

今回作成するアプリケーションの画面レイアウトです。

(画面構成)

Get がタップされると、labelSSID に現在のSSID、labelPassword に現在のパスワードを表示します。
Set がタップされると、登録画面の View Controller に遷移します。
入力画面では、Done がタップされると、SSID、パスワードを登録します。

注意: MASTERCODEは、FlashAirの新しいSSIDやパスワードを設定する際に使用します。
MASTERCODEを確認するには、PCなどにFlashAirを挿入し、"/SD_WLAN/" フォルダに保存されているCONFIGファイルを、お手持ちのテキストエディタなどで開きます(FlashAirの初期設定を終えていない場合は確認ができませんので、先に済ませるようにしてください)。
また、このフォルダは隠しフォルダとなっていますので、隠しフォルダを扱う事が出来るツールを使いましょう。

以下の部品を配置します。

表示画面

  • UIButton( UIButton)
    • Get : SSID、パスワードを取得
    • Set : SSID、パスワード登録画面を表示
  • Label ( UILabel)
    • labelSSID : 現在のSSIDを表示
    • labelPassword : 現在のパスワードを表示

登録画面

  • UIButton( UIButton)
    • Done : SSID、パスワードを登録
  • Text View( UITextField)
    • textMASTERCODE : 現在のMASTERCODEを入力
    • textSSID : 登録するSSIDを入力
    • textPassword1 : 登録するパスワードを入力
    • textPassword2 : 登録するパスワードを入力
  • View Controller( UIViewController)
  • Scroll View( UIScrollView)
    • キーボード表示時に入力欄を閲覧するために使用

その他

  • Navigation Controller( UINavigationController)
    • 登録画面から表示画面へ戻るために使用

このように表示される画面を作ります。

(起動時確認画面)

Set がタップされた場合に表示する画面です。
サブクラスを用意します。

  • FSSetViewController
(起動時入力画面)

コードの作成

SSIDとパスワードの取得

SSIDとパスワードの取得は、 command.cgiop=104op=105 をそれぞれ与えることで実現します。
CGIの実行には、 NSString stringWithContentsOfURL を使用しています。 この関数は、指定されたエンコーディングの文字列(ここではUTF-8)と、発生した例外を返します。

Get がタップされた際の動作です。
現在のSSIDとパスワードを取得し設定しています。

FSViewController.h

@interface FSViewController : UIViewController
- (IBAction)buttonGetPush:(id)sender;
@property (strong, nonatomic) IBOutlet UILabel *labelSSID;
@property (strong, nonatomic) IBOutlet UILabel *labelPassword;
@end

FSViewController.m

- (IBAction)buttonGetPush:(id)sender {

    NSError *error = nil;
    // Get SSID
    // Make url
    NSURL *url104 = [NSURL URLWithString:@"http://flashair/command.cgi?op=104"];
    // Run cgi
    NSString *SSIDStr = [NSString stringWithContentsOfURL:url104 
                                                encoding:NSUTF8StringEncoding error:&error];
    if ([error.domain isEqualToString:NSCocoaErrorDomain]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                 message:@"op=104 Failed \n check access point" delegate:nil
                                         cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
        NSLog(@"error104 %@\n",error);
        return;
    }

    // Get Password
    // Make url
    NSURL *url105 = [NSURL URLWithString:@"http://flashair/command.cgi?op=105"];
    // Run cgi
    NSString *passwordStr = [NSString stringWithContentsOfURL:url105 
                                                encoding:NSUTF8StringEncoding error:&error];
    if ([error.domain isEqualToString:NSCocoaErrorDomain]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                message:@"op=105 Failed \n check access point" delegate:nil
                                          cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
        NSLog(@"error105 %@\n",error);
        return;
    }
    self.labelSSID.text = SSIDStr;
    self.labelPassword.text = passwordStr;

}
  • 6行目
    SSIDの取得に使用するURLです。
    op=104 を設定します。
  • 8-9行目
    CGIが実行されます。
    返される文字のエンコードは、ここでは UTF-8 を使用します。
    encoding:NSUTF8StringEncoding を指定しています。
  • 21行目
    パスワードの取得に使用するURLです。
    op=105 を設定します。
  • 23-24行目
    CGIが実行されます。
    返される文字のエンコードは、ここでは UTF-8 を使用します。
    encoding:NSUTF8StringEncoding を指定しています。
  • 33-34行目
    返された文字列(SSID、パスワード)を、Label に設定しています。

SSIDとパスワードの登録

SSIDとパスワードの登録は、 config.cgiにて パラメータ MASTERCODEAPPSSIDAPPNETWORKKEY を指定することで実現します。
CGIの実行には、 NSString stringWithContentsOfURL を使用しています。 この関数は、指定されたエンコーディングの文字列(ここではUTF-8)と、発生した例外を返します。

Done がタップされた際の動作です。
入力値のチェックを行った後、SSIDとパスワードを登録しています。

FSSetViewController.h

@interface FSSetViewController : UIViewController
@property (strong, nonatomic) IBOutlet UITextField *textMASTERCODE;
@property (strong, nonatomic) IBOutlet UITextField *textSSID;
@property (strong, nonatomic) IBOutlet UITextField *textPassword1;
@property (strong, nonatomic) IBOutlet UITextField *textPassword2;
- (IBAction)buttonDonePush:(id)sender;
@end

FSSetViewController.m

- (IBAction)buttonDonePush:(id)sender {

    NSError *error = nil;
    // Check
    NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];    
    // MASTERCODE
    NSString *mastercodeText = [self.textMASTERCODE.text 
                                                stringByTrimmingCharactersInSet:charSet];
    if ([mastercodeText isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                                message:@"Enter MASTERCODE" delegate:nil
                                      cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
        return;
    }
    // SSID
    NSString *ssidText = [self.textSSID.text stringByTrimmingCharactersInSet:charSet];
    if ([ssidText isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                                message:@"Enter SSID" delegate:nil
                                      cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
        return;
    }
    // password
    NSString *password1Text = [self.textPassword1.text 
                                                stringByTrimmingCharactersInSet:charSet];
    NSString *password2Text = [self.textPassword2.text 
                                                stringByTrimmingCharactersInSet:charSet];
    if ([password1Text isEqualToString:@""] || [password2Text isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                                message:@"Enter password" delegate:nil
                                      cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
        return;
    }else if(![password1Text isEqualToString:password2Text]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                                message:@"Password mismatch!" delegate:nil
                                      cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
        return;
    }

    // Set SSID and password
    // Make url
    NSString *urlStr = [@"http://flashair/config.cgi?MASTERCODE=" 
                                                    stringByAppendingString:mastercodeText];
    urlStr = [urlStr stringByAppendingString:@"&APPNETWORKKEY="];
    urlStr = [urlStr stringByAppendingString:password1Text];
    urlStr = [urlStr stringByAppendingString:@"&APPSSID="];
    urlStr = [urlStr stringByAppendingString:ssidText];
    NSURL *url = [NSURL URLWithString:urlStr];
    // Run cgi
    NSString *rtnStr =[NSString stringWithContentsOfURL:url 
                                                encoding:NSUTF8StringEncoding error:&error];
    if ([error.domain isEqualToString:NSCocoaErrorDomain]){
        NSLog(@"config.cgi %@\n",error);
        return;
    }else{
        if([rtnStr isEqualToString:@"ERROR"]){
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title
                                  message:@"config.cgi failed" delegate:nil
                                  cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert show];
            return;
        }
    }

    // Close this View
    [self.navigationController popToRootViewControllerAnimated:YES];

}

-(BOOL)textFieldShouldReturn:(UITextField*)textField{
    [textField resignFirstResponder];
    return YES;
}
  • 5-42行目
    チェック処理です。
    未入力チェック、パスワードの不一致チェックを行っています。
  • 46-52行目
    使用するURLです。
    config.cgi?MASTERCODE=(入力値)&APPNETWORKKEY=(入力値)&APPSSID=(入力値) を設定します。
  • 54-55行目
    CGIが実行されます。
    返される文字のエンコードは、ここでは UTF-8 を使用します。
    encoding:NSUTF8StringEncoding を指定しています。
  • 70行目
    登録が成功した場合に、最初の画面に戻ります。
  • 74-77行目
    キーボードの Done がタップされた際、キーボードが閉じるようにしています。

実行結果

プログラムが出来上がったら、確認をしてみましょう。
まずは Get をタップしてみます。

現在のSSIDとパスワードが表示されました。

(結果 取得)

次に、 Set をタップします。
ここで、前述したMASTERCODEの入力が必要になるので、FlashAirのCONFIGファイルを確認し、値を把握しておきます。

(MASTERCODE)

MASTERCODE、SSID、パスワードを入力します。
パスワードは同じもの2回入力してください。

注意: 入力したSSID、パスワードは必ず覚えておいてください。
Done をタップした後は、今までのSSID、パスワードは無効となり、FlashAirとの接続が切れます。
再度、接続をするためには、入力したSSID、パスワードが必要になります。

(結果 入力)

Done をタップします。
SSIDとパスワードが切り替わっているので、登録内容を確認する前に無線LANの接続先を、今回登録したSSIDに切り替えます。
Get をタップします。

新しく登録したSSIDとパスワードが表示されました。

(結果)

以上で、SSIDとパスワードの変更 に関する解説はおわりです。

サンプルコード

ios_tutorial_06.zip (25KB)

このサイトのサンプルコードは 二条項BSDライセンスで提供されています。