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

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

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

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Java

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Q&A

解決済

3回答

1277閲覧

InputStreamは取りこぼすことがあるのでしょうか?

pectin

総合スコア95

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Java

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

0グッド

2クリップ

投稿2017/08/07 20:58

編集2017/08/13 03:08

###InputStreamは取りこぼすことがあるのでしょうか?
InputStream は、以下のような処理でデータを取得すると思います。

Java

1while (true) { 2 read = in.read(buf); 3 if (read == -1) { 4 break; 5 } 6 7 // 取得したデータを処理 8}

シリアル通信(SPP)のデータ受信処理を作っているのですが、少し疑問に思うことがありました。

データ送信側が定期的にデータを送信(100ms毎など)している場合は、このループを回しっぱなしでエンドコードを受信するまでなど、役目を終えるまで処理すると思います。

上の例だと sleep() などのウエイトなしですが、これを sleep(1000) などデータ送信側の間隔より遅い待機時間になった場合は、データを取りこぼすことになるのでしょうか?
それとも、上記の例ですと10回分のデータは取りこぼすことなく取れるものなのでしょうか?

現在はウエイトなしで問題なくデータ受信はできているのですが、ノーウエイトでループするのもCPUの負担になると思ったのと、ウエイトを入れた時にデータを取りこぼすことがあるのだろうかと思ったので質問しました。

もしご存知の方がいらっしゃいましたら、教えていただけると助かります。

よろしくお願いします。


追加情報です。
データ送信側の情報を記載します。
(マニュアル記載のままです)

ボーレート9600bps
データ8bit
パリティなし
ストップ1bit
フロー制御なし

この装置と Android(OS 4.4.x) アプリを bluetooth で接続してデータを読み取る仕組みとなっています。

Android は、
android.bluetooth.BluetoothAdapter
android.bluetooth.BluetoothDevice
android.bluetooth.BluetoothSocket
を使ってます。


結論として、read() は...

  • 適切な wait が入る(具体的な処理内容は調べてみます)
  • バッファサイズから溢れない限り取りこぼすことはない(バッファサイズの調整方法は調べてみます)

ということなので、
ループ処理に Thread.sleep() などの処理は不要で、極度に小さいバッファサイズや、長時間かかる処理をしなければ、溢れることを心配する必要がない。
ということで理解しました。

いろいろ情報をいただき、ありがとうございました。
よろしくお願いします。

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

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

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

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

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

szk.

2017/08/08 01:19

javaのInputStreamというよりはシリアル通信(SPP)の規格がどうかだと思います。タグ変えられたほうがいいかと。
pectin

2017/08/08 01:20

ありがとうございます。タグを変更します。
matobaa

2017/08/08 03:13 編集

もうちょっと環境について補足ください。OSとかBluetoothライブラリとか速度とか
Stripe

2017/08/08 05:16

read()メソッドで自動的にウエイトが掛かることはご存知ですか?
pectin

2017/08/09 07:52

matobaa さん、環境について情報を追記しましたので、これらの情報でわかるようなことがありましたら、教えていただけると助かります。よろしくお願いします。
pectin

2017/08/09 07:59

Stripe さん、自動的に wait がかかることは知りませんでした。詳細を教えていただくことはできますでしょうか?不勉強ですみませんが、よろしくお願いします。
guest

回答3

0

ベストアンサー

シリアル通信は普通、データ受信時にバッファにためて、
利用側のソフトはバッファの中身を読み出します。
なのでバッファの容量を超えない限りは読み落としません。

投稿2017/08/09 08:36

ozwk

総合スコア13521

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

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

pectin

2017/08/09 23:46

ありがとうございます。 基本的にはバッファサイズを超えないタイミングで読み出すことで、取りこぼしなく読めるということなら安心しました。 バッファサイズは、in.read(buf) の引数 buf のサイズになるのでしょうか? それとも read() が内部的に決めたサイズになるのでしょうか? よろしくお願いします。
guest

0

こんにちは。

受信のトリガーは何でしょう?
多分、受信イベントによる通知だと思うので、sleepは不要ですね。

また、「InputStreamでの取りこぼし」の表現はそぐわず、sppでどのようなインターフェーを用い、
どのようなシーケンスで行っているかの情報を提供した上で、そのシーケンスで取りこぼしの可能性があるか?という問いであれば、もっと目的に則した回答が得られるのではないかと思います。

追記2

上記部分は私の理解不足だったようです。
ロスを防ぐという意味で、Android Beamを利用して待ち受けが不要になる、
こちら(BTSSPを自力で作る~Android BeamからのBluetooth通信~)が参考にならないでしょうか?

追記1

気にしておられるのは送受信に伴うデータの欠損が起こりうるのかどうかなので、
送受信双方向でどのようなやり取りが行われるかを明らかにすると良いと言うことです。

InputStreamでデータを受け取る場合は、ファイル全体を取得し割り込みが入る余地がないので、
気にするポイントがズレているというのを言いたい訳です。

で、こちら(Bluetooth通信の主な処理のシーケンス図)のようなことについて、どんな具合で実装している(予定?)なんだろうかと。

投稿2017/08/08 05:18

編集2017/08/10 01:09
sazi

総合スコア25195

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

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

pectin

2017/08/09 08:04

不勉強な部分もあり、質問内容もわかりづらい点がある点については申し訳ありませんでした。 気がついた点については、随時編集しておりますので、もしその内容でわかるようなことがありましたら、教えていただけると助かります。 ありがとうございました。
sazi

2017/08/09 12:33

追記しました
pectin

2017/08/09 23:57

ありがとうございました。 ・BluetoothAdapter.getBondedDevices() でペアリング済みの機器一覧を取得 ・接続したい機器の BluetoothDevice を取得 ・取得した BluetoothDevice を BluetoothSocket を使ってソケット接続 ・接続したソケットの getInputStream() で接続先機器から送信されるデータを read() で読み出しています よろしくお願いします。
sazi

2017/08/10 01:10

追記しました
guest

0

結論として、read() は...

適切な wait が入る(具体的な処理内容は調べてみます)
バッファサイズから溢れない限り取りこぼすことはない(バッファサイズの調整方法は調べてみます)
ということなので、
ループ処理に Thread.sleep() などの処理は不要で、極度に小さいバッファサイズや、長時間かかる処理をしなければ、溢れることを心配する必要がない。
ということで理解しました。

いろいろ情報をいただき、ありがとうございました。
よろしくお願いします。

投稿2017/08/13 03:08

pectin

総合スコア95

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問