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

标签 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接口(interface)的配置:
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: Indicate reception of a P2P service discovery response. The following parameters are included after the event prefix: source address, Service Update Indicator, Service Response TLV(s) as hexdump.



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

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

最佳答案

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

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
  • 名称=_vicinityapp
  • 可用=可见
  • 监听端口=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 个字符长...

  • “魔法数字”

    这样就剩下以下“魔数(Magic Number)”部分需要解决:
  • [129][0][1][1][0](开始时)
  • [192][12][0][16][1](将前面的 guid + bonjour fragment 与后面的服务信息字符串分开)
  • [0][1][1][0](在服务信息字符串之后但在第二个 bonjour dns fragment 之前)
  • [192][12][0][12][1](在重复 guid 之前)
  • [192](在重复的 guid 之后但在重复标记之前)

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

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

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

    关于android - 通过 Wifi Direct (p2p) 服务将 Raspberry 与 Android 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40845799/

    相关文章:

    android - 如何使用 Gradle 工具在 Android 中使用不同的数据库构建不同的 APK 文件?

    android - 如何在 Volley 中设置用户代理?

    c++ - 为 Raspberry pi 2 预编译 amazon-kinesis-video-streams-producer-sdk-cpp

    android - 为什么使用 Android 附近共享时通过蓝牙传输文件?

    android - 如何在不共享 android 中的互联网连接(热点)的情况下创建 wifi 网络共享?

    android - 如何在屏幕上拖动图像

    java - 如何设置背景颜色 TabHost

    python - 退出定义中的循环

    raspberry-pi - 如何在 Nerves 中设置 wlan0

    android - JellyBean 上的 WiFi-Direct,WPA 请求者搞砸了