通过Wifi Direct (p2p)服务连接树莓派和Android

6
我正在尝试使用OS jessie 8将Android应用程序与树莓派连接。如果只有一个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

无线网络接口的配置:

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

我使用版本为2.3的wpa_cli手动连接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

文档得知,事件“P2P-SERV-DISC-RESP”应具有以下格式:
P2P-SERV-DISC-RESP:指示接收P2P服务发现响应。在事件前缀后包含以下参数:源地址、服务更新指示器、十六进制转储的服务响应TLV。
但是,我无法解码tlv的响应。我尝试使用在线解码器,但它们也不能正常工作。
如何解码这些tlv的响应?或者,如果我无法解码,如何识别android设备?
1个回答

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]'

由此我推测以下内容:

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

服务信息:

  1. buddyname=John Doe624
  2. name=_vicinityapp
  3. available=visible
  4. listenport=67679

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

然而,文本8a:79:7e:12:0f:22是发送设备的MAC地址,这澄清了问题。

方括号中的单引号,在[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之前是组成Bonjour域URL的组件,在下一个192之前的是服务信息字典(然而我的难题在于第二个Bonjour片段与服务信息字典一起),在最后一个192之前的是Bonjour URL的唯一部分,作为区分该服务与其他服务的关键。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接