通过 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 收到无休止