問題タブ [rfcomm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 1つのL2CAPパケットが欠落しているデータを受信するRFCOMM
BluetoothのRFCOMMを使用してAndroidアプリを作成しました。同じRFCOMMUUIDを介して1MBのデータをAndroidアプリに送信しています。
私のアプリで1つのL2CAPパケットデータが欠落していることに気づきました。詳細については、以下の情報を参照してください。
最大RFCOMMペイロードをサポートする私のAndroidモバイルBluetoothは990バイトであるため、リモートデバイスは990バイトのペイロードで各L2CAPパケットを送信しています。リモートデバイスから1Kのデータを送信するときは常に、それぞれ990バイトと34バイトの2つのL2CAPパケットに分割されています。
Androidアプリでデータを受信した後、各1Kデータを確認しました。そこで、1つのL2CAPパケット、つまりAndroidで990バイトがスキップされていることに気付きました。
アナライザーを使用して、リモートデバイスから送信されるすべてのデータを確認しました。1MBのデータを確実に送信しています。
しかし、私のAndroidアプリでのみ、受信できません。ここではBluetoothチャットのサンプルコードを使用したため、これは私のアプリでは問題ありません。
これを数回テストしましたが、テストを実行するたびに、失われた990バイトのデータが1MBのデータで同じインデックスになりません。
私はこれをAndroid2.2、2.3.3、2.3.6バージョンの3つの携帯電話でテストしました。各携帯電話は同じ問題を抱えています
しかし、RFCOMMソケットのInputStreamからもデータを受信している間、例外は発生しません。
誰かが私の問題に直面して解決した場合は、私を助けてください。
android - Bluetooth Android RFCOMM / SPP エラー処理の提案
Android デバイスと市販の Bluetooth モジュールを使用するカスタム センサーとの間で使用される通信プロトコルを計画しています。「TCP と同様に、シンプルで信頼性の高いデータ ストリームをユーザーに提供する」と言われている SPP プロファイルを使用します。
私は Bluetooth テクノロジにあまり詳しくなく、そのようなプロトコルの設計についていくつか質問があります。
まず第一に、破損したデータが転送されるかどうかを心配する必要があるかどうかはわかりません。基礎となるプロトコル スタックは、Android から読み取ったバイトInputStream
がセンサー側で UART が受信したものと同じであることを保証してくれますか? CRC などで保護された独自のデータ パッケージを定義する必要がありますか?
信号が弱く、しばらく失われた場合にアプリケーションで何が起こるかは、Android Bluetooth のドキュメントからはわかりません。IOException
すぐに取得できますか?それとも、プラットフォームが隠しエラー処理と回復を提供して、このような短い停止を見えなくすることができますか?
アドバイスをありがとう。
java - Android Bluetooth シリアル RFCOMM ボーレートが低い/通信速度が遅い
カスタムメイドのハードウェアからデータを送受信するAndroid Bluetoothプロジェクトに取り組んでいます。SDK のBluetooth チャット サンプルを基礎として使用しました。
クライアント(Androidフォン)でボーレートを変更する方法はなく、ボーレートはハードウェアに依存することに気付きました。ハードウェアでさまざまなボーレートを設定しようとしましたが、どれも期待どおりではありませんでした。
私が得ることができる最速は91Kbpsです(ボーレートが2.7Mbps〜910Kbpsに設定されている場合)。最小ボーレート (115Kbps) を使用すると、43Kbps になります。別の電話を使用してみましたが、同じです。毎秒 170KB のデータをハードウェアに転送する必要があります。
仕様
プロトコル: 同期または生成されたデータは、最大 520 バイト サイズのパッケージを使用してハードウェアに送信されます。各パッケージが受信および承認されると、ハードウェアは検証コマンドを送信し、電話機は次のデータ パッケージを送信します。
クライアント: Android 2.3.3、Samsung galaxy w i8150、Bluetooth v3.0、RFCOMM
ハードウェア: カスタム、Bluetooth v2.1 BlueGiga WT11i
私は完全に混乱しています..おそらく、電話のAndroidまたはBluetoothデバイスによって引き起こされた問題でしょうか? 最大ボーレートはいくつですか?送信を高速化する方法はありますか (最大パッケージ サイズを増やす、ハードウェア検証コマンドを待たずにすべてのパッケージを送信するなど)。
編集
パッケージ サイズを 4160 バイトに変更した後、スループットは 254Kbps に増加しました。1.5Mbps に到達するための最適なパッケージ サイズを見つけようとしています。提案をいただければ幸いです
python - DebianでPyBluezを使用してペアリングせずにRFCOMM?
ペアリング不要で使えるRFCOMMサーバープロセスをPythonで作ろうとしています。最初に、PyBluez のドキュメントから 2 つのサンプル スクリプトを取得しました。
サーバ:
クライアント:
Windows でサーバー スクリプトを実行したところ、すべてが期待どおりに機能しました。ペアリングは必要ありませんでした。この段階では、すべてが非常に有望に見えました。
ただし、サーバー プロセスを Debian Squeeze で実行する必要があります。Debian でテストすると、クライアント接続が拒否されます。syslog には、失敗したリンク キー要求と PIN 要求に関する bluetoothd からのメッセージがあります。
バージョン情報:
- パイブルーズ 0.18
- パイソン 2.6
- ブルーズ 4.66
- 接続の両端に Bluetooth v2.0 ハードウェア
この議論は、サーバーソケットのセキュリティレベルを調整できれば、ペアリングが無効になり、すべてが期待どおりに機能することを示唆しているようです. ただし、PyBluezでこれを行う方法、または可能であるとしても、私には明らかではありません。
さまざまな BT_SECURITY* 定数を使用して setsockopt() の呼び出しを実験したり、最後の PyBluez を取得して setl2capsecurity() を呼び出したりしましたが、進歩はありませんでした。
これは PyBluez で実現できますか?
android - createInsecureRfcommSocketToServiceRecord での頻繁なランダム エラー (サービス検出の失敗)
2 つの Android デバイス間で安全でない Bluetooth ソケット接続を確立しようとしています。私は両端でソフトウェアを制御します。一方の端はlistenUsingInsecureRfcommWithServiceRecord
接続をリッスンするために使用し、もう一方の端はcreateInsecureRfcommSocketToServiceRecord
接続に使用します。これは機能します。時々。
「時々」は私の問題です。試行の約 20% で失敗し、次の例外がスローされます。
両方のデバイスが起動しており、画面がオンになっています。デバイス間の距離は約 1m です (10cm と 3m は違いはありません)。どちらのデバイスも検出を実行していません。両方のデバイスが検出可能です (両方を検出不能にしても何も変わりません)。
無線インターフェースなので正常であると仮定して、失敗した場合は再試行する必要がありますか、それとも何かできることはありますか? 私が非常に快適な距離にいることを考えると、より確実に機能するはずではありませんか?
注: 同様の質問がたくさん見つかりましたが、見つかったのは、「まったく機能しない」、Android 以外のデバイスに接続する、またはその両方に関するものでした。
android - セキュリティで保護されていない RFCOMM Bluetooth ソケットを使用している場合、Android はいつペアリング ダイアログを表示しますか?
P2P ネットワークの目的で、ペアリングされていない 2 つの Android デバイスを Bluetooth 経由で接続しようとしています。MitM 保護は必要ありません。Android には(API レベル 10 以降) このための機能がcreateInsecureRfcommSocketToServiceRecord
ありlistenUsingInsecureRfcommWithServiceRecord
、最新のデバイスで完全に機能します。ただし、Galaxy Ace (Android 2.3.3 = API レベル 10、Galaxy Nexus と接続) では、ペアリング ダイアログが作成されます。これは、着信接続と発信接続の両方で発生します。(更新:Galaxy AceをAndroid 2.3.6にアップデートすると、明らかに問題が修正されます。これを常に/まったくしない特定のAndroidバージョンはありますか?)
ペアリングが受け入れられると、接続が機能します。このため、これはIssue 40101: createInsecureRfcommSocketToServiceRecord によって、サービス レコードが存在しない場合にのみ発生するはずの Android 4.2 でペアリング ダイアログが発生することとは関係がないと思います。
このダイアログが表示されるデバイスでは、このダイアログを回避できないと思います(可能な場合、これを行う方法を説明することは有効な答えです)。このため、そのようなダイアログがいつ表示されるかを知りたいです。Android Java ソースには何も見つかりませんでした (すぐにネイティブになります)。Ace には Bluetooth 2.1 が搭載されており、必要な「正常に動作する」接続をサポートするはずなので、Bluetooth バージョンと関係があるとは思えません。
デバイスがダイアログをポップせずに接続をサポートするかどうか、または特定の Android バージョンに明確に修正されているかどうかを検出できるものがあれば、それは非常に役立ちます。
また、そのようなデバイスを簡単に除外する方法を探しています。
linux - GUI を使用しない Bluetooth ペアリング
Linux サーバーで USB Bluetooth ドングルを使用する必要があります。実際には動作し、他の Bluetooth デバイスを検出できますが、それらの 1 つに (を使用してrfcomm
)接続しようとすると、 と表示されますCan't connect RFCOMM socket: Connection refused
。
デスクトップシステムで同じコマンドを入力すると、(ターミナルではなく)ダイアログウィンドウでパスキーが要求されるため、問題はペアリングにあると思います。問題は、デスクトップ環境なしでデバイスをペアリングするにはどうすればよいかということです。アドバイスありがとう。
c++ - Bluetoothソケットのバッファの状態を確認してください
Bluetoothのrfcommソケットからデータを受信するためのソケットを作成しました。
ワンピースで受け取った場合のパッケージには10個の番号がありますが、別々のパーツを受け取ることもあります。それは私がデータを取得するために選択した頻度に依存します。たとえば、私が選択した場合、1000Hz
私はすべての情報を取得します。私はaを使用してQTimer
おり、間隔1000 ms / 1000 Hzがintに等しいため、intを取得しますが、これは問題ありません。ただし、除算がintでない場合は、除算が QTimer
丸められ、非同期化されたときにすべてのパッケージを取得するために関数が時間内に再起動されません。
私はこれを使います、
numbが10に等しい場合、パッケージはOKだったので、処理します。そうでない場合は、部品のみを受け取りました。その後、その部分は失われます。
バッファがすでに読み取られているのではなく、バッファがいっぱいかどうかだけを確認する方法はありますか?つまり、状態が完全に読み取られた場合、そうでない場合は、次の反復に任せます。
私はこの問題の専門家ではありませんが、旗はMSG_EOR
私を助けてくれますか?私のデータはパッケージに入っています。
に変更read
する必要がありrecv
ますか?recv
パラメータとしてソケットを取得します。
どんな助けでも大歓迎です。
java - Bluetooth キーボードを Android デバイスに接続できない
Android フォンを Bluetooth デバイス (既にペアリングされている) にプログラムで接続しようとしています。スレッドでcreateRfcommSocketToServiceRecord(UUID)メソッドを使用しています。
BluetoothキーボードはHIDデバイスであることを知っているので、UUIDを次のように使用しています
00001124-0000-1000-8000-00805f9b34fb
上記のメソッドは BluetoothSocket オブジェクトを返しますが、bluetoothSocket.connect() が呼び出されると、HID デバイスへの接続に失敗します。IOException : 検出に失敗しました
私はこれについて多くのことを検索しましたが、これを修正する方法はわかりません。
Androidでこのアプローチを使用してHIDデバイスではなくRfcommを接続することは可能ですか? もしそうなら、これにどの代替アプローチを使用する必要がありますか? このアプリケーションで Android 4.1 を搭載した Samsung Galaxy S3 を使用しており、(設定から) ペアリングした後、SMS、電子メールなどの組み込みアプリで Bluetooth キーボードを使用して入力できました。正しいアプローチを使用しているかどうかわかりません。アプリでキープレス シリアル データを読み取りたい。
私が使用しているコードは次のとおりです。
java - Bluetoothソケットフリーズ電話
Android用のアプリケーションを開発しています。このアプリは、Bluetooth (BT) デバイスと通信する必要があります (いくつかのバイトを送信します)。デバイス (Samsung Galaxy mini) でのこのアプリのデバッグ/実行に問題があります。BT ソケットを作成してデバッグを停止すると、電話がフリーズし、バッテリーを取り出して再起動する必要があります。このアプリを(Eclipseから)実行する場合、すべて問題ありませんが、再度実行しようとすると、電話がフリーズし、アプリがインストールされません。2回目の実行前にこのアプリを手動でアンインストールしようとすると、電話が再びフリーズします。問題のあるコードは次のとおりです。
これはスレッドのコンストラクタです。行にコメントすると
電話はフリーズしないので、ソケットの作成に問題があります(接続していません)。デバッグや実行のたびに電話を再起動するのはかなり面倒で、まだ多くの作業を行う必要があります。
このアプリを電話から (Eclipse から切断して) 実行すると、問題なく動作します。どこに問題があるのか、またはそれを修正する方法はありますか? ありがとうございました。