blog

Tessel で遊ぶ シリーズTesselで遊ぶ:Wi-Fiにつないでみる

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    前回のTesselで遊ぶ:気候モジュールのサンプルコードを動かしてみるでTesselのモジュールについてチュートリアルを試しました。今回はチュートリアルの続きでWi-Fi接続を試してみます。

    Wi-Fi接続

    Tesselは、無線LANの802.11bおよびgのチャンネルのうち、1番から11番までのみに接続することができます。内蔵する無線LANチップは、802.11nや、チャンネルの12番から14番では動作しません。接続しようとしているルータが、802.11bまたはgに対応していて、チャンネルの1番から11番のいずれかを使用していることを確認してください。

    TesselのWi-Fiにはけっこう制約があり、接続に手間取る可能性があります。ポイントはこの5つ。

    • 無線LANの802.11bおよびgのチャンネルのうち、1番から11番までのみに接続できる
    • Tessel側のWi-Fiモジュールが弱く、チャネルが混んでいると接続できない可能性が高い
    • TesselはWEP, WPA,に加えWPA2の暗号化方式に対応している
    • 暗号化方式は種類も多く、Tesselが対応している暗号化方式と無線LANルーターの暗号化方式を正しく合わせる必要がある
    • 無線LANルーター側の機能により接続できない可能性がある(設定変更でオフにする等が必要)

    まずは使っている無線LANルーターの管理画面に接続し、802.11b/gに対応していることを確認しましょう。それからチャネルの設定を1番から11番までに合わせます。次に、暗号化方式を確認しどの暗号化方式(WEP, WPA, WPA2)で接続するか決めましょう。無線LANルーターにTKIPとAESという2つの方式がある場合、これはWPAかWPA2になります。WPA2という明記がない場合はWPAのことだと思って良いでしょう。詳しくはこちら電気設備の知識と技術:無線LANとはをどうぞ。

    接続を試す

    とりあえず接続を試してみましょう。Tesselメインボードを接続し以下のコマンドを実行します。ネットワーク名はSSID、パスワードには暗号化キー、セキュリティタイプはWEP, WPA, WPA2のいずれかを指定します。-s [セキュリティタイプ*]を設定しない場合、WPA2が自動で設定されます。パスワードなしの場合unsecuredを指定します。

    $ tessel wifi -n [ネットワーク名] -p [パスワード] -s [セキュリティタイプ*]
    

    接続に成功すると以下のようなログが流れます。接続するまでに何度か接続に失敗しタイムアウトとなることがあるので、4,5回までは待ってみましょう。接続を試している段階ではTesselメインボードのオレンジ色のLEDが点滅します。接続が確立できるとオレンジ色のLEDは点滅が止まります。

    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Connecting to "xxxxxxxxxxxxxxxxxxx" with wpa security...
    INFO Acquiring IP address.
    ................... timeout.
    INFO Retrying...
    INFO Acquiring IP address.
    
    .........
    INFO Connected!
    
    IP   192.168.11.7
    DNS  192.168.11.1
    DHCP     192.168.11.1
    Gateway  192.168.11.1
    INFO Connected!
    

    逆に失敗するとタイムアウトのログが流れ続けます。

    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Connecting to "xxxxxxxxxxxxx" with wpa security...
    INFO Acquiring IP address.
    ................... timeout.
    

    エラーにより全く接続できない場合、LEDは赤色に変わります。

    Wi-FI接続がうまくいかない

    失敗する理由は色々あるようですが私の場合はWEPでは接続できませんでした。まずはどのような設定でWi-Fiが飛んでいるのかツールを使って確認すると早く解決できるかもしれません。おすすめなのがWiFi Explorer - Adrian Granados(Mac)です。少々お高いですが機能は申し分なしでチャネルの混み具合やWi-Fiの強度、暗号化方式など簡単に確認することができます。集合住宅の場合、どうしてもWi-Fiが増えるので今回に限らず使う機会はあると思います。

    Wi-Fi Explorer

    このツールを使って以下の項目をチェックします。

    • チャネルの混み具合:空いているチャネルに変更する
    • 802.11b/gに対応しているか
    • Wi-Fiの強度は十分か
    • 暗号化方式が適切か
    • SSIDが合っているか(手入力だとミスの可能性が高い)

    それでも繋がらない場合、無線LANルーターの機能によるものの可能性が高いです。無線LANルーターの管理画面から無線LANルーターが独自に提供している機能をオン/オフしてみてください。以下の記事も読んでみると参考になる部分があるかもしれません。

    それでも接続できない

    Wi-Fiルーターの故障か、古すぎるとか…新しい無線LANルーターを購入するのも良いかもしれません。私も接続できないときに代替えのルーターを探していてこの2つは良いかなと思います。

    • {{ “B0088UGF0S” | amazon_product:‘BUFFALO Giga 11n/a&11n/g AOSS2対応 無線LAN親機 【Wii U動作確認済み、iPhone5・Android端末対応】 WZR-600DHP’ }}
    • {{ “B00GJIEYBI” | amazon_product:‘ASUS 11ac/n/a/b/g 1300+600Mbpsハイパワー無線LANルーター【iPhone6/Android/PSV/3DS対応】 RT-AC68U (100GBクラウドストレージ1年間無料/QoS機能)’ }}

    ルーターが駄目だけど手っ取り早く試したい

    そんなときはiPhoneのテザリングが使えます。テザリングはWPA2のようなのでオプションなしで接続できました。サンプルを試すぐらいならこれでも十分でしょう。

    tessel wifi -n NukosのiPhone -p xxxxxxx
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Connecting to "NukosのiPhone" with wpa2 security...
    INFO Acquiring IP address.
    ................... timeout.
    INFO Retrying...
    INFO Acquiring IP address.
    .........
    .INFO Connected!
    
    IP   172.20.10.5
    DNS  172.20.10.1
    DHCP     172.20.10.1
    Gateway  172.20.10.1
    

    接続を解除する

    接続を解除するには以下のコマンドを使います。

    $ tessel wifi -d
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    Erasing saved wifi profiles
    Erased wifi profiles
    

    これで、Wi-Fiに接続し、解除することができました。

    サンプルを動かす

    チュートリアルにある通りwifi.jsというファイルを作りサンプルコードを保存します。このサンプルコートではhttpstat.usというサイトにリクエストを送りレスポンスのステータスコードをログに流します。

    var http = require('http');
    
    var statusCode = 200;
    var count = 1;
    
    setImmediate(function start () {
      console.log('http request #' + (count++))
      http.get("http://httpstat.us/" + statusCode, function (res) {
        console.log('# statusCode', res.statusCode)
    
        var bufs = [];
        res.on('data', function (data) {
          bufs.push(new Buffer(data));
          console.log('# received', new Buffer(data).toString());
        })
        res.on('end', function () {
          console.log('done.');
          setImmediate(start);
        })
      }).on('error', function (e) {
        console.log('not ok -', e.message, 'error event')
        setImmediate(start);
      });
    });
    

    実行する

    Wi-Fi接続が確立されている状態でプログラムを実行してみます。以下のようにログが流れればWebサイトへのアクセスが成功しています。

    $ tessel run wifi.js
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Bundling directory /Users/nukos/Projects/start.tessel
    INFO Deploying bundle (40.00 KB)...
    INFO Running script...
    http request #1
    # statusCode 200
    # received 200 OK
    done.
    

    Wi-Fi未接続の場合

    Wi-Fiに接続していない状態でサンプルを実行するとこのようになります。

    $ tessel run wifi.js
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Bundling directory /Users/nukos/Projects/start.tessel
    INFO Deploying bundle (40.00 KB)...
    INFO Running script...
    http request #1
    not ok - ENETUNREACH: Wifi is not connected. error event
    

    プログラムからWi-Fi接続を行う

    ファームウェアにビルトインされているnpmモジュールを使ってJavaScriptからWi-Fi接続を行うこともできます。チュートリアルのサンプルコードを使って試してみます。var network = '#####';, var pass = '#####';, var security = 'wpa2';の3つを自身の環境に合わせて変更します。あと1つ、チュートリアルのコードは関数の実行が行われていないので、このまま$ tessel runしても何も起こりません。以下のコードの通り、最後の行にconnect();を追加して接続を実行するようにします。

    /* wifi-cc3000というライブラリをrequireしていますが、
     * このライブラリはTesselのファームウェアに組み込まれているので、
     * npm installする必要はありません。
     * これは、require('tessel')でも同様です。
     */ 
    var wifi = require('wifi-cc3000');
    var network = '#####'; // ネットワーク名を入れてください。
    var pass = '#####'; // パスワードを入れてください。パスワード無しの場合は、カラ文字列にしてください。
    var security = 'wpa2'; // 他に「wep」「wpa」「unsecured」が指定できます。パスワード無しの場合は「unsecured」を指定してください。
    var timeouts = 0;
    
    function connect(){
      wifi.connect({
        security: security
        , ssid: network
        , password: pass
        , timeout: 30 // in seconds
      });
    }
    
    wifi.on('connect', function(data){
      // 無線LANに接続された
      console.log("connect emitted", data);
    });
    
    wifi.on('disconnect', function(data){
      // 切断された。必要ならばもういちどconnect()を呼んでください。
      console.log("disconnect emitted", data);
    })
    
    wifi.on('timeout', function(err){
      // 接続しようとしたが、接続できなかった。リトライする。
      console.log("timeout emitted");
      timeouts++;
      if (timeouts > 2) {
        // 何度もタイムアウトしたので、無線LANチップをリセットする。
        powerCycle();
      } else {
        // 接続しなおす。
        connect();
      }
    });
    
    wifi.on('error', function(err){
      // 以下のいずれかが起きた。
      // 1. 接続されていないのに、切断しようとした。
      // 2. 接続しようとしている最中に、切断しようとした。
      // 3. タイムアウトまたは切断されていないのに、接続しようとした。
      console.log("error emitted", err);
    });
    
    // プログラムから、無線LANチップをリセットする。
    function powerCycle(){
      // 無線LANチップをリセットすると、最後に保存されたネットワークに
      // 自動的に再接続する。
      wifi.reset(function(){
        timeouts = 0; // タイムアウト回数をゼロに戻す。
        console.log("done power cycling");
        // 自動的に再接続するのを待つ。
        setTimeout(function(){
          if (!wifi.isConnected()) {
            // 接続する。
            connect();
          }
          }, 20 *1000); // 20秒待つ
      })
    }
    
    //実行
    connect();
    

    実際に走らせてみると以下のようにログが流れます。接続が切れると再接続してくれるようになっています。

    $ tessel run wifi-control.js
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Bundling directory /Users/ryuichi/Projects/start.tessel
    INFO Deploying bundle (42.50 KB)...
    INFO Running script...
    connect emitted {
     dns : 192.168.11.1,
     ip : 192.168.11.7,
     event : status,
     connected : 1,
     dhcp : 192.168.11.1,
     ssid : xxxxxxxxxxxxxxxxxx,
     gateway : 192.168.11.1
    }
    timeout emitted
    disconnect emitted
    connect emitted {
     dns : 192.168.11.1,
     ip : 192.168.11.7,
     event : status,
     connected : 1,
     dhcp : 192.168.11.1,
     ssid : xxxxxxxxxxxxxxxxxx,
     gateway : 192.168.11.1
    }
    

    詳しい解説はこちら。

    Wi-Fiに関するその他のコマンド

    Wi-Fi関連のコマンドをいくつか紹介しておきます。オプションのヘルプがこちら。

    $ tessel wifi [options]
    
    Options:
       -l, --list         [Tessel] List available wifi networks.
       -n, --network      [Tessel] The network to connect to.
       -p, --password     [Tessel] Password of the network. Omit for unsecured networks.
       --password-hex     [Tessel] Password of the network in hex.
       -s, --security     [Tessel] Security type of the network, one of (wpa2|wpa|wep). Omit for unsecured networks.  [wpa2]
       -t, --timeout      [Tessel] Sets timeout before retrying connection to network.  [20]
       -d, --disconnect   [Tessel] erases stored wifi configurations on Tessel
       -h, --help         [Tessel] Show usage for tessel wifi
       -m, --mac          [Tessel] Show the MAC Address of the WiFi chip
    

    受け取れるWi-Fiのリストを表示

    $ tessel wifi --list
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    INFO Requesting wifi status...
    Currently visible networks (6):
        1DA25600112BBC3D49AE99250F283A26 (73/127)
        1DA25600112BBC3D49AE99250F283A26 (72/127)
        1DA25600112BBC3D49AE99250F283A26 (72/127)
        1DA25600112BBC3D49AE99250F283A26 (72/127)
        1DA25600112BBC3D49AE99250F283A26 (72/127)
        1DA25600112BBC3D49AE99250F283A26 (72/127)
    INFO Connected: 0
    

    wifiのプロファイルを消す(接続を解除する)

    $ tessel wifi --disconnect
    TESSEL! Connected to TM-00-04-f000da30-00714741-323565c2.
    Erasing saved wifi profiles
    Erased wifi profiles
    

    タイムアウト時間を指定する

    $ tessel wifi -n [network name] -p [password] -s [security type*] -t 20
    

    チュートリアルを試してWi-Fi接続に関する注意事項を覚えることができました。知らないとはまりやすそうなところが多いですね。今回はここまで。次回はツイートのチュートリアルを飛ばして「コマンド」について進めていきたいと思います。

    次回:Tesselで遊ぶ:主なコマンドとスクリプトをフラッシュメモリへ書き込む

    参考

    シリーズ

    1. Tesselで遊ぶ:HELLO, (PHYSICAL) WORLD!
    2. Tesselで遊ぶ:気候モジュールのサンプルコードを動かしてみる
    3. Tesselで遊ぶ:Wi-Fiにつないでみる
    4. Tesselで遊ぶ:主なコマンドとスクリプトをフラッシュメモリへ書き込む
    5. Tesselで遊ぶ:Tesselからツイートできなかった話

    コメント・フィードバック