質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

4721閲覧

BLE通信によって受け取ったバイナリデータの画面表示方法(Android studio:java)

46psm

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/06/19 02:22

編集2019/06/20 02:33

前提・実現したいこと

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しか取得されませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

単純にデータの受け渡しがうまくいっていないだけでした

投稿2019/06/21 05:48

46psm

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、そのバイナリデータをどういうふうに表示したいのか、を決める必要があります
あとはそれに従い、文字列変換するだけの話です

バイナリデータ、というのは文字列ではありません。必ず何らかの変換操作を行い、文字列に変換します

投稿2019/06/19 02:39

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

46psm

2019/06/19 02:54

y_waiwai様いつも回答ありがとうございます。 バイナリデータは小数点以下も含めた10進数にしたいです。 BLE通信で複数バイトのデータを受け取るにはString型で受け取り、そこから変換する方法しか知らないのですが、ほかに方法があるのでしょうか?
y_waiwai

2019/06/19 03:01

まず、BLEの送信側でどういう処理をしてセンサのデータを2バイトにしているか、を理解する必要があります センサからの出力の2バイトをそのまま送信しているとしますと、そのセンサがどいういう単位でデータ出力しているかを、そのセンサのデータシートを読んで理解する必要がありますね たとえば、フルスケール10ミリのセンサとすると、0x0000==0mm、0xffff==10mm となりますんで、そこから出力データが何ミリに当たるのかを計算する必要があります
46psm

2019/06/19 04:14

加速度センサの出力値はフルスケール±2gとなっています。 このデータをTWIで読み取り、型変換をし、適切な係数をかけ、sprintfにて変換してからBLE送信する分には出力値をAndroidでみることができますが、 TWI読み取り、BLE送信、Android上で型変換、係数かける、sprintf的なコードで変換して表示すると出力されなくなってしまいます。
y_waiwai

2019/06/19 04:22

出力されなくなるってのがどういうことかわかりませんが、センサの値とBLEから受信した値が同一かみてみればどうでしょう
46psm

2019/06/19 04:59

出力されなくなるとは、初期値の0さえも表示されずに、TextViewのスペースが空白のままになってしまいます。 Android studioのデバッグモードでString型変数"s"の値を確認したのですが、 ���������������� のように文字化けみたいになってしまいました。
y_waiwai

2019/06/19 05:03

ならその、sprintf的なコードというのが間違ってます
y_waiwai

2019/06/19 05:10

まずは valueText.setText(String.format("%.2f",1f)); にして、1.00という出力されるのを確認してみれば
46psm

2019/06/19 06:47

違うプログラムで、double型変数をvalueText.setText(String.format("%.2f",double_count); で出力できることは確認してあります
46psm

2019/06/19 06:49

String型の変数sの中身が����������������となっているため、そのあとのsbyteなどの変数は全て0になってしまいます。
y_waiwai

2019/06/19 07:01

ああ、そもそものバイト列が取得できないってはなしですか(よーやく理解できた)  String s; s = characteristic.getStringValue(0);//値取得 setStatus(BleStatus.GET_VALUE); byte[] sbyte = s.getBytes();//byte型配列に1バイトずつ取り出す。 これを、 byte[] sbyte = characteristic.getValue(); にかえてみればどでしょ
46psm

2019/06/19 07:09

説明不足ですみませんでした。 先ほど追記させていただきましたが、getValueでbyte型変数に受け取ろうとしたところ、0しか取得されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問