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

时间:2016-11-28 13:45:23

标签: android raspberry-pi wifi-direct wifip2p

我正在尝试使用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手动连接到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

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

  

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

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

如何解码此tlv的响应?或者如果我不能, 我怎样才能识别android设备?

1 个答案:

答案 0 :(得分:0)

仅出于(部分)完整性而已-尽管问题已经存在多年-此链接上的转换器:

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]末尾的单引号似乎是预期消息的结尾,因为根据我的经验,该消息偶尔会在其后直接重复,因此连续看到四到五个邮件重复并且在每次重复的末尾有[192]'并不稀奇。

但是我们可以进一步解码:

[129] [0] [1] [1] [0] $ 6859dede-8574-59ab-9332-123456789012 [9] _presence [192] [12] [0] [16] [1] [21]好友名称= John Doe624 [17]名称= _vicinityapp [17]可用=可见[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](在服务信息字符串之后但在第二个bondour dns片段之前)
  • [192] [12] [0] [12] [1](在重复引导之前)
  • [192](在重复的Guid之后但在重复标记之前)

但是[192]似乎表示以下数据上下文发生了变化-并且192的ascii是直角(切线),因此作为分隔符,192后面跟着是切线192之前。

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

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