Tesselを無線LANに接続する


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

無線LANに接続するには、以下のコマンドを入力してください(カギカッコは、そのまま入力しないでください)。

tessel wifi -n [ネットワーク名] -p [パスワード] -s [セキュリティタイプ*]*セキュリティタイプの指定はオプションです。指定しない場合は「wpa2」とみなします。

Tesselの黄色いランプは、接続処理中は点滅し、接続されると点灯のままになります。Tesselは入力されたパスワードを記憶するので、Tesselを次に起動すると自動的にネットワークに接続します。

接続されているかどうかを調べるには、以下のコマンドを入力してください。

tessel wifi -l

無線LANのネットワークの一覧と、接続の状態が表示されます。

無線LANに接続しようとしたけれど接続できなかった場合には、赤いランプが点灯します。また、接続済みのネットワークが切断された場合にも、赤いランプが点灯します。

  • 黄色いランプが点灯 = 無線LANに接続されている
  • 赤いランプが点灯 = 無線LANに接続されていない

4個すべてのランプ(赤青緑黄)は、TesselのハードウェアAPIからアクセスすることができます。もしも、ユーザーが書き込んだプログラムが黄色または赤のランプを制御している場合は、無線LANの状態の表示としては信頼できません。

以下のプログラムは、無線LAN経由でウェブサイトの内容を取得する例です:

「wifi」という名前のディレクトリを作ってください。

mkdir wificd wifinpm init

以下の内容を、wifi.jsという名前のファイルに保存してください:

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);
  });
});

端末上で以下のコマンドを入力して、このプログラムをTesselの上で動かしてください:

tessel run wifi.js

Tesselがウェブサイトと通信するようすを、端末で観察してください。

無線LANをプログラムから制御することもできます。このAPIについての詳細な文書は、ここにあります。

以下の内容を、wifi-control.jsという名前のファイルに保存してください:

/* 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;

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秒待つ
  })
}

function connect(){
  wifi.connect({
  security: security
  , ssid: network
  , password: pass
  , timeout: 30 // in seconds
  });
}

if (!wifi.isConnected()) {
  connect();
}

エラーになった場合:黄色いランプが点灯していることを確認して下さい。もしも点灯していない場合は、無線LANに接続されていません。Tesselの電源をいったん切ってから入れなおし、tessel wifiというコマンドをもういちど実行してください。

これでも問題が解消しない場合は、無線LANについての掲示板で相談してください。

Fork on Github