一年好景君须记,最是橙黄橘绿时。这篇文章主要讲述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。
【Linux到Android蓝牙网络共享(PAN)】在我的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
DestinationGatewayGenmaskFlags Metric RefUse Iface
192.168.10.0*255.255.255.0U000 bt-pan
123.456.78.16*255.255.255.252 U000 rmnet_data0# ip route get 192.168.10.5
192.168.10.5 via 123.456.78.18 dev rmnet_data0src 123.456.78.17uid 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);
很有帮助
推荐阅读
- 带有SpannableString的Android Canvas drawText
- Android(在服务中使用网络)
- 邮件发送到.herokuapp.com域
- Facebook AppRequests +浏览器兼容性
- Android中SVG和VectorDrawable的区别
- 有人可以帮我理解appendChild方法实际发生了什么吗()
- 线程“JavaFX Application Thread”中的异常java.lang.NoClassDefFoundError
- Android GSON使用POST方法
- 必须使用app access_token调用此方法