【Raspberry Pi】ラズパイで音楽プレーヤーを作成する②

IT

前回、ラズパイ音楽プレーヤーのシステム構成などを説明しました。今回はラズパイ側のプログラムの紹介を行っていきます。

また、前回の記事はこちらになります。

ラズパイ側でやること

ラズパイ側では以下のことを実施します。

  • ポート60002を監視しメッセージを受け取る
  • 受け取ったメッセージにより再生・停止などの処理を実施
  • 結果のメッセージをスマホ側に返す

スマホからのメッセージを取得する

始めに述べておきますが、私はプログラミングが苦手なのでバグや効率の悪い部分が多くあると思います。あらかじめご了承ください。

まずはスマホからメッセージを受け取るServerThreadクラスを作成します。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public abstract class ServerThread extends Thread {

	private final int port;
	private ServerSocket serverSocket;
	private String receiveString;
	private String sendString;


	public ServerThread(int port) {

		this.port = port;

		serverSocket = null;
		try {
			serverSocket = new ServerSocket(port);

		} catch(IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {

		boolean continueFlag = true;
		Socket socket = null;

		try {
			while(continueFlag == true) {
				try {
					socket = serverSocket.accept();

					// ソケットからメッセージを受信するためのバイト列
					final byte rcvArray[] = new byte[512];
					// ソケットの入力ストリームを取得する
					final InputStream inputstream = socket.getInputStream();
					// 入力ストリームのデータを受信する
					final int dataSize = inputstream.read(rcvArray);
					// 読み取ったバイト列を文字列に整形する
					final String rcvData = new String(rcvArray,0,dataSize);

					System.out.println(rcvData);
					setReceiveString(rcvData);

					// 入力した文字列が「exit」の場合、終了フラグを設定する
					if("exit".equals(rcvData)) {
						continueFlag = false;
					}

					// メッセージを使ったメインの処理を実行
					executeMainTask(rcvData);

					// 返却する文字列
					String sendString = getSendString();

					if(sendString == null) sendString = "";
					// 出力ストリームを取得する
					final OutputStream outputstream = socket.getOutputStream();
					// 出力文字列をバイト列に変換する
					final byte sendData[] = sendString.getBytes();
					outputstream.write(sendData,0,sendData.length);

					// 入出力ストリームを閉じる
					inputstream.close();
					outputstream.close();

					// ソケットを閉じる
					socket.close();
					socket = null;

				} catch(Exception e) {
					e.printStackTrace();
				}
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(socket != null) {
				try {socket.close();}
				catch(Exception e) {}
			}
		}
	}

	public abstract void executeMainTask(String input) throws Exception;

	public void setReceiveString(String str) {
		this.receiveString = str;
	}

	public String getReceiveString() {
		return receiveString;
	}

	public void setSendString(String str) {
		this.sendString = str;
	}

	public String getSendString() {
		return sendString;
	}

}

このクラスは指定したポートを監視し、メッセージを受け取ります。
executeMainTaskという抽象メソッドがありオーバーライドすることで、この中で音楽を再生したり、曲情報を取得するという処理を行っていきます。

受け取ったメッセージに応じて処理を振り分ける

メッセージを取得できたので、次はメッセージに応じた処理を行うプログラムを作成していきます。

public class MessageReceiver extends ServerThread{

	public MessageReceiver(int port) {
		super(port);
	}

	/**
	 * メッセージを受け取った後のメイン処理
	 */
	@Override
	public void executeMainTask(String str) throws Exception{

		// ここにメッセージに応じた処理を記述する
		// setSendStringメソッドで返却するメッセージをセットする

	}
}

こんな感じで先ほど作成したServerThreadクラスを継承したクラスを作成します。
executeMainTaskではメッセージに応じて以下のような処理を実装しています。

メッセージ処理
GETLIST曲情報を取得する
PLAY指定したファイル(MP3)を再生する
STOP再生されているものを停止する
NEXT次の曲を再生する
PREVIOUS前の曲を再生する
PAUSE再生を一時停止する
VOLUMEボリュームを変更する(0~100)
STATUS現在の状況を取得する(曲名、秒数など)

なお、今回MP3ファイルを再生するにあたってjavazoomのBasicPlayerというAPIを利用しています。

このスレッドを起動したらあとはスマホからの入力待ちの状態になります。これでラズパイ側のプログラムは完成です。

さいごに

今回はラズパイ側のプログラムを行ってきました。次回はスマホ側のアプリを作っていきたいと思います。

コメント

タイトルとURLをコピーしました