Linux到Android蓝牙网络共享(PAN)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux到Android蓝牙网络共享(PAN)相关的知识,希望对你有一定的参考价值。

我正在使用支持蓝牙功能的[嵌入式] 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)...

如果有人知道发生了什么或知道为什么这个设置导致了问题 - 我会很高兴终于明白这一点。

[1] https://github.com/mk-fg/fgtk/blob/master/bt-pan

答案

我从来没有弄清楚为什么路由不起作用。

幸运的是,我可以设置我正在使用的库的SocketFactory(Paho MQTT)。因此 - 我使用ConnectivityManager查找蓝牙设备及其“网络”对象(提供'getSocketFactory')来设置MQTT中的SocketFactory。然后连接工作。

ConnectivityManager cm =(ConnectivityManager)ctx.getSystemService(CONNECTIVITY_SERVICE);
Networks[] nets = cm.getAllNetworks();

...找到蓝牙设备并使用'getSocketFactory'。找到蓝牙设备

cm.getNetworkInfo(network);

很有帮助

以上是关于Linux到Android蓝牙网络共享(PAN)的主要内容,如果未能解决你的问题,请参考以下文章

可以通过 iOS 中的蓝牙 PAN 与系留设备进行通信

Android使用蓝牙连接adb调试App

Android 到 Linux 蓝牙未找到所有 UUID

网络类型PANLANWLANCANMANWAN简单介绍

蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 蓝牙和无线有什么区别?

手机通过蓝牙共享网络给电脑上网