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

for*_*ama 5 android raspberry-pi wifi-direct wifip2p

我正在尝试使用OS jessie 8连接一个带有覆盆子的Android应用程序.

如果覆盆子附近只有一个安卓设备,我可以手动连接.但是如果有多个Android设备可用,我无法识别覆盆子必须连接的设备.为了解决这个问题,我试图使用WifiP2P服务.

我正在使用类似这样的配置.

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
Run Code Online (Sandbox Code Playgroud)

配置wlan接口:

sudo wpa_supplicant -B -dd -iwlan0 -Dnl80211 -c/etc/wpa_supplicant/p2p_supplicant.conf
Run Code Online (Sandbox Code Playgroud)

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

>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
Run Code Online (Sandbox Code Playgroud)

文档中我知道事件P2P-SERV-DISC-RESP应该具有以下格式:

P2P-SERV-DISC-RESP:指示P2P服务发现响应的接收.事件前缀后面包含以下参数:源地址,服务更新指示符,服务响应TLV作为hexdump.

但是,我无法解码tlv的响应.我尝试使用在线解码器,但他们也没有工作.

我如何解码这个tlv的响应?或者,如果我不能,我怎么能识别Android设备?

Xam*_*tic 1

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

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

将最后一个十六进制字符串 ie 解码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]'
Run Code Online (Sandbox Code Playgroud)

据此我推测如下:

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

服务信息:

  1. buddyname=John Doe624
  2. 名称=_vicinityapp
  3. 可用=可见
  4. 监听端口=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=约翰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相当于_presence9 个字符长...
  • [21]buddyname=John Doe624相当于buddyname=John Doe62421 个字符长...
  • [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](重复引导之前)
  • [192](在重复引导之后但在重复标记之前)

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

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

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