我正在使用支持蓝牙功能的[嵌入式] Linux设备,并希望通过蓝牙与Android设备共享它的内部网络(未连接到互联网)(尝试过Android 6.x和现在的7.1.2 - Lineage OS [rooted]) 。该设置已经适用于Linux或Windows客户端。我阅读了大量的帖子和文档,但我无法让它与Android设备一起使用:
我的Linux设备:dnsmasq作为DHPC服务器,蓝牙启用和“bt-pan”[1]启动并运行(桥接接口称为bt-pan0
)。通过Dbus-Events我自动“信任”任何新的连接设备。设备类(如果重要)使用hciconfig配置为0x020000。
在我的Android手机上,我配对(自动工作)并连接(使用“Internet访问”)我的Linux设备(热点)。在dnsmasq日志中,我看到连接的设备正确获取了IP地址。
从linux-box我可以在已发布的IP地址上ping手机,我看到一个新的bnep0
设备被创建并添加到bt-pan0
网桥。
当我通过adb shell
连接到我的手机时,我还看到正在使用我的dnsmasq提供的正确IP /网络掩码设置创建的bt-pan
设备。不幸的是,当启用Wifi或Mobile-Data时 - 我无法通过它的IP地址ping linux-box。禁用Wifi和移动数据时 - 设置正常。这是我通过adb shell
执行的一些命令的输出 - 如果需要更多输出,我将尽快提供它(移动数据IP地址在粘贴时由我修改):
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 bt-pan
123.456.78.16 * 255.255.255.252 U 0 0 0 rmnet_data0
# ip route get 192.168.10.5
192.168.10.5 via 123.456.78.18 dev rmnet_data0 src 123.456.78.17 uid 0
cache
# ip rule show
0: from all lookup local
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500: from all oif dummy0 uidrange 0-0 lookup dummy0
10500: from all oif rmnet_data0 uidrange 0-0 lookup rmnet_data0
10500: from all oif bt-pan uidrange 0-0 lookup bt-pan
13000: from all fwmark 0x10063/0x1ffff lookup local_network
13000: from all fwmark 0x100b9/0x1ffff lookup rmnet_data0
13000: from all fwmark 0x100ba/0x1ffff lookup bt-pan
14000: from all oif dummy0 lookup dummy0
14000: from all oif rmnet_data0 lookup rmnet_data0
14000: from all oif bt-pan lookup bt-pan
15000: from all fwmark 0x0/0x10000 lookup legacy_system
16000: from all fwmark 0x0/0x10000 lookup legacy_network
17000: from all fwmark 0x0/0x10000 lookup local_network
19000: from all fwmark 0xb9/0x1ffff lookup rmnet_data0
19000: from all fwmark 0xba/0x1ffff lookup bt-pan
22000: from all fwmark 0x0/0xffff lookup rmnet_data0
23000: from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000: from all unreachable
在bt-pan0
设备的dnsmasq配置中,我设置了一个空的default-gw(dhcp-option 3)和一个正确的DNS服务器(dhcp-option 6)。我读到了关于设置dhcp-option 121(无类静态路由)的问题,但这两者都不起作用(DHCP请求不查询121)...
如果有人知道发生了什么或知道为什么这个设置导致了问题 - 我会很高兴终于明白这一点。
我从来没有弄清楚为什么路由不起作用。
幸运的是,我可以设置我正在使用的库的SocketFactory(Paho MQTT)。因此 - 我使用ConnectivityManager查找蓝牙设备及其“网络”对象(提供'getSocketFactory')来设置MQTT中的SocketFactory。然后连接工作。
ConnectivityManager cm =(ConnectivityManager)ctx.getSystemService(CONNECTIVITY_SERVICE);
Networks[] nets = cm.getAllNetworks();
...找到蓝牙设备并使用'getSocketFactory'。找到蓝牙设备
cm.getNetworkInfo(network);
很有帮助