SSIDとパスワードの変更

このチュートリアルでは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ライセンスで提供されています。