9

次のコマンドを使用して、LinuxでBluetoothRFCOMMサービスを実行しています。

sdptool add --channel 1 SP
rfcomm watch hci0 1 "$COMMAND" {}
# ^ here

$COMMAND、パラメータとして渡されたファイルにバイナリデータを書き込みます。次の手順を実行して、正しく動作することをテストしました。

FIFO=$(tempfile)
mkfifo "$FIFO"
"$COMMAND" "$FIFO" &
cat "$FIFO" | hexdump -C # <- output is correct

ただし、SPP / RFCOMM検出(UUID)を介して別のデバイスからサービスに接続すると、ストリーム内で( )00001101-0000-1000-8000-00805F9B34FBのすべてのインスタンスが0x0ALF)に置き換えられていることがわかります。バイナリデータも送信するハードウェアシリアルデバイスに接続しようとしましたが、変換が行われないため、問題は受信側ではありません。置換を実行するのは、最初のスニペット(行の上)のコマンドである必要があります。0x0D 0x0ACR LF# ^ here

ツールがこの置換を行うのはなぜrfcommですか?また、どうすれば無効にできますか?

4

1 に答える 1

6

TTYの回線規律に噛まれているようです(rfcommFIFOではなくttyを作成することを忘れないでください)。

TTYをrawモードに、つまり魔法を使わずに変更してみてください。最も簡単な方法はを使用することstty --file <tty> rawです。rfcommコマンドラインでいくつかのコマンドを許可するかどうかはわかりませんが、スクリプトを使用して簡単に行うことができます。

command_raw

#!/bin/bash
stty --file "$1" raw
"$COMMAND" "$1"

そして、実行します:

sdptool add --channel 1 SP
rfcomm watch hci0 1 ./command_raw {}

実行するコマンドのソースがある場合は、Cで簡単に変更することもできます。

 #include <termios.h>
 #include <unistd.h>

 //WARNING: error checking left as an exercise to the reader!
 void make_raw(int fd)
 {
     struct termios ios;

     //Not a TTY: nothing to do
     if (!isatty(fd))
         return; 

     tcgetattr(fd, &ios);
     cfmakeraw(&ios);
     tcsetattr(fd, TCSANOW, &ios);
 }
于 2013-02-25T14:24:49.470 に答える