通过蓝牙/RFCOMM/SPP发送二进制数据会将0x0A转换为0x0D 0x0A。

9

我有一个通过以下命令在Linux上运行的蓝牙RFCOMM服务:

sdptool add --channel 1 SP
rfcomm watch hci0 1 "$COMMAND" {}
# ^ here
< p > $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工具要进行此替换,如何禁用它?

1个回答

7
看起来你正在遭受TTY的线路纪律的困扰(请记住,rfcomm不会创建FIFO,而是创建了一个TTY)。
你可以尝试将TTY改为原始模式,也就是没有任何特殊处理。最简单的方法是使用"stty --file 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);
 }

我没有意识到rfcomm设备是TTY。当然,C代码完美地工作了。 - dflemstr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接