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