如何在 Linux 上连接蓝牙串口并向其发送数据?

如何在 Linux 上连接蓝牙串口并向其发送数据?

我正在尝试通过 Linux 上的 USB 蓝牙适配器设置虚拟串行端口,并通过 Android 设备向其发送消息。我使用的是 3.6 内核。我能够使用 gnome-bluetooth 成功与设备配对,并且还能够向其发送文件。

要设置串行端口,我首先将带有 SP 配置文件的通道添加到我的适配器:

sdptool add --channel=22 SP

然后我用 rfcomm 调用“listen”:

rfcomm listen /dev/rfcomm0 22

哪个阻塞

Waiting for connection on channel 22

显然 rfcomm 将在成功连接后创建 /dev/rfcomm0 。一旦发生这种情况,我想使用cutecom之类的东西来向连接的设备来回发送消息。

在我的 Android 设备上,我打开一个蓝牙 SPP 终端(有几个,我尝试了几个不同的)并尝试连接。他们都失败了。

鉴于我可以成功配对并毫无问题地发送文件,我知道蓝牙配对和通信是有效的。

我不太确定我还能尝试什么。我在本地设备和 Android 设备上使用了“sdptool browser”,以确保不存在任何 RFCOMM 通道冲突。

答案1

我现在似乎已经开始工作了。蓝牙似乎有点挑剔。我正在完整地回顾我的步骤,以防其他人发现它有用(尽管这几乎是我最初尝试的)。这适用于 Nexus 4 上的 Android JB (4.2.2) 和 Arch Linux 3.6.7-1,以及 Gnome 3.6 上的 bluez 4.101(带 gnome-bluetooth)。

(这一步可能没有任何用处) 关闭 Android 上的蓝牙并断开 USB/蓝牙适配器与 Linux 计算机的连接(或者如果您有内置适配器,请使用 hcitool devname reset 重置它)

在 Linux 上连接/打开蓝牙适配器。确保您的适配器可见(可以在 gnome-bluetooth 中设置 - 您应该看到蓝牙系统托盘图标)。

打开 Android 设备上的蓝牙。使用 Android 与适配器配对(我无法从 Linux 进行相反的配对)。将出现一个对话框,要求您提供密钥。输入您想要的任何 PIN 码。 Gnome 应该会弹出一条通知,要求您提供密钥;输入您之前输入的相同 PIN 码。此时您的 Android 设备和密钥应该已配对。

在 Linux 中,打开终端并输入以下内容来检查可用的蓝牙服务

sdptool browse local

如果您已经有串行端口服务,请记下它是什么通道。如果没有,您可以添加该服务:

sdptool add --channel=22 SP

现在使用 rfcomm 收听该频道:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm 将阻塞,监听带有类似消息的连接

Waiting for connection on channel 22

回到 Android,我使用了 BlueTerm 应用程序(http://pymasde.es/blueterm/,也可以在谷歌游戏商店免费获得),但任何类似的应用程序都应该可以工作。打开 BlueTerm,转至选项 > 连接设备:选择配对的适配器。

希望该应用程序能够连接。您将在您阻止监听的终端中看到额外的验证,并显示如下消息:

Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup

您在 BlueTerm 应用程序中输入的任何内容都应该发送至 /dev/rfcomm0。通过打开一个新终端并执行以下操作,您可以在键入时看到显示的内容:

cat /dev/rfcomm0

答案2

以下步骤对我有用:

首先,您必须配对设备。配对相对容易。我将呼叫客户端(开始说话)和服务器(回复)

您必须先设置服务器: 服务器端(作为 root):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

客户端(作为 root):

sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3

现在在客户端上打开串行终端:

screen /dev/rfcomm0 115200

评论:

当您在客户端调用最后一个命令 rfcomm connect... 时,/dev/rfcomm0将创建一个设备并将其关联到服务器/dev/recomm0。这代表两者之间的串行链接

最后一个服务器命令:rfcomm watch...将“侦听”传入连接。在连接丢失时,该命令将重新启动新的“监听”状态。

答案3

我通过对 Pris 的命令稍加修改来解决了这个问题。如果有人在设置 rfcomm 连接时仍然遇到问题,请尝试一下。

sudo service bluetooth restart

这 ^ 确保您每次尝试设置连接时都从头开始。

sdptool add --channel=<a_channel_#> SP

该通道编号应与当前分配的任何通道不同。

(可选)要检查频道:

sdptool browse local | grep Channel

我不确定为什么需要下一个命令,但它对我有用。

rfcomm release 0

然后监听传入的连接:

rfcomm watch 0 <a_channel_#>

注意:/etc/bluetooth/rfcomm.conf 中的 bt MAC 地址必须是您手机的 bt MAC。此外,此文件中的通道必须与为 a_channel_# 选择的通道相同。

完成这一切后,我使用手机上的 bt 终端模拟器来检查这一切。

答案4

我尝试过不同的蓝牙工具,但很难找到正确的命令序列来与蓝牙模块连接和交换数据。尝试使用 rfcomm 和 minicom:

这是我的/etc/bluetooth/rfcomm.conf

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 11:22:33:44:55:66;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

扫描蓝牙设备:

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

使用 rfcomm 绑定

sudo rfcomm bind 0 20:15:12:08:62:95 1

注意:bind 0 指的是设备号 0 (rfcomm0),1 是通道。

然后将 minicom 与 sudo 结合使用并保存指定波特率和端口的配置。您可以找到更多信息这里

相关内容