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

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

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

$COMMAND会将二进制数据写入作为parameter passing的文件。 我已经testing过,它的行为是正确的:

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

但是,通过SPP / RFCOMM发现(UUID 00001101-0000-1000-8000-00805F9B34FB )连接到来自不同设备的服务时,我发现0x0ALF )的每个实例都被replace为0x0D 0x0ACR LF )stream。 这个问题不在接收端,因为我试图连接到一个硬件串行设备,也发送二进制数据,并没有发生转换。 它必须是执行replace的第一个代码段(在# ^ here行的上面)中的命令。

为什么rfcomm工具做这个replace,我怎么能禁用它?

看起来你正在被TTY的线上纪律所咬(记住, rfcomm不会创建fifo,而是tty)。

您可以尝试将TTY更改为原始模式 ,即没有任何魔法。 最简单的方法是使用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); }