如何在Linux下设置录音笔时间

 更新时间:2017年12月19日 08:34:24   作者:依云  
这篇文章主要介绍了如何在Linux下设置录音笔时间的方法,有这方面需要的朋友跟着学习下吧。

买了一个录音笔,效果比使用笔记本话筒录音好多了还省电。当然啦,我也曾试过使用手机录音,结果是,没能录多久就中断了(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()

相关文章

  • Linux使用ncdu查看磁盘使用的操作详解

    Linux使用ncdu查看磁盘使用的操作详解

    ncdu (NCurses Disk Usage) 是一个用于 Linux 和类 unix 系统的磁盘实用程序,它提供了一种比 du 等传统命令更具交互性和用户友好性的方式来查看和分析磁盘空间使用情况,本文给大家介绍了Linux使用ncdu查看磁盘使用的操作,需要的朋友可以参考下
    2025-02-02
  • 详解Linux中nginx如何重启、启动与停止

    详解Linux中nginx如何重启、启动与停止

    这篇文章主要给大家详细介绍了Linux中nginx如何重启、启动与停止/设置开机自启动,小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧<BR>
    2023-12-12
  • 解决启动php-fpm后访问不到php文件的办法

    解决启动php-fpm后访问不到php文件的办法

    今天碰了一个很奇怪的问题,当启动php-fpm后,发现居然访问不到php文件了,后来通过查看日志、分析+搜索终于解决了,现在将整个过程分享给大家,也方便同样遇到这个问题的同学们参考借鉴,下面来一起看看吧。
    2016-12-12
  • Vmvare虚拟机给ubuntu根目录分区介绍

    Vmvare虚拟机给ubuntu根目录分区介绍

    大家好,本篇文章主要讲的是Vmvare虚拟机给ubuntu根目录分区介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Linux文件操作新手指南之关于install命令的用法

    Linux文件操作新手指南之关于install命令的用法

    这篇文章主要介绍了Linux文件操作新手指南之关于install命令的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 解决Linux系统yum安装报错Cannot find a valid baseurl for repo的问题

    解决Linux系统yum安装报错Cannot find a valid base

    本文介绍了如何在Linux系统中设置本地yum源,包括修改yum配置文件、禁用默认网络源、创建挂载点以及挂载镜像文件等步骤,操作详细,适合需要离线安装软件或更新系统的用户参考
    2024-09-09
  • 详解linux系统调用原理

    详解linux系统调用原理

    这篇文章给大家详细讲述了linux系统调用原理的相关知识点内容,对此有兴趣的朋友参考学习下。
    2018-08-08
  • CentOS6.4安装Apache+MySQL+PHP图文教程

    CentOS6.4安装Apache+MySQL+PHP图文教程

    这篇文章主要介绍了CentOS6.4安装Apache+MySQL+PHP图文教程,需要的朋友可以参考下。
    2016-10-10
  • Linux curl表单登录或提交与cookie使用详解

    Linux curl表单登录或提交与cookie使用详解

    这篇文章主要给大家介绍了关于Linux curl表单登录或提交与cookie使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Linux系统具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 详解Linux中几个获取硬件详细信息的命令

    详解Linux中几个获取硬件详细信息的命令

    这篇文章主要介绍了详解Linux中几个获取硬件详细信息的命令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论