如何在Linux上连接数据并将数据发送到蓝牙串行端口?


30

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

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

sdptool add --channel=22 SP

然后我用rfcomm叫“听”:

rfcomm listen /dev/rfcomm0 22

哪个阻止

Waiting for connection on channel 22

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

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

鉴于我可以成功配对并发送文件而没有任何问题,所以我知道蓝牙配对和通信可以正常工作。

我不太确定我还能尝试什么。我在本地设备和Android设备上使用了“ sdptool浏览”功能,以确保没有任何RFCOMM频道冲突。

Answers:


21

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

(此步骤可能 无济于事),关闭Android的蓝牙功能,并从Linux机器上断开USB /蓝牙适配器的连接(或者,如果您有内置的USB适配器,请使用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/,也可以在Google Play商店免费获得),尽管任何类似的应用程序都可以使用。打开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

1
好答案。我将其与Ubuntu 16 / Bluez 5和以下信息一起使用:bbs.archlinux.org/viewtopic.php?id=201672
wojciii

10

下面的步骤对我有用:

首先,您必须配对设备。配对相对容易。我将呼叫客户端(开始交谈)和​​服务器(谁进行回复)

您必须先设置服务器:服务器端(以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...将“监听”传入的连接。如果连接断开,该命令将重新启动新的“监听”状态。


1
ismaia提供的答案几乎可以帮助您到达那里。您需要记住,尽管较新的bluez堆栈需要特殊--compat选项,否则添加SP可能会失败。看这里。因此,调整/修改您的systemd / initd启动启动脚本,以便--compat在那里。
blacktofu

5

我对Pris的命令进行了一些细微改动,从而解决了这个问题。如果有人仍然无法建立rfcomm连接,请尝试一下。

sudo service bluetooth restart

此^可确保您每次尝试建立连接时都从头开始。

rfcomm 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终端模拟器来检查所有内容。


0

我尝试了不同的蓝牙工具,但是很难找到正确的命令顺序来连接和交换与蓝牙模块的数据。尝试使用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

注意:绑定0表示设备号0(rfcomm0),而1是通道。

然后将minicom与sudo一起使用,并保存一个配置,在其中指定波特率和端口。您可以在此处找到更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.