通过 Wifi Direct (p2p) 服务将 Raspberry 与 Android 连接

Posted

技术标签:

【中文标题】通过 Wifi Direct (p2p) 服务将 Raspberry 与 Android 连接【英文标题】:Connect Raspberry with Android through Wifi Direct (p2p) services 【发布时间】:2016-11-28 13:45:22 【问题描述】:

我正在尝试使用 OS jessie 8 将 android 应用程序与覆盆子连接。

如果树莓派附近只有一个安卓设备可用,我可以手动连接。但是,如果有多个 android 设备可用,我无法确定树莓派必须连接哪个设备。为了解决这个问题,我正在尝试使用 WifiP2P 服务。

我正在使用类似 configuration 的东西。

p2p_supplicant.conf:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
driver_param=p2p_device=1
update_config=1
device_name=Pi
device_type=1-0050F204-1
p2p_go_intent=1
p2p_go_ht40=1

wlan接口的配置:

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

我使用 wpa_cli v2.3 手动连接到安卓设备。但我无法获取有关服务的任何信息(即服务名称或任何服务相关信息),我只收到以下信息:

>p2p_find
<3>P2P-DEVICE-FOUND 8a:79:7e:12:0f:22 p2p_dev_addr=8a:79:7e:12:0f:22 pri_dev_type=10-0050F204-5 name='Moto G (4)' config_methods=0x188 dev_capab=0x25 group_capab=0x0
>p2p_peers
8a:79:7e:12:0f:22
>p2p_serv_disc_req 00:00:00:00:00:00 02000001
P2P-SERV-DISC-RESP 8a:79:7e:12:0f:22 82 81000101002436383539646564652d383537342d353961622d393333322d313233343536373839303132095f70726573656e6365c00c0010011562756464796e616d653d4a6f686e20446f65363234116e616d653d5f766963696e69747961707011617661696c61626c653d76697369626c650f6c697374656e706f72743d363736373900010100095f70726573656e6365c00c000c012436383539646564652d383537342d353961622d393333322d313233343536373839303132c027

从documentation我知道事件P2P-SERV-DISC-RESP应该有以下格式:

P2P-SERV-DISC-RESP:指示接收到 P2P 服务发现 回复。事件后包含以下参数 前缀:源地址、服务更新指示符、服务响应 TLV(s) 作为 hexdump。

但是,我无法解码 tlv 的响应。我尝试使用在线解码器,但它们也无法正常工作。

如何解码此 tlv 的响应?或者如果我不能, 如何识别安卓设备?

【问题讨论】:

【参考方案1】:

只是为了(部分)完整性 - 尽管问题已经存在多年 - 此链接上的转换器:

https://tomeko.net/online_tools/hex_to_ascii.php?lang=en

将最后一个十六进制字符串(即81000101002436383539646564652d383537342d353961622d393333322d313233343536373839303132095f70726573656e6365c00c0010011562756464796e616d653d4a6f686e20446f65363234116e616d653d5f766963696e69747961707011617661696c61626c653d76697369626c650f6c697374656e706f72743d363736373900010100095f70726573656e6365c00c000c012436383539646564652d383537342d353961622d393333322d313233343536373839303132c027)解码为:

[129][0][1][1][0]$6859dede-8574-59ab-9332-123456789012[9]_presence[192][12][0][16][1][21]buddyname=John Doe624[17]name=_vicinityapp[17]available=visible[15]listenport=67679[0][1][1][0][9]_presence[192][12][0][12][1]$6859dede-8574-59ab-9332-123456789012[192]'

据此我推测如下:

本地网址: 6859dede-8574-59ab-9332-123456789012._presence._tcp

服务信息:

    buddyname=John Doe624 name=_vicinityapp 可用=可见 listenport=67679

根据链接,方括号中的十进制值对应于 32...126 范围之外的字节,虽然我已经能够在下面解码其中的一些,但我还没有解码。

但是,8a:79:7e:12:0f:22 文本是发送设备的 Mac 地址,可以清除它。

[192] 后面的单引号,vis-a-vis [192]' 似乎是预期消息的结尾,因为根据我的经验,该消息偶尔会在之后直接重复,而不是不寻常地看到连续四五个消息重复,每次重复结束时带有[192]'

不过我们可以进一步解码:

[129][0][1][1][0]$6859dede-8574-59ab-9332-123456789012[9]_presence[192][12][0][16][1][21] buddyname=John Doe624[17]name=_vicinityapp[17]available=visible[15]listenport=67679[0][1][1][0][9]_presence[192][12][0][12] [1]$6859dede-8574-59ab-9332-123456789012[192]'

注意美元符号 ($),它直接位于 Guid 之前,美元的十六进制是 24,十进制是 36 ... 并且 guid 的长度是 36 个字符。

所以现在变得更容易了 -

[9]_presence 等于 _presence 是 9 个字符长... [21]buddyname=John Doe624 等于 buddyname=John Doe624 长度为 21 个字符... [17]name=_vicinityapp——你猜对了,下面是17个字符…… [17]available=visible - 再一次,17 个字符长...... [15]listenport=67679 - 15 个字符长 ... [9]_presence - 9 个字符长 ... $6859dede-8574-59ab-9332-123456789012 - 如上所述,$ 表示 36 个字符长...

“魔数”

所以剩下以下“幻数”部分需要解决:

[129][0][1][1][0](开头) [192][12][0][16][1](将前面的 guid + bonjour 片段与后面的服务信息字符串分开) [0][1][1][0](服务信息字符串之后,第二个 bonjour dns 片段之前) [192][12][0][12][1](在重复 guid 之前) [192](在重复的 guid 之后但在重复标记之前)

然而,[192] 似乎代表了以下数据上下文的变化 - 由于 192 的 ascii 是直角(切线),因此作为分隔符,192 后面的内容似乎与192 之前的情况。

这似乎是合理的,因为它表明在第一个 192 之前是标头,在第二个 192 之前是构成 bonjour 域 url 的组件,在下一个 192 之前是服务信息字典(但是我的难题在这里是第二个 bonjour 片段与服务信息字典一起使用),最后 192 之前的内容(尽管是 guid 的重复)是 bonjour url 的唯一部分,它作为区分此服务与其他服务的关键。

当我取得更多进展时,我会继续努力并发表评论。

【讨论】:

以上是关于通过 Wifi Direct (p2p) 服务将 Raspberry 与 Android 连接的主要内容,如果未能解决你的问题,请参考以下文章

Android | WIFI Direct -1 Basic knowledge

Android | WIFI Direct -1 Basic knowledge

Android | WIFI Direct -1 Basic knowledge

关于 BroadcastReceiver 类的 Android WiFi Direct (P2P) 问题

Android WiFi Direct android.net.wifi.p2p.PEERS_CHANGED 收到无休止

Android Wifi Direct - 基于距离的 P2P 文件共享