我想限制用户可以在Android(Cyanogenmod)上选择的Wifi网络。我采用的一种方法是在服务级别上过滤网络。但是,我找不到WifiManager如何绑定到wpa_supplicant。所以我的问题是:
回答问题1通常可以帮助我理解Android服务如何绑定到linux服务。
更新
进一步深入Android代码,我发现真正的问题是:
答案 0 :(得分:2)
Java Wifi-Stack如何与wpa_supplicant连接?
在“老旧的Android时间”中,Java依靠一些JNI与wpa_supplicant
进行通信,使用一对本地套接字(文件描述符)与文本形式进行通信。在文件des'上通过select()
写/读。一旦wpa_supplicant
运行(或hostapd)
,只要您正确配置了这些,就可以使用本地套接字来选择/读取/写入命令并从中获取结果。
请看这里有关它的一些解释:
https://w1.fi/wpa_supplicant/devel/ctrl_iface_page.html
您可以使用PC上的wpa_cli
或hostapd_cli
程序自行试验,这样做:向守护程序发送命令,获取异步响应,等等loop / rince / repeat。对于wpa,请使用其-C = ctrl_interface parameter
,并使用hostapd使用-g global control interface
路径选项,或在相应的配置文件中执行此操作。你基本上得到的是一种与守护进程通信的shell,因此它可以创建命令字符串并解析字符串响应。您可能会发现它位于wifi-legacy
或您的Android源代码树中的类似内容。
这是一种非常实用,简单的方法,只是起作用。
现在,真正的长期解决方案,与内核Wi-Fi mac80211/nl80211
层进行通信的正确方法是libnl
。从我所看到的,这就是Google现在使用的方式。 BUT! B UT:它带有陡峭的学习曲线,因为要用于它的libnl
库是非常可扩展/通用的,这意味着“执行最基本的操作很复杂”,并且libnl
附带了相当多的API更改。如果你是谷歌,没有问题,这是一项非常有价值的投资,我们无论如何都不会永远解决这个问题,所以去吧,我们将在任何地方使用它。使用libnl
与802.11内核层进行通信,并围绕该内核层构建一些更高级别的代码。
如果您是临时用户,欢迎使用几天(几周?)进入libnl
进行802.11使用。
答案 1 :(得分:0)
为了回答代码位置问题,IWifiManager.Stub在WifiServiceImpl中实现。在L之前,它在WifiService。