通過adb從設備持續導出數據流

1. 背景

我需要分析設備的錄音數據,但很可惜,設備存儲空間比較小,錄個幾秒就爆了,遠遠達不到幾分鐘甚至幾個小時的持續錄音要求。本地存儲放不下,又不支持拓展可移動存儲,爲什麼不實時導出到PC呢?

剛好我的設備支持 adb,就不開發個新工具了,直接用 adb 的端口映射。

adb 使用說明:http://adbcommand.com/client/41
adb 使用說明(中文翻譯):https://its401.com/article/qq_44704503/122761997
adb 官方說明:https://developer.android.com/studio/command-line/adb#forwardports

此方法其實不僅僅適用於錄音,所有持續的流數據都可以通過這方法導出,例如日誌。

2. 原理簡介

此處需要用到 adb forward 命令,實現設備端口與本地端口的映射,例如在 PC 端執行以下命令,可以實現本地端口 11111 與設備的端口 22222 綁定。

adb forward tcp:11111 tcp:22222

除了端口綁定之外,adb forward 還支持特殊文件的綁定,例如:

adb forward tcp:11111 dev:/dev/block/by-name/xxxx

下圖引用自 adb forward的細節(1):原理概述 ,清晰介紹了其原理。實際上 adb 的通信估計都是類似的操作,例如 adb push 有特定端口實現特定邏輯,而 adb forward 是提供給用戶自定義端口綁定的方法。

我們可以用下面的命令列出通過 adb forward 綁定的接口:

$ adb forward --list
xxxxxxxxxxxxxxx tcp:11111 tcp:22222

3. 操作步驟

3.1 通過socket

比較有參考價值的博客文章:https://blog.csdn.net/omnispace/article/details/80018705

參考上面的博文,本來也是想通過 socket 直接轉發的,但畢竟不熟悉網絡,出錯了不知道怎麼解決,尷尬....

可能是我環境的原因,按理是行得通的,記錄下來存檔吧

3.1.1 步驟1:綁定端口

adb forward tcp:6666 tcp:6666

3.1.3 步驟2:PC端接受

nc localhost 6666 > record.wav

執行沒反應,懷疑是步驟1的端口綁定還有問題...

3.1.2 步驟2:端上發送數據

arecord -D default -c 1 - | nc localhost 6666

執行報錯:

nc: can't connect to remote host (127.0.0.1): Connection refused

從這裏基本可以確定 3.1.1 的綁定端口還有問題,猜測是環境原因,畢竟我設備上的adb能力不是完整版本。

3.2 通過管道中轉

上述 3.1 的方案在我的環境無效,聯想到 adb 除了映射端口之外,還能映射文件,不如 創建個有名管道中轉?

3.2.1 步驟1:創建有名管道

mkfifo /data/audio_pipe

3.2.2 步驟2:綁定端口

adb forward tcp:6666 dev:/data/audio_pipe

3.2.3 步驟3:PC端接收數據

nc localhost 6666 > record.wav

3.2.4 步驟4:設備端發送數據

arecord -D default -c 1 /data/audio_pipe
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章