gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:14:03 26 4
gpt4 key购买 nike

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

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

最佳答案

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

您可以尝试将 TTY 更改为原始模式,即不使用任何魔法。最简单的方法是使用 stty --file <tty> raw .我不知道rfcomm将在其命令行中接受多个命令,但您可以使用脚本轻松完成:

原始命令

#!/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);
}

关于linux - 通过蓝牙/RFCOMM/SPP 发送二进制数据将 0x0A 转换为 0x0D 0x0A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15028953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com