前言

剛進公司工作第一年接觸到的就是 Android 相關的產品開發

要搞 Android 產品需要看的東西滿多的,很難短時間內上手,加上有手機也有平板還有 Android TV,算是囫圇吞棗般的開始栽入 Android 這塊領域,所以不敢說自己很懂 Android,從底層到上層的範圍實在太大,投入比例最多的還是在應用層面

在公司參與了一個專案是關於兩台 Android Device 之間遠端連線操控的應用,在同一個網域下讓 Android Devices 用 TCP socket 的方式連接來傳送資料,也可以用 Bluetooth 的方式來連接

那時候為了要改善,使用網路作連線下的品質跟速度,用到了 TDLS 這個技術,網路資料其實不多,加上啟用 TDLS 時遇到了一些問題,這邊把當時紀錄的一些筆記放上來,希望對在查找 Android TDLS 的人會有幫助

Wi-Fi Direct

Wi-Fi Direct 又叫作 Wi-Fi P2P,是一種讓具備 Wi-Fi 的裝置在不需要路由器與熱點的情況下,可以進行點對點的無線連接,速度最高為 250MbP,最遠距離為 300m,採用 WPA2 的方式加密

P2P Group Owner

簡稱 GO,是類似於 AP 的角色,能允許被其他設備偵測發現並連線近來,一個 P2P Group 只能有一個 Owner

P2P Client

類似於 STA(Station) 的角色,本身不提供連接的功能,但能連接到 Group Owner

而 TDLS 建立在 Wi-Fi Direct 的基礎上,來建立兩個 Device 之間的 link

TDLS links can be established between two devices that are communicating to a Group Owner (GO) on a Wi-Fi Direct connection. In this case, the link is activated the same way as in a Wi-Fi network, only the GO acts as the AP in that situation

更多關於 Wi-Fi Direct 的資料可以參考 Android Wi-Fi Direct overview

TDLS

TDLS(Tunneled Direct Link Setup) 可以在同個網路下直接建立起兩個 Device 之間的 communication link,來減少封包被傳遞的次數,因為在基本的 Wifi 網路架構下,封包需要透過 AP(Access Point) 來當中介人傳遞,也就是說封包是被二次傳遞的,透過 TDLS 的技術可以有效提升速度,特別是兩個很近的 Device

A seamless way to stream media and other data faster between devices already on the same Wi-Fi network. Devices using it communicate directly with one another, without involving the wireless network’s router.

TDLS 能夠使傳輸效率在最佳的 Level 而不必管 AP 的支援程度

  • e.g. 如果 AP 只支援 802.11g,但兩個 TDLS Enabled Device 可以支援到 802.11n,那就能夠傳輸在比 802.11g 更高的 data rates 上

關於傳輸效率的 Level,參考 IEEE 802.11 的維基百科

TDLS 如何運作

大略描述下在兩個 Device 之間, TDLS 是如何傳輸資料和運作的 (frame exchanges)

DISCOVERY

  1. Initiator 會透過 AP or GO 送出 TDLS Discovery Request 給 Target

  2. 如果 Target 具備 TDLS,那就送出 TDLS Discovery Response 給 Initiator,這段 data frame 內的資訊會夾帶 Taget 的通訊能力,包含 support rates 還有 support channels

  3. TDLS Discovery 也會評估目前的 AP 與其他可連接的 TDLS Device 的訊號強度,藉此來決定是否要建立 TDLS link,所以有可能不會建立 TDLS link

    Comparing: AP 與 Initiator 之間的訊號強度 vs Target 與 Initiator 之間的訊號強度

Setup and Teardown

  1. Initiator 透過 AP 送出 TDLS Setup Request 給 Target,這段 data frame 內的資訊會夾帶了 Initiator 的通訊能力

  2. Target 一樣會透過 AP 回應 TDLS Setup Response,資訊夾帶了 Target 的通訊能力以及 status code (accept or reject the setup request)

  3. 如果 Setup Request 被接受了,Initiator 會送出 TDLS Confirm Frame 給 AP

  4. 兩個裝置間開始用 TDLS link 溝通,兩個裝置都有可能送出 TDLS Teardown Frame 來中斷 TDLS link,如果送不出去會改交由給 AP

啟用 TDLS

Android 有提供 API 讓我們輸入 remote device 的 IP/Mac address 來 enable 網卡的 TDLS

1
2
// WifiManager
public void setTdlsEnabled (InetAddress remoteIPAddress, boolean enable)
1
2
3
4
DeviceInfo deviceInfo = getCurrentDeviceInfo();
InetAddress inetAddress = deviceInfo.getHostAddress();
mWifiManager.setTdlsEnabled(inetAddress, false);
mWifiManager.setTdlsEnabled(inetAddress, true);

也有另個 API 是查看目前裝置的網卡有沒有支援 TDLS

1
public boolean isTdlsSupported ()

如何檢查 TDLS 的狀態

先確認 Android Device 有支援 TDLS

1
adb shell iw list

兩台裝置連線後可以用 dmesg log 分別察看 Owner & Client 的 TDLS 相關的 log

應該會出現 TDLS_DISCOVER, TDLS_CONNECTED 等等的在 dmesg log 中

1
adb shell dmesg log

TDLS 的連線問題

TDLS 的標準已經釋出很久, 基本上大多 Android 手機都有支援, 但是對於 TDLS 我們只能讓他被啟用, 無法決定目前裝置要走原本的 AP 路線還是直接透過 TDLS 來溝通

根據文件上所描述的是 TDLS 是看情況執行的, 網卡會自己判斷走那一條路比較適合, 如果現在無線網路的連線品質不佳, 在 TDLS 被啟用的狀態下就會使用 TDLS 的方式連線

無論有沒有要用 TDLS, Call setTdlsEnabled 的那方都會送出 TDLS_DISCOVERY 來 check 是否能連上 TDLS peer, 一旦發現不需要 TDLS, 也會自行 Tear down

所以基本上啟用 TDLS 並不能保證裝置之間就一定會在 TDLS link 上溝通,還是要看網路環境和 AP 決定

TDLS White Paper (2012)