9

我通过以下命令在 Linux 上运行了蓝牙 RFCOMM 服务:

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,我看到 () 的每个实例都被流中的( 0x0A)LF替换。问题不在接收端,因为我尝试连接到也发送二进制数据的硬件串行设备,但没有发生转换。它必须是执行替换的第一个片段(行上方)中的命令。0x0D 0x0ACR LF# ^ here

为什么该rfcomm工具会进行此替换,我该如何禁用它?

4

1 回答 1

6

看起来您正被 TTY 的线路规则所困扰(请记住,rfcomm它不会创建 fifo,而是 tty)。

您可以尝试将 TTY 更改为raw mode,即不使用任何魔法。最简单的方法是使用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 回答