Brainから見たPQI AirCardの扱い方

PQI AirCardの扱い方についていろいろ考えたので書いておきます。

※PQI AirCardについてよく知らない人はこちらのサイトに目を通しておいてください。


Brainでネット接続をするアプローチ


まずは、Brainから任意のコマンドを実行できるようにします。


アプローチ

0.予め「特定のファイル(stdinにしておきます)に書き込まれた内容を標準出力に垂れ流す」というプログラム(inタスクと呼ぶことにします)と、「標準入力に書き込まれた内容を特定のファイル(stdoutにしておきます)に垂れ流す」というプログラム(outタスクと呼ぶことにします)を作っておきます。
なお、outタスクは終了するとendという名前のファイルを作成するようにします.

1.AirCard側でタスクを一つ起動します。そのタスクはmicroSD上のファイル(cominという名前にしておきます)に何かが書き込まれるまで待機します。

2.Brain側で実行したいコマンドをcominに書き込みます。

3.AirCard側のタスクはcominに書き込まれたコマンドを読み込み、
「(inタスク) | (コマンド) | (outタスク)」
という形でパイプをつけてコマンドを実行します。
すると、microSD上のstdinファイルがコマンドの標準入力に、stdoutファイルがコマンドの標準出力になります。

4.Brain側でstdin,stdoutに対して必要な処理を行います。

5.実行したコマンドが終了したら、AirCard側のタスクは再度待機状態に入ります(つまり1に戻る)。


問題点

SDカードをを使う機器からmicroSDに書き込みを行うとAirCardのmicroSDのマウントが一瞬解除されてしまうらしいので(先程のサイトのコメント覧より)、inタスクはもしかするとうまく動かないかもしれません。

以降この文章で「コマンドを実行する」と表記した際には、特に記述がない限りこの機構を利用します。


では、ここからはBrainがネット接続する際のアプローチを説明します。





A.無線LANアクセスポイントに接続


アプローチ

1.「iwlist scan」コマンドを実行し、無線アクセスポイント一覧を取得、表示します。

2.ユーザーにアクセスポイントを選択してもらい、必要であればパスワードも入力してもらいます。

3.telnetコマンドを使って、AirCardの設定画面に先ほどのアクセスポイントの情報を送信し、設定します(POSTリクエストを生成、送信)。

4.画像を削除して接続を開始します。


問題点

接続が成功したかどうかを確認する方法が分からないため、接続に失敗してしまうと「接続したはずなのにできていない」という状態に陥ってしまいます。





B.データ通信を行う


私にはNDISドライバーを書く技術がないので、WinSockラッパーを作ることにします。

アプローチ

0.Brain側にWinSockのラッパ−、AirCard側に通信用のタスクを用意しておきます。

1.AirCard側で通信用のタスクを起動します。タスクは特定のファイル(funcinとしておきます)に何かが書き込まれるまで待機します。

2.Brain側のアプリケーションがWinSockラッパ−の関数を呼び出したら、ラッパ−はfuncinに実行された関数の名前を書きます。(ただ、実装する際は関数にあらかじめ番号を振っておいて、その番号を書き込むようにすると思います。)

3.さらに、ラッパーは引数に指定されたデータをfuncinに続けて書き込んでいきます。ポインタで指定されている引数はその実データを書き込みますが、関数に書き込んでもらうことを目的としているポインタはその実データを書き込まずにスキップします。
書き込みが終わったら、特定のファイル(funcoutとしておきます)にデータが書き込まれるまで待機します。

4.通信用のタスクはfuncinに書き込まれた関数に対応する関数を呼び出します。引数を持つ場合は書き込まれたデータを基に指定します。また、構造体などでWinSockと形式が違う場合は変換します。

5.戻り値とエラー値をfuncoutに書き込みます。また、constキーワードの無いポインタ引数が指定されていた場合は、実データをfuncoutに続けて書き込んでいきます。
書き込みが終わったら、funcinにデータが書き込まれるまで待機します。

6.WinSockラッパーはfuncoutに書き込まれた戻り値とエラー値をアプリケーションに返します。また、constキーワードの無いポインタ引数が指定されていた場合は、実データを適切に書き込んでおきます。

7.WinSockラッパーは関数が呼び出されるまで待機します。


問題点

関数の引数に可変長データを書き込むべきポインタ(unsigned char *buf など)があったときに、可変長データの最大の長さを指定しない関数だった場合にはデータの受け渡しができません。(ただ、おそらくそのような関数は無いでしょう。)

recv関数は連続的に何度も呼び出される関数なので、アプリケーションに呼び出されるたびに関数呼び出し処理を行っているとオーバーヘッドがあまりにも大きくなってしまいます。何らかの工夫が必要でしょう。
また、send関数も同様の工夫を施したほうがいいかもしれません。

microSDカードの読み書きを介してデータをやり取りするので、microSDカードの寿命が大幅に縮まってしまいます。まあ、これはどうしようも無いのですけれど。





以上、誤記やアドバイスなどあればお願いします。

(c) 2014 Grain