前言
剛進公司工作第一年接觸到的就是 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
Initiator 會透過 AP or GO 送出
TDLS Discovery Request
給 Target如果 Target 具備 TDLS,那就送出
TDLS Discovery Response
給 Initiator,這段 data frame 內的資訊會夾帶 Taget 的通訊能力,包含 support rates 還有 support channelsTDLS Discovery
也會評估目前的 AP 與其他可連接的 TDLS Device 的訊號強度,藉此來決定是否要建立 TDLS link,所以有可能不會建立 TDLS linkComparing: AP 與 Initiator 之間的訊號強度 vs Target 與 Initiator 之間的訊號強度
Setup and Teardown
Initiator 透過 AP 送出
TDLS Setup Request
給 Target,這段 data frame 內的資訊會夾帶了 Initiator 的通訊能力Target 一樣會透過 AP 回應
TDLS Setup Response
,資訊夾帶了 Target 的通訊能力以及 status code (accept or reject the setup request)如果 Setup Request 被接受了,Initiator 會送出
TDLS Confirm Frame
給 AP兩個裝置間開始用 TDLS link 溝通,兩個裝置都有可能送出
TDLS Teardown Frame
來中斷 TDLS link,如果送不出去會改交由給 AP
啟用 TDLS
Android 有提供 API 讓我們輸入 remote device 的 IP/Mac address 來 enable 網卡的 TDLS
1 | // WifiManager |
1 | DeviceInfo deviceInfo = getCurrentDeviceInfo(); |
也有另個 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 決定