两个 Raspberry Pi 之间的蓝牙 6LoWPAN 连接

两个 Raspberry Pi 之间的蓝牙 6LoWPAN 连接

我在 Stack Overflow 上遇到过这个问题,但有人建议我转到这里。它被标记为版主关注,但我不确定这个过程是如何进行的,而且我没有收到任何反馈,所以我想我会在这里问这个问题:

我正在尝试在两个 Raspberry PI 之间建立蓝牙智能连接,其中我可以使用 IPSP(互联网协议支持配置文件),以便我可以使用 6LoWPAN 与 IPv6 协议进行通信。

我已经能够成功建立 Raspberry Pi 和 Nordic nRF51 开发套件之间的这种通信,但是作为概念验证,我现在正尝试在没有 Nordic nRF51 开发套件的情况下建立两个 Raspberry Pi 盒之间的这种连接。

所以我的第一步是设置 Raspberry Pi。我按照 Nordic 的 nRF5 IoT SDK 中的步骤完成了此操作(https://developer.nordicsemi.com)。我知道 Raspberry Pi 设置正确,因为它们都适用于 nRF51 开发板。我能够在 Raspberry Pi 和 nRF51 开发板之间建立连接,并从 Raspberry Pi 对 nRF51 开发板进行 ping6。

现在,为了在 Raspberry Pi 之间建立蓝牙连接,我执行以下步骤:在主设备上,我运行以下命令:

#need root access
sudo su

#enable 6lowpan over Bluetooth le
echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable

#start advertising Bluetooth LE service
hciconfig hci0 leadv

在从属设备上我运行以下命令:

#need root access
sudo su

#enable 6lowpan over Bluetooth le
echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable

#establish le connection to master
hcitool lecc 5C:F3:70:XX:XX:XX

韓國語命令始终返回“连接句柄 64”。此时,我已在两个设备之间建立了稳定的连接,我可以使用hcitool 骗局命令。

我现在能够在主设备或从设备上运行以下命令,其中 mac 地址是我正在连接的蓝牙设备的地址:

echo “connect 5C:F3:70:XX:XX:XX 1” > /sys/kernel/debug/bluetooth/6lowpan_control

无论我在哪个 Raspberry Pi 上运行该命令,都会建立 6lowpan 连接,如果我运行 ifconfig 命令,我会看到一个新的 bt0 设备。然而,另一个 Raspberry Pi 没有获得 bt0 设备。我尝试运行ifconfig bt0 启动命令并运行相同的 echo 命令(更改 mac 地址),但它们都没有给我 bt0 设备。

我运行该命令的 Raspberry Pi 上出现的 bt0 设备总是在 39 秒后消失。在 /var/log/syslog 日志文件中,ntpd 守护进程似乎在 bt0 接口启动时开始监听它,然后在 39 秒后检测到该接口已消失并释放它。我尝试在设备启动时使用以下命令为其分配 IPv6 地址:

ifconfig bt0 inet6 add 2001:db8::5cf3:70ff:feXX:XXXX/64 

然后我运行了 ping6 来连续 ping 它,希望能够让接口保持一段时间,但接口仍然在 39 秒后关闭。

我使用两个 Raspberry Pi 2 Model B,两个蓝牙适配器都是 Broadcom Corp BCM20702A0 蓝牙 4.0 设备(使用系统盘以获取有关适配器的信息)。尽管适配器被列为蓝牙 4.0,但我还是能够成功地将它们与 Nordic nRF51 开发套件一起使用,以建立 6LoWPAN 连接。

完成所有实验后,我遇到了以下问题:

  • 我可以做我想做的事吗?
  • 有谁能够在两个 Linux 设备之间成功建立 6LoWPAN 连接,可以告诉我我的步骤中缺少什么吗?
  • 我是否需要其中一个蓝牙设备兼容蓝牙智能 4.2 才能正确建立此连接?
  • 有谁熟悉 bluez 可以推荐其他可尝试的步骤吗?

任何帮助将不胜感激。

乔恩

编辑1:

通过安装从此处下载的 3.19 预构建内核,我能够使 Ubuntu 14.04 盒子和 Raspberry Pi 之间建立此连接: http://kernel.ubuntu.com/~kernel-ppa/mainline/linux-3.19.yz-queue/2016-01-07-vivid/

我仍然不明白为什么它不能在两个 Raspberry Pi 之间工作,但如果我找到解决方案,我会在这里发布它。

编辑2:

Ubuntu 14.04 运行 Bluez 4,而 Raspberry Pis 运行 Bluez 5。由于我无法连接两个 Raspberry Pis(运行 Bluez 5),我想我会尝试连接两个运行 Bluez 5 的 Fedora 23 实例,看看 Bluez 或 Raspberry Pis 是否有问题。在我的实验中,我在两个 Fedora 23 实例上遇到了与我在两个 Raspberry pis 上遇到的相同行为(连接后 6lowpan 连接在不到 30 秒内断开)。

Fedora 23 实例上运行的 bluez 版本是 5.35,Raspberry Pi 上运行的 bluez 版本是 5.23。

有人知道为什么 Bluez 5.x 会出现这种情况吗?

谢谢,

答案1

解决方案

我刚刚解决了这个问题。问题出在内核上。我安装了 Ubuntu 15,但遇到了与 Raspberry Pis 相同的问题,因此我下载了 4.4 内核的源代码,对其进行了配置并构建了一个新内核。新内核安装到位后,一切都运行良好。不确定是内核的补丁级别还是配置问题,但现在它可以正常工作了。

答案2

感谢您的帖子。去年我在研究 BTLE 上的 IPv6,遇到了与您完全相同的问题。大约 39 秒后,我的主设备和从设备之间的 BLE 上的 IPv6 链接断开了。这发生在 Linux 内核 v4.1.x 中(对于主设备和从设备)。主设备和从设备都使用相同的平台(抱歉,出于保密原因,我不能透露任何平台细节)。我只能说它是一个 x86_64 平台,运行使用 Yocto 平台构建的 Linux 操作系统。

然后,有趣的是,我设法在内核 3.19 上获得了更有希望的结果。我实际上在两个平台上都使用了 uBuntu 14.04 LTS。我能够手动将 BlueZ 版本从 BlueZ v4.101 升级到 BlueZ v5.x。我不记得我使用的是哪个版本的 BlueZ 5。然后,我按照与您类似的步骤操作,并成功将其保持了很长一段时间。我记得在那之后去吃晚饭,30 分钟后它仍然保持了连接。然后我继续整晚运行测试,连接保持了连接!

感谢您向我提供有关应使用哪个 Linux 内核版本的信息。关于所应用的补丁,也许它可能与以下补丁之一有关: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/log/?id=refs/tags/v4.4.27&qt=grep&q=6lowpan

相关内容