如何在Linux下设置录音笔时间
作者:依云 发布时间:2021-11-10 22:24:54
买了一个录音笔,效果比使用笔记本话筒录音好多了还省电。当然啦,我也曾试过使用手机录音,结果是,没能录多久就中断了(Android 就是这么不靠谱)。
我的录音需要记录较为准确的时间信息。录音笔怎么知道现在是什么时间呢?还好它没有跟风,用不着联网!
它带了一个小程序,叫「录音笔专用时间同步工具」(英文叫「SetUDiskTime」,可以搜到的)。是一个 EXE 文件,以及一个 DLL 文件。功能很棒,没有广告,没有推荐,也不需要注册什么乱七八糟的账户,甚至都不需要打开浏览器访问人家官网。就弹一个框,显示当前时间,确定一下就设置好时间了。这年头,这么单纯的 Windows 软件还真是难得呢。
然而,它不支持我用的 Linux 啊。虽然我努力地保证这录音笔一直有电,但是时间还是丢失了几次,它的FAT文件系统也脏了几次。每次我都得开 WinXP 虚拟机来设置时间,好麻烦。
Wine 是不行的,硬件相关的东西基本上没戏。拿 Procmon 跟踪了一下,也没什么复杂的操作,主要部分就几个 DeviceIoControl 调用,但是看不到调用参数。试了试 IDA,基本看不懂……不过倒是能知道,它通过 IOCTL_SCSI_PASSTHROUGH 直接给设备发送了 SCSI 命令。
既然跟踪不到,试试抓 USB 的包好了。本来想用 Wireshark 的,但是 WinXP 版的 Wireshark 看来不支持。又尝试了设备分配给 VBox 然后在 Linux 上抓包,结果 permission denied……我是 root 啊都被 deny 了……
那么,还是在 Windows 上抓包吧。有一个软件叫 USBPcap,下载安装最新版,结果遇到 bug。那试试旧版本吧。官网没给出旧版本的下载地址,不过看到下载链接带上了版本号,这就好办了。去 commit log 里找到旧的版本号替换进去,https://dl.bintray.com/desowin/USBPcap/USBPcapSetup-1.0.0.7.exe,就好了~
抓好包,取到 Linux 下扔给 Wireshark 解读。挺小的呢,不到50个包,大部分还都是重复的。很快就定位到关键位置了:
一个 0xcc 命令发过去,设备回复「ACTIONSUSBD」,大概是让设备做好准备。然后一个 0xb0 命令,带上7字节数据发过去,时间就设置好了。简单明了,不像那些小米空气净化器之类的所谓「物联网」,通讯加密起来不让人好好使用。
那么,这7字节是怎么传递时间数据的呢?我首先检查了UNIX时间戳,对不上。后来发送这个字串看上去挺像YYYYMMDDHHMMSS格式的,只是明显不是当时的时间。啊,它是十六进制的嘛!心算了几个,符合!再拿出我的 Python 牌计算器,确定年份是小端序的16位整数。
好了,协议细节都弄清楚了,接下来是实现。我原以为我得写个 C 程序,调几个 ioctl 的,后来网友说有个 sg3_utils 包。甚好,直接拿来用 Python 调,省得研究那几个 ioctl 要怎么写。
#!/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()
猜你喜欢
- 由phpwind团队与淘宝图片导购联盟合作开发的“图片导购应用”近日正式发布,“图片导购应用”给站长带来了全新的盈利模式,利用“图片导购应用
- 一:持之以恒,每日更新。此条排在第一位,相信绝大多数个人站长不会有异议吧。一个网站从前期策划到建设维护再到后期推广,其中零碎烦琐之事不胜枚举
- 这两天在Suse上安装和配置FTP时,遇到不少问题,这里做一下总结:一、安装Suse的图形用户界面做的很不错,所以安装过程也比较简单。1、打
- 北京时间10月12日消息,据国外媒体报道,一份政府机构声明显示,德国总理默克尔对谷歌的图书扫描计划表示反对,这位女总理希望藉此在网上保护作者
- 什么是htaccess 概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess
- WordPress将其所有信息片段(包括文章、页面、评论、博客链接、插件设置等)存储在MySQL数据库中。 虽然WordPress用户可以通
- cpanel-wordpress博客换域名教程写yao1l.com转向yilongseo.com的过程,如果你的博客要换域名的不防可以看看,
- 安装步骤下载地址:6.0版本首先先安装好Oracle VM VirtualBox 安装好后 点击新建弹出新建页面后: 设置名称、安装文件夹、
- 10月28日消息,日本游戏大厂任天堂,计划要推出加大版DSi掌上型游戏机,屏幕将会大于4英寸,跟Sony的PSP差不多,而且还纳入更多新功能
- Yahoo推出的新搜索引擎机器人叫YahooSlurp。YahooSlurp跟GoogleBot一样,顺着每个HREF链接找到网站。它不会抓
- 步骤1、mount /dev/sr0 /media/2、安装所需要的软件安装并配置tftp服务yum install tftp tftp-s
- 在上一篇的确保Linux VPS及服务器更加安全之Xshell设置密钥登录文章中已经分享到XSHELL使用密钥登陆我们的VPS服务器确保机器
- 1. 打开虚拟机系统的网络设置2. 设置代理为手动,并填写代理ip和端口这里我的代理软件用的是Socket协议,故只填 Socket 主机一
- 为了方便广大网友从ftp站点查找资料,我们特意向您介绍这份国内大学ftp服务器站点列表,希望对你有用。成都信息工程学院ftp://xsc.c
- 作为中国千千万万草根中的一个,我深感荣幸,因为这么多人参与,正说明了这个行业是如此的朝阳。哈哈废话少说。其实刚开始对地方分类网站了解不多,初
- 11月20日消息,来自百度方面的数据显示,美国总统奥巴马访华成为近日网民关注的焦点。截至目前,百度百科的“奥巴马&
- 网站如何盈利,对于许多月收入不到数百的站长来说,确实是个横亘在眼前的一大难题。不过,在互联网大潮中,确实有许多站长在闷声赚钱,很多站长不是不
- godaddy空间控制面板中英文对照,方便英文不大行的站长操作godaddy的空间Account Summary(帐号信息总览)----Do
- 以前说过反向链接质量越高,对排名帮助越大。而质量高的外部链接,比较少是交换来的友情链接。不过话说回来,质量高的链接并不好找。很多时候交换链接
- 北京时间11月14日上午消息,据国外媒体今日报道,美国社交网站Ning已经搬迁到了Facebook原先的办公场所—&am