WAVプレーヤアプリの製作(タブレット側)


【WAVプレーヤの概要】

完成した高音質WAVプレーヤの外観は下記のようになります。
1枚のボードだけで構成されたWAVプレーヤ本体とタブレットだけでできています。
WAVプレーヤ本体はdsPICマイコンで大部分構成されてしまいますので、外付けは
SDカードとオペアンプとWi-Fiモジュールだけです。
これでヘッドフォンを直接駆動できますし、ステレオアンプや、アクティブスピーカなどに
直接接続して聴くことができます。



【タブレットアプリの全体構成】
WAVプレーヤのアプリケーションの全体構成は、下図のようにしました。



Socketクラスを使って製作すると、Wi-Fi通信の部分はアプリケーションから
直接クラスのメソッドを呼び出すだけで簡単にできてしまいますので、
1本のメインプログラムだけで構成しています。

この他にリソースがあり画面を構成するレイアウトや表示する文字列などを設定
しています。
マニフェストには全体に関わる基本設定が記述されていて、ネットワークを使う許可
をするという重要な働きをしています。

アプリケーションの機能としてはボタンに対応させていますので、画面構成から
説明します。画面は下図のように、接続ボタンと終了ボタンとリスト表示部だけ
という非常に簡単な構成としました。機能はすべてボタンタップから開始されます。
それぞれの要素にフィールド名を付与して扱います。



ボタンと画面に対応する機能は下表のようにしました。
これらの機能はすべてアプリケーション本体で実行しています。
項 目 機能・仕様 備考
接続 IPアドレス欄に入力されたアドレスのリモートに接続する
接続状態を下側のメッセージ領域に下記のように表示する
「接続中→接続完了」 または
「接続中→接続失敗」
正常に接続されたらファイル一覧要求コマンドを送信する
さらにその応答を受信したらファイルリストをリストビューのTitileに表示する
ポート番号は2000の固定
アクセスポイントには接続済みの状態とする

失敗の場合はやり直し

一覧はスクロールできる
ファイル選択 表示されたファイルリストの任意の一つをタップして選択したら、そのファイル名を取得して選択コマンドを送信する WAVプレーヤ本体側で選択した曲を再生する
終了 終了コマンドを送信して、Wi-Fi接続を切離し、アプリを終了する

実際に表示したときの画面は下図のようになります。




曲名は8.3形式のファイル名で
表示される

上下にスクロールして選択可能

【ソケットクラスの使い方】

WAVプレーヤで作成するアプリケーションでは、Wi-Fi通信の部分をJavaのSocketクラス
とストリームクラスを使って作ります。
このSocketクラスとストリームクラスの使い方を説明します。
Socketクラスを使ったときのWi-Fi通信をする手順は次のようにします。

 @ ソケットのインスタンスを生成する
 A IPアドレスとポートを指定してソケットに相手リモートを接続する
 B ソケットの入力用ストリームと出力用ストリームを取得する
 C 取得したストリームを使ってデータ入出力ストリームを生成する
 D read/writeで送受信を実行する
 E 終了でクローズする

これらの手順を実行するために必要なメソッドは下表となります。
この表に記載されているメソッドは、このアプリ作成で使用したもののみとなっています。
実際にはさらに数多くのコンストラクタやメソッドが用意されています。

(1) Socketクラスのメソッド一覧
 名称 書式と使い方 
 Socket
コンストラクタ
Socket(IPアドレス, ポート番号)
 ソケットを生成し、指定アドレスのリモートの指定ポート番号に接続する
≪例≫
 Socket sock = new Socket(“192.168.1.10”, 2000); 
 ストリーム
関連メソッド
 
InputStream getInputStream()
 ソケットの入力ストリームを取得する
≪例≫
 InputStream instm = new getInputStream(); 
OutputStream getOutputStream()
 ソケットの出力ストリームを取得する
≪例≫
 OutputStream outstm = new getOutputStream(); 
メソッド  void close()
 ソケットを閉じる
 一度閉じたら再接続不可、再度新ソケットの生成が必要
≪例≫  close(); 
void connect(SocketAddress endpoint)
 ソケットをendpointで指定されたサーバに接続する 
≪例≫
sock.connect(new InetSocketAddress(“Hostname”,3000)); 

(2) データ入出力ストリームクラスのメソッド一覧
名称 書式と使い方 
データストリーム用
コンストラクタ
DataInputStream(InputStream inp)
 内部バッファを用意し入力ストリームinpを保存する
≪例≫
 DataInputStream in =
     new DataInputStream(sock.getInputStream());
DataOutputStream(OutputStream ot)
 出力バッファを用意し出力ストリームotを保存し出力する
≪例≫
 DataOutputStream out =
    new DataOutputStream(sock.getOutputStream()); 
 
 入力メソッド int read(byte buf)
 入力ストリームからバイトデータを読み込みバッファbufに格納する。読み込んだバイト数を戻り値とする。最大読み込みバイト数はバッファのサイズまで。入力できるまでブロックする
≪例≫
 count = in.read(byte Buffer); 
int available()
 入力ストリームから読み込むことができるバイト数を返す
≪例≫
 count = in.available(); 
 出力メソッド void writeByte(int b)
 データbの下位8ビットをバイトとして出力ストリームに書き込む
≪例≫
 out.writeByte(data); 
void writeBytes(String s)
 文字列sをバイト列として出力ストリームに書き込む
≪例≫
 out.writeBytes(“SC20E”); 



これらのメソッドを使って通信をするプログラムの実際の書き方を手順@からEに
したがって説明します。

(1) ソケットのインスタンスを生成し、ストリームを取得する
  この手順はリスト-1のようにします。
  最初にリモートホストのIPアドレスとポート番号を入手します。
  この例ではIPアドレスをテキストボックスに入力された値を文字列に変換して
  取得しています。ポート番号は定数としています。
  このIPアドレスとポート番号で相手を指定してSocketコンストラクタを呼び出して
  ソケットを生成しています。
  これだけで@とAを実行したことになり、リモートに接続されたソケットが取得できます。
  次に、取得したソケットで入力ストリームと出力ストリームを取得すると同時に、
  データ入出力ストリームも取得しています。
  これだけで手順のBとCを実行したことになり、実際に入出力を実行できる準備が
  整います。
  簡単な手順で実行できますが、それぞれのメソッドやコンストラクタにエラーが発生する
  ことがありますので、エラー処理を記述しておく必要があります。
  ここではまとめて一つのエラー処理だけとしています。
  これだけの記述で上記手順の@からCまでが完了してしまいます。



(2) データ入力の記述方法
  手順Dの入力の場合の記述方法です。入力メソッドreadは、入力できるまで
  ブロックしてしまいますので、まず受信データがあるかどうかをチェックしてから
  読み込むようにする必要があります。
  これには、リスト-2のようにavailableメソッドで受信データの有無をチェックして
  からreadを実行するようにします。
  受信データがなければ何もせずに抜けます。受信データがあればreadを実行します。
  readメソッドもエラー処理が必要です。



(3) データ出力の記述方法
  手順Dの出力の場合で、データを出力する場合には、リスト-3のように記述します。
  この例では単純に文字列定数を出力しています。ここにもエラー処理が必要です。



(4) 終了処理の記述方法
  手順Eの終了処理ではclose()メソッドを実行するだけなのですが、ソケッ
  トインスタンスが無いときこれを実行すると例外が発生してしまいますので、
  リスト-4のようにソケットインスタンスがある場合のみ実行するようにします。



以上が、Socketクラスを使ったプログラムの基本的な記述方法となります。
意外に簡単なプログラミングとなります。

【アプリのダウンロード】

WAVプレーヤのタブレットのアプリケーションは下記からダウンロードできます。
Eclipseのプロジェクトファイル1式となっています。
binフォルダ内にapkファイルもありますので、パソコンに展開したあと、直接
タブレットにダウンロードすることもできます。


  ★★★ WAVプレーヤのアプリのダウンロード ★★★