簡體   English   中英

通過 Wifi Direct (p2p) 服務將 Raspberry 與 Android 連接

[英]Connect Raspberry with Android through Wifi Direct (p2p) services

我正在嘗試使用 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

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

文檔中我知道事件 P2P-SERV-DISC-RESP 應該具有以下格式:

P2P-SERV-DISC-RESP:表示接收到 P2P 服務發現響應。 事件前綴后包含以下參數:源地址、服務更新指示符、服務響應 TLV(s) 作為 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

服務信息:

  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=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 的唯一部分,它作為鍵區分此服務與其他服務。

當我取得更多進展時,我會對此進行處理並發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM