如何在Linux下設(shè)置錄音筆時(shí)間
買(mǎi)了一個(gè)錄音筆,效果比使用筆記本話(huà)筒錄音好多了還省電。當(dāng)然啦,我也曾試過(guò)使用手機(jī)錄音,結(jié)果是,沒(méi)能錄多久就中斷了(Android 就是這么不靠譜)。
我的錄音需要記錄較為準(zhǔn)確的時(shí)間信息。錄音筆怎么知道現(xiàn)在是什么時(shí)間呢?還好它沒(méi)有跟風(fēng),用不著聯(lián)網(wǎng)!
它帶了一個(gè)小程序,叫「錄音筆專(zhuān)用時(shí)間同步工具」(英文叫「SetUDiskTime」,可以搜到的)。是一個(gè) EXE 文件,以及一個(gè) DLL 文件。功能很棒,沒(méi)有廣告,沒(méi)有推薦,也不需要注冊(cè)什么亂七八糟的賬戶(hù),甚至都不需要打開(kāi)瀏覽器訪(fǎng)問(wèn)人家官網(wǎng)。就彈一個(gè)框,顯示當(dāng)前時(shí)間,確定一下就設(shè)置好時(shí)間了。這年頭,這么單純的 Windows 軟件還真是難得呢。
然而,它不支持我用的 Linux 啊。雖然我努力地保證這錄音筆一直有電,但是時(shí)間還是丟失了幾次,它的FAT文件系統(tǒng)也臟了幾次。每次我都得開(kāi) WinXP 虛擬機(jī)來(lái)設(shè)置時(shí)間,好麻煩。
Wine 是不行的,硬件相關(guān)的東西基本上沒(méi)戲。拿 Procmon 跟蹤了一下,也沒(méi)什么復(fù)雜的操作,主要部分就幾個(gè) DeviceIoControl 調(diào)用,但是看不到調(diào)用參數(shù)。試了試 IDA,基本看不懂……不過(guò)倒是能知道,它通過(guò) IOCTL_SCSI_PASSTHROUGH 直接給設(shè)備發(fā)送了 SCSI 命令。
既然跟蹤不到,試試抓 USB 的包好了。本來(lái)想用 Wireshark 的,但是 WinXP 版的 Wireshark 看來(lái)不支持。又嘗試了設(shè)備分配給 VBox 然后在 Linux 上抓包,結(jié)果 permission denied……我是 root 啊都被 deny 了……
那么,還是在 Windows 上抓包吧。有一個(gè)軟件叫 USBPcap,下載安裝最新版,結(jié)果遇到 bug。那試試舊版本吧。官網(wǎng)沒(méi)給出舊版本的下載地址,不過(guò)看到下載鏈接帶上了版本號(hào),這就好辦了。去 commit log 里找到舊的版本號(hào)替換進(jìn)去,https://dl.bintray.com/desowin/USBPcap/USBPcapSetup-1.0.0.7.exe,就好了~
抓好包,取到 Linux 下扔給 Wireshark 解讀。挺小的呢,不到50個(gè)包,大部分還都是重復(fù)的。很快就定位到關(guān)鍵位置了:
一個(gè) 0xcc 命令發(fā)過(guò)去,設(shè)備回復(fù)「ACTIONSUSBD」,大概是讓設(shè)備做好準(zhǔn)備。然后一個(gè) 0xb0 命令,帶上7字節(jié)數(shù)據(jù)發(fā)過(guò)去,時(shí)間就設(shè)置好了。簡(jiǎn)單明了,不像那些小米空氣凈化器之類(lèi)的所謂「物聯(lián)網(wǎng)」,通訊加密起來(lái)不讓人好好使用。
那么,這7字節(jié)是怎么傳遞時(shí)間數(shù)據(jù)的呢?我首先檢查了UNIX時(shí)間戳,對(duì)不上。后來(lái)發(fā)送這個(gè)字串看上去挺像YYYYMMDDHHMMSS格式的,只是明顯不是當(dāng)時(shí)的時(shí)間。啊,它是十六進(jìn)制的嘛!心算了幾個(gè),符合!再拿出我的 Python 牌計(jì)算器,確定年份是小端序的16位整數(shù)。
好了,協(xié)議細(xì)節(jié)都弄清楚了,接下來(lái)是實(shí)現(xiàn)。我原以為我得寫(xiě)個(gè) C 程序,調(diào)幾個(gè) ioctl 的,后來(lái)網(wǎng)友說(shuō)有個(gè) sg3_utils 包。甚好,直接拿來(lái)用 Python 調(diào),省得研究那幾個(gè) ioctl 要怎么寫(xiě)。
#!/usr/bin/env python3 import os import sys import struct import subprocess import datetime def set_time(dev): cmd = ['sg_raw', '-s', '7', dev, 'b0', '00', '00', '00', '00', '00', '00', '07', '00', '00', '00', '00'] p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE) dt = datetime.datetime.now() data = struct.pack('<HBBBBB', dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) _, stderr = p.communicate(data) ret = p.wait() if ret != 0: raise subprocess.CalledProcessError(ret, cmd, stderr=stderr) def actionsusbd(dev): cmd = ['sg_raw', '-r', '11', dev, 'cc', '00', '00', '00', '00', '00', '00', '0b', '00', '00', '00', '00'] subprocess.run(cmd, check=True, stderr=subprocess.PIPE) def main(): if len(sys.argv) != 2: sys.exit('usage: setudisktime DEV') dev = sys.argv[1] if not os.access(dev, os.R_OK | os.W_OK): sys.exit(f'insufficient permission for {dev}') actionsusbd(dev) set_time(dev) if __name__ == '__main__': main()
相關(guān)文章
linux系統(tǒng)虛擬主機(jī)開(kāi)啟支持SourceGuardian(sg11)加密組件的詳細(xì)步驟
這篇文章主要介紹了linux系統(tǒng)虛擬主機(jī)開(kāi)啟支持SourceGuardian(sg11)加密組件的詳細(xì)步驟,需要的朋友可以參考下2020-12-12Centos7實(shí)現(xiàn)磁盤(pán)限額設(shè)置方法
本篇文章給大家詳細(xì)分享了Centos7實(shí)現(xiàn)磁盤(pán)限額設(shè)置方法,對(duì)此有需要的朋友可以參考學(xué)習(xí)下。2018-02-02Apache Calcite 實(shí)現(xiàn)方言轉(zhuǎn)換的代碼
這篇文章主要介紹了Apache Calcite 實(shí)現(xiàn)方言轉(zhuǎn)換的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Linux中用rename命令批量替換文件名方法實(shí)例
這篇文章主要介紹了Linux中用rename命令批量替換文件名的方法,文中詳細(xì)介紹了在Debian或者Ubuntu下批量替換文件名的語(yǔ)法和實(shí)例代碼,對(duì)大家具有一定的參考價(jià)值,需要的朋友可以們下面來(lái)一起看看吧。2017-04-04telnet?Connection?refused端口不通如何處理
本文介紹了telnet命令的基本用途及排查telnet連接拒絕的處理思路,telnet主要用于測(cè)試網(wǎng)絡(luò)連接,如遇到連接問(wèn)題,可能是由于防火墻未開(kāi)放或目的主機(jī)服務(wù)未啟動(dòng),文章通過(guò)實(shí)際例子解釋了telnet命令的作用,并提供了解決網(wǎng)絡(luò)連接問(wèn)題的方法2024-10-10Linux命令搜索命令whereis與which的區(qū)別
這篇文章主要介紹了Linux命令搜索命令whereis與which的區(qū)別的相關(guān)資料,這里舉例說(shuō)明該如何區(qū)別他們之家的用法,需要的朋友可以參考下2017-08-08Linux推薦使用Xfce桌面環(huán)境的8個(gè)原因
今天小編就為大家分享一篇關(guān)于Linux推薦使用Xfce桌面環(huán)境的8個(gè)原因,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-09-09