为啥广播接收器没有检测到 WIFI_P2P_CONNECTION_CHANGED_ACTION?

Posted

技术标签:

【中文标题】为啥广播接收器没有检测到 WIFI_P2P_CONNECTION_CHANGED_ACTION?【英文标题】:Why isn't the WIFI_P2P_CONNECTION_CHANGED_ACTION being detected by the broadcast receiver?为什么广播接收器没有检测到 WIFI_P2P_CONNECTION_CHANGED_ACTION? 【发布时间】:2019-02-05 23:11:49 【问题描述】:

所以这是我第一次使用 wifi-direct,我试图通过 wifi-direct 将我的 android 手机连接到树莓派零 w。 在我的安卓手机上使用这个示例应用程序:https://github.com/ahmontero/wifi-direct-demo

我能够在 wpa_cli 界面中的 pi 上进入 Connected 状态 在设备名称下的手机上,我在进度对话框后面看到“已连接”,显示“正在连接到 1e:67:58:4c:78:92”,连接后应该将其关闭,但不是因为 WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION 是'连接后不会触发。

我的 wpa_supplicant.conf:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev 更新配置=1 国家=LB ap_scan=1 设备名称=覆盆子 device_type=1-0050F204-1 driver_param=use_p2p_group_interface=1 p2p_go_intent=7 p2p_go_ht40=1 p2p_listen_reg_class=81 p2p_listen_channel=1 p2p_oper_reg_class=81 p2p_oper_channel=1

并做了以下事情:

在树莓派上:

$sudo wpa_supplicant -B -dd -iwlan0 -Dnl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf

$sudo wpa_cli p2p-dev-wlan0

p2p_group_add 好的P2P-GROUP-STARTED p2p-wlan0-0 GO ssid="DIRECT-VC" freq=2412 passphrase="JrLfUAJf" go_dev_addr=5a:d3:65:e8:fc:e7 wps_pbc 好的P2P-DEVICE-FOUND 1e:67:58:4c:78:92 p2p_dev_addr=1e:67:58:4c:78:92 pri_dev_type=10-0050F204-5 name='HUAWEI' config_methods=0x188 dev_capab=0x25 group_capab=0x0 wfd_dev_info=0x00101c440032 新=1P2P-PROV-DISC-PBC-REQ 1e:67:58:4c:78:92 p2p_dev_addr=1e:67:58:4c:78:92 pri_dev_type=10-0050F204-5 name='HUAWEI' config_methods= 0x188 dev_capab=0x25 group_capab=0x0

在电话上: 我从谷歌运行 wifi direct 示例应用程序 我可以看到设备及其信息,当我点击连接时,我卡在连接进度对话框中并且无法通过该点进入连接模式,即使我在设备名称下看到“已连接”。

该应用程序似乎在两部手机之间运行良好,但使用 pi 当与 pi 建立连接时,WiFiDirectBroadcastReceiver.java 中的这一行不会被执行

else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action))

但是,当连接在超时后丢失时,它会被触发!

我的问题是我在这里做错了什么,为什么广播接收器没有检测到 WIFI_P2P_CONNECTION_CHANGED_ACTION?

注意:手机运行的是 Android 7.1 compileSdkVersion 26 targetSdkVersion 26

编辑:

正如 Ben 在下面的回答中指出的那样,我需要在 GO 设备(在我的情况下为 PI)上运行 DHCP 服务器,因此我继续按照第一部分在 pi 上安装和配置 DHCP 服务在这个链接https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md 但是,我不能再成功运行 sudo wpa_supplicant -B -dd -iwlan0 -Dnl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf 命令,因为它可能与 dhcp conf 冲突?知道如何在运行 DHCP 时启用 p2p 吗?

【问题讨论】:

【参考方案1】:

嗯, 因此,作为 GDPR(欧盟)实施和类似事情的一部分。 从 android 8 起,android 设备在任何事件上接收广播的方式都会受到限制(当然是为了隐藏一些设备特定的信息/规格。)

请看一下: https://developer.android.com/guide/components/broadcasts

干杯。

【讨论】:

感谢分享此信息,但是,在检查后我似乎没有违反新规则,正如我在两部手机之间运行时提到的那样,收到 WIFI_P2P_CONNECTION_CHANGED_ACTION 并且应用程序继续运行,在电话和 pi 之间它没有被捕获,它只捕获一个断开连接的动作。【参考方案2】:

您的 Raspberry Pi 处于 GO 角色,需要充当 DHCP 服务器。具有客户端角色的 Android 设备在通过 DHCP 从 GO 接收到 IP 地址之前不会广播WIFI_P2P_CONNECTION_CHANGED_ACTION

查看我的回答here了解更多详情。

【讨论】:

谢谢 Ben,您的回答很有意义,我正在尝试对其进行测试,但问题是在我按照此链接的第一部分 raspberrypi.org/documentation/configuration/wireless/… 在 pi 上安装和配置 dhcp 之后我不能再成功运行 sudo wpa_supplicant -B -dd -iwlan0 -Dnl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf 命令,因为它可能与 dhcp conf 冲突?知道如何在运行 dhcp 时启用 p2p 吗?

以上是关于为啥广播接收器没有检测到 WIFI_P2P_CONNECTION_CHANGED_ACTION?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用广播接收器检测蓝牙状态变化?

当应用程序关闭时,GCM 广播接收器未检测到 gcm 通知

如何检测服务和广播接收器中的关键事件

在android的广播接收器中检测日变化事件

如何检测服务和广播接收器中的关键事件

为啥Android要使用各种BroadcastReceiver