前提・実現したいこと
BLE通信によってAndroid端末で受信したバイナリデータを、デコードして画面に値を出力したい。
プログラムはAndroid studioにより、javaで書いています。(Android4.4、API19)
加速度センサからの出力値をBLE通信によってAndroidへ送信しているのですが、出力の情報は以下の通りです。
・出力ビット数:16ビット(x_highで8ビット,x_lowで8ビットの計16ビット→結合させる必要あり)
・符号あり
・リトルエンディアン
・オフセットかかっていない
・フルスケール:±2g
発生している問題・エラーメッセージ
BLE通信によって加速度センサの出力値を一度に6バイト分(x_high,x_low,yとzも同様)送信しています。
送信するデータはuint8_tの配列にデータを格納しています。
受信するデータはString型変数に対し、characteristic.getStringValueによりデータを取り出し、getBytes()によりbyte型配列に1バイトずつ取り出しています。
これをまずshort型に変換し、x_highとx_lowを結合し、xyzそれぞれ2バイトずつのデータを作成します。
加速度センサの出力値は小数を含めて表されるので、double型に変換し、これをsettextで表示しようとしました。
結果としては値は何も表示されずにいます。
一度のBLE通信で6バイト分受け取りたかったのでgetStringValue()を採用したのですが、バイナリデータをString型で受け取るのは良くないのでしょうか?
送信するデータをバイナリデータではなくdouble型に変換してから送信する分にはAndroid上で正しく値が見れていました。
該当のソースコード
public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) { Log.d(TAG,"onCharacteristicChanged"); setStatus(BleStatus.CHARACTERISTIC_CHANGED);//ステータス表示(characteristicの更新) //Characteristicの値更新通知 //UUID確認 if(DEVICE_SENSOR_CHARACTERISTIC_UUID.equals(characteristic.getUuid().toString())) { //処理内容 final int data[] = new int[8]; String s; s = characteristic.getStringValue(0);//値取得 setStatus(BleStatus.GET_VALUE); byte[] sbyte = s.getBytes();//byte型配列に1バイトずつ取り出す。 //2バイトのxyzデータ作成 data_cast[0] = (short)(sbyte[1] <<8 | sbyte[0]);//x data_cast[1] = (short)(sbyte[3] <<8 | sbyte[2]);//y data_cast[2] = (short)(sbyte[5] <<8 | sbyte[4]); //z //double型へ buf[0] = (double)data_cast[0]; buf[1] = (double)data_cast[1]; buf[2] = (double)data_cast[2]; update_text(buf);//sbyte);//値を表示 } } }; private void update_text(final double[] a){ runOnUiThread(new Runnable() { @Override public void run() { valueText.setText(String.format("%.2f",a[0]));//ここの部分はどの書き方がいいかわからず、いろいろ試してたので統一されてません valueText2.setText(String.valueOf(a[1])); valueText3.setText(String.valueOf(a[2])); } } ); }
追加情報
・Android studioのデバッグモードで、String型で受け取った値を見てみたのですが、文字化けのようになってしまいました。
����������������
・getStringValueではなく、byte型でgetValueによってバイナリデータを取得したところ、
0しか取得されませんでした。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。