第 3 章 テニスログのシステム概要
3.2 センサデータの取得
テニスロガーはアンドロイドプログラミングバイブル[30]のサンプルプログラム「
Blue-toothEx」をベースに作成した。テニスロガーは3つのクラスから成る。以下に3つのクラス
図3.1: テニスログのシステム全体概要
図3.2:テニスログホームのプログラム構成
それぞれの役割を示す。
・BluetoothExクラス:センサ操作(計測開始、停止)コマンドの送信、端末内データ保存処理、
UI処理を行う
・BluetoothChatServiceクラス:Bluetoothの接続を管理する。Bluetoothの接続待ち、Bluetooth
の接続、Bluetoothの切断処理を行う。Bluetooth接続ではセンサからのデータをストリームで
受信し変数に格納、BluetoothExへのデータ転送を行う
・DeviceListActivityクラス:端末の周囲に存在するBluetooth端末を検索する
テニスロガーでは加速度センサより加速度データを取得するためにまず加速度センサとス マートフォンのBluetoothペリングを行う。Bluetoothペアリングとは、2台のBluetoothデバ イスの接続設定を行う事である。ペアリングを行うことによりBluetooth機器は公開している 機能へ互いにアクセスできるようになる。
センサ操作コマンドの送信処理
加速度センサはテキスト形式のコマンドを送信する事で計測開始、停止操作を行う事ができ る。テニスロガーでは「スタート!」ボタンを押すと計測開始命令テキスト「sens +000003000
5 2 0 +(改行コード)」が加速度センサへ送られる。sensは加速度を意味するテキストである。
「sens +000003000 5 2 0 +(改行コード)」は5ミリ秒ごとに2回サンプリングした平均を出力 するという意味である。
「ストップ!」ボタンを押すと計測停止命令テキスト「stop all +(改行コード)」が加速度セン サへ送られる。センサは計測開始命令、計測停止命令コマンドを正常に受け付けるといずれ もテキスト「OK」を返す。計測開始命令テキストを受け付け、「OK」を返した後、センサは 加速度データを送信し始める。図3.3に加速度データの中身をスマートフォンで参照した様子 を示す。5ミリ秒ごと2回サンプリング平均を出力しているため、5×2=10ミリ秒ごとにセ ンサデータを受信していることが分かる。図3.3の初めのデータを例にとり、加速度データの フォーマットを以下に示す。
「sens,,152544119,1,-8,955+(改行コード)」
「sens」は計測開始命令テキストと同様、加速度を意味するテキストである。「152544119」は タイムスタンプであり、15時25分44秒119ミリ秒という意味である。「1」「-8」「955」は加 速度データであり、左から順にX軸、Y軸、Z軸のデータである。図3.4に加速度センサの装 着方向図を示す。加速度センサのX軸、Y軸、Z軸の方向は図3.4の示す通りである。センサ データは1行に1レコードが格納され、連続してセンサより送られてくる。
センサデータの受信処理
BluetoothChatServiceクラスでセンサデータを受信し、ハンドラのターゲットプログラムへ
の送信メソッドsendToTargetによりBluetoothEXへセンサデータを送信する。以下に Blue-toothChatServiceでのセンサデータ受信からBluetoothExへセンサデータを渡す処理のメイン
図3.3:センサデータファイル(CSV形式)の中身
図3.4:加速度センサの装着方向
プログラム部分を示す。
public synchronized void sleep(long msec){
try{
wait(msec);
}catch(InterruptedException e){}
}
private class ConnectedThread extends Thread { private BluetoothSocket socket;
private InputStream input=null;
public ConnectedThread(BluetoothSocket socket) {(1) try{
this.socket=socket;
this.input =socket.getInputStream();
}catch(IOException e){}
}
public void run(){
byte[] buf=new byte[16384];(2) int buf_bytes;
while(true){(3) try {
sleep(2000);(4)
buf_bytes=input.read(buf);
handler.obtainMessage(BluetoothEx.MSG_READ, buf_bytes,-1,buf).sendToTarget();
sleep(2000);(5)
}catch(IOException e){
setState(STATE_LISTEN);
break;
}
} } }
(1)のコンストラクタにおいてInputStream変数inputを宣言している。これによりセンサか らの受信データは変数inputに格納される。(2)ではinputからのデータを格納するためのバッ ファ領域を16384バイト確保している。(3)ではwhile文を無限ループさせる事でバッファ内 にたまったデータを常にBluetoothExに渡す処理を行っている。
(4)のsleepクラスはプログラムの実行を引数で指定した秒数だけ処理を待たせるメソッで ある。上記プログラム内(4)ではinputstreamにbufで用意した16386バイト内で一定量データ が溜まるまで待っている。上記プログラム内(5)ではBluetoothExにbuf内に溜められたデー タが全て渡されるまで待っている。sleepクラスを実装する事でセンサデータが受信途中で途 切れるなどの破損防止を行っている。
BluetoothExではBluetoothChatServiceよりデータを受信するとif文処理により端末内への 保存操作、画面表示テキスト処理を行う。以下にBluetoothEx内で行うセンサデータのif文処 理のメインプログラム部分を示す。
case MSG_READ:
byte[] readBuf=(byte[])msg.obj;
if((new String(readBuf,0,msg.arg1)).contains("sens")){
writefile((new String(readBuf,0,msg.arg1)));
}
addText(new String(readBuf,0,msg.arg1));
テキストに「sens」が含まれていた場合、writefileクラスにデータが送信される。writefileク ラスでは端末内SDカードへのデータ保存操作を行う。またこの処理がセンサデータよりデー タ受信中であることを利用し、同クラス内で画面表示に図2.12における「Now Logging・・・」
テキストの出力処理を行っている。addTextクラスではセンサ接続に関するテキスト表示処理 を行っている。図2.6、図2.9、図2.10に示されるテキスト「センサに接続して下さい」「Now
Connecting・・・」「センサ接続完了!「スタート!」ボタンを押すとテニスログが開始されま
す!」を表示処理している。BluetoothChatServiceよりセンサ接続の状態をBluetoothExで受 け取り、接続状態に応じた表示処理をしている。