首页 文章

蓝牙PAN连接 - ARP无法正常工作

提问于
浏览
0

我的设置是一个嵌入式设备,可以从平板电脑访问(可能是Android或基于iOS) .

该设备通过蓝牙访问,它实现了PAN配置文件(NAP角色),这样平板电脑就可以将其视为可以访问互联网的设备 .

我使用DBus向Bluez注册NAP服务器 . 这很好用,Bluez在平板电脑连接时创建一个名为'bnep0'的网络接口 . 我在/ etc / network / interfaces中配置了bnep0接口:

iface bnep0 inet static
  address 10.254.239.1
  netmask 255.255.255.0
  post-up service isc-dhcp-server start
  pre-down service isc-dhcp-server stop

我使用udev使用/etc/udev/rules.d/50-bnep.rules中定义的规则来启动/关闭界面:

ACTION=="add", KERNEL=="bnep0" SUBSYSTEM=="net", RUN+="/sbin/ifup bnep0"
ACTION=="remove", KERNEL=="bnep0", SUBSYSTEM=="net", RUN+="/sbin/ifdown bnep0"

如您所见,我使用接口启动/关闭事件来启动/停止为平板电脑提供IP地址的DHCP服务器 .

我的DHCP服务器由/etc/dhcp/dhcpd.conf中的以下行配置:

subnet 10.254.239.0 netmask 255.255.255.0 {
  range 10.254.239.2 10.254.239.254;
}

另外,我还在/ etc / network / interfaces中创建了一个网桥br0 . 为了注册NAP接口,Bluez需要这样做:

iface br0 inet manual
  bridge_ports none
  bridge_fd 0
  bridge_stp off

这一切都很好 . 平板电脑将与我的设备进行蓝牙配对并成功连接 . 我还可以观察到平板电脑查询我设备的DHCP服务器并获得地址10.254.239.2

在我的设备上,我从命令'ip addr show'获得输出:

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 5c:e0:c5:af:7b:f6 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::984d:cdff:fe4b:65be/64 scope link 
       valid_lft forever preferred_lft forever
9: bnep0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000
    link/ether 5c:e0:c5:af:7b:f6 brd ff:ff:ff:ff:ff:ff
    inet 10.254.239.1/24 brd 10.254.239.255 scope global bnep0
       valid_lft forever preferred_lft forever
    inet6 fe80::5ee0:c5ff:feaf:7bf6/64 scope link 
   valid_lft forever preferred_lft forever

然后,我在我的嵌入式设备上启动一个应用程序,该应用程序在地址10.254.239.1,端口15137上打开TCP服务器套接字 . 应用程序侦听来自平板电脑的传入连接 .

现在我尝试从平板电脑打开TCP客户端套接字到IP地址10.254.239.1 . 我可以观察(使用wireshark)接口bnep0接收IP地址10.254.239.1的ARP请求 . 但我的设备不会生成任何ARP响应,平板电脑应用程序将在尝试连接TCP套接字时超时:-(

同样,如果我尝试从我的嵌入式设备ping平板电脑,我会发现我的设备发送了平板电脑正常响应的10.254.239.2的ARP请求 . 但就好像设备没有收到ARP响应一样,因为之后它不会发送任何ping请求 .

因此,症状是未处理接口bnep0上的传入ARP数据包 .

我真的不明白我错过了什么 . 你们有人可以帮助我吗?

1 回答

  • 0

    事实证明,问题是我自己对网桥如何工作缺乏了解 .

    我找到了非常有用的HOWTO Persistently bridge traffic between two or more Ethernet interfaces (Debian),它清楚地表明,一旦将网络接口添加到网桥,它就不能用作IP流量的 endpoints .

    因此,我需要做的是在/ etc / network / interfaces中更改网络接口的设置,使桥接器成为IP endpoints :

    iface br0 inet static
      address 10.254.239.1
      netmask 255.255.255.0
      bridge_ports none
      bridge_fd 0
      bridge_stp off
    

    请注意,可以完全省略bnep0的部分 .

    还要感谢ELinux - Bluetooth Network的灵感 .

相关问题