蓝牙适配器连接被拒绝。

蓝牙适配器连接被拒绝。

我有一个蓝牙适配器(价格约为 2 美元),我想通过它向我的 Android 手机发送串行数据。

我已经安装了:

sudo apt-get install bluetooth bluez-utils blueman

在扫描时,我找到了我的 Android 设备(我猜这意味着加密狗正在工作)

hcitool scan

之后我运行了这个:

sudo bluez-simple-agent hci0 xx:xx:xx:xx:xx:xx

我已经编辑了这个文件:/etc/bluetooth/rfcomm.conf

对此:

rfcomm1 {
    bind yes;
    device xx:xx:xx:xx:xx:xx;
    channel 1;
    comment "Connection to Bluetooth serial module";
}

但在跑步时

sudo rfcomm connect 1, 我正进入(状态 ' Can't connect RFCOMM socket: Connection refused'

问题是什么 ?

答案1

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

(此步骤可能不会做任何有用的事情)关闭BluetoothAndroid 并断开 USB/蓝牙适配器与 Linux 计算机的连接(或者如果您有内置适配器,请使用 hcitool devname reset 重置它)

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

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

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

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

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


我想讨论一下包装布鲁兹bluez-utils 工具,自从搬到蓝兹5破坏了各种命令行实用程序,例如sdptool.例如(与这个问题相同),

$ sdptool browse local
Failed to connect to SDP server on FF:FF:FF:00:00:00: No such file or directory

这是因为 Bluez 5 弃用了通过套接字 /var/run/sdp 进行通信的旧 C 接口,并且该套接字不再存在。 bluetoothd 的帮助消息给出了解决方案:

$ /usr/lib/bluetooth/bluetoothd --help

...

 -C, --compat                Provide deprecated command line interfaces

我按如下方式应用这个

# nano /etc/systemd/system/dbus-org.bluez.service

喜欢:

ExecStart=/usr/lib/bluetooth/bluetoothd --compat

来自muru的评论:以上编辑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

用于systemctl edit dbus-org.bluez.service创建不会在包更新时丢失的覆盖文件,而不是直接编辑服务文件。


然后:

# systemctl daemon-reload
# systemctl restart bluetooth

不用说,每次 bluez 更新时都会恢复此编辑。现在 /var/run/sdp 存在,但 sdptool 仍然损坏:

$ sdptool browse local
Failed to connect to SDP server on FF:FF:FF:00:00:00: Permission denied

与Ubuntu(14.04仍然使用Bluez 4)相比,我们看到权限/var/run/sdp不同,并将它们设置为

# chmod 777 /var/run/sdp

(不坚持)终于成功了sdptool

来源: https://bbs.archlinux.org/viewtopic.php?id=201672

答案2

问题是,尽管在您这边创建并绑定了套接字,但它无法成功调用 connect()。 (来自bluez-X-Y.Z/tools/rfcomm.c来源)。 connect() 调用失败(即返回值<0)可能由多种原因引起。

我想您真正的问题是“我怎样才能成功连接?”

要解决此问题,您必须首先绝对确定另一台计算机上有侦听套接字。我建议您使用在计算机上运行的另一个 bluez 堆栈来完成此操作。

在另一台机器上运行:

rfcomm listen 0           # listens on channel 1 by default

并在测试机上运行:

rfcomm connect 0 00:11:22:33:44:55 1

预期的行为没有错误。

然后你可以使用这个机制来连接套接字和登录,传输文件等......但这超出了你的问题。

相关内容