搜索
bottom↓
回复: 32
打印 上一主题 下一主题

USB免驱设备(虚拟U盘)如何获取电脑当前系统时间?

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2024-5-20 14:15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、STM32的USB虚拟成U盘后,从电脑端复制一个文件到该U盘中。在这个过程中可以获取到电脑的当前时间吗?
2、目前排除了文件属性(创建时间,修改时间)和文件内容携带方式获取(生成和修改时间和拷贝动作有较大时间间隔,而最终都能同步拷贝动作时电脑的系统时间(该时间还手动更改))。
3、2所描述的内容是在竞品实物上做的实验动作,也排除了设备安装专属驱动情况。

特来请教属性USB通信的坛友支招

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

2
 楼主| 发表于 2024-5-20 14:17:51 | 只看该作者
准备抓包分析,对USB通信本人纯粹是小白,也请推荐实用的抓包工具。

出40入518汤圆

3
发表于 2024-5-20 14:22:30 | 只看该作者
小白路过,没见过usb通信里头存在过什么时间戳。如果pc不能运行软件,u盘里头放个autorun或者其它让用户可以双击的程序?运行后写个time信息到u盘文件,误差应该1秒内?

出0入1119汤圆

4
发表于 2024-5-20 14:31:34 | 只看该作者
本帖最后由 Himem 于 2024-5-20 14:47 编辑

In USB 3.0, there is a new added packet named Isochronous Timestamp Packet (ITP) which is used to carry host timing information to all active devices
好像还真有?不确定指的是自然时间还是host tick

应该不是

出0入10汤圆

5
发表于 2024-5-22 13:39:33 | 只看该作者
可能在是连接的瞬间  获取了一个时间。文件系统里面应该是没有这个的。可能纯粹是一个usb通信然后获取的时间

出0入0汤圆

6
 楼主| 发表于 2024-5-27 20:41:08 | 只看该作者
jaywen 发表于 2024-5-22 13:39
可能在是连接的瞬间  获取了一个时间。文件系统里面应该是没有这个的。可能纯粹是一个usb通信然后获取的时 ...
(引用自5楼)

目前所了解的免驱设备,没法获取到时间戳。头疼中。。。。

出0入0汤圆

7
 楼主| 发表于 2024-5-27 20:41:36 | 只看该作者
Himem 发表于 2024-5-20 14:31
In USB 3.0, there is a new added packet named Isochronous Timestamp Packet (ITP) which is used to ...
(引用自4楼)

噢。。。。什么情况?

出0入663汤圆

8
发表于 2024-5-27 21:22:26 | 只看该作者
有没有一种可能,人家设备里面自带RTC?

出0入0汤圆

9
 楼主| 发表于 2024-5-28 15:28:59 | 只看该作者
gzhuli 发表于 2024-5-27 21:22
有没有一种可能,人家设备里面自带RTC?
(引用自8楼)

圣手都来帮忙,有希望了
设备内部有RTC,但电池都是更换的,所以每次启动时(插入电脑,导入配置文件)会同步一次北京时间。

出0入0汤圆

10
 楼主| 发表于 2024-5-28 15:30:52 | 只看该作者
gzhuli 发表于 2024-5-27 21:22
有没有一种可能,人家设备里面自带RTC?
(引用自8楼)

https://qa.1r1g.com/sf/ask/28573 ... amp;wxshare_count=1
这是网友研究的过程,但好像没成功。

出0入16汤圆

11
发表于 2024-5-28 15:43:51 | 只看该作者
zyw19987 发表于 2024-5-28 15:28
圣手都来帮忙,有希望了 。
设备内部有RTC,但电池都是更换的,所以每次启动时(插入电脑,导 ...
(引用自9楼)

再并个法拉电容就不怕了

出0入4汤圆

12
发表于 2024-5-28 17:20:11 | 只看该作者
https://item.taobao.com/item.htm?id=621981417136
抓包工具这个便宜,用起来也不错。

主机复制文件到U盘时,通过SCSI命令给U盘发送写入指定数据到U盘Flash的某个地址区域,在这个过程中,U盘是不识别具体数据内容的。具体数据的内容和组织由主机来确定,主机根据之前获取到的u盘的磁盘格式(FAT32、NTFS)和分区信息等,来决定在U盘的哪个位置写入文件的元数据(文件名、创建时间为当前系统时间、修改时间等),然后决定在U盘的哪个位置写入文件的具体内容。
看你对时间同步的精确度要求有多高,要求不是太高的话,单片机模拟U盘时,可以通过分析数据内容来获取文件的创建时间等信息。需要在单片机处理U盘接收数据理函数中识别SCSI命令,判断写入的位置属于磁盘的FAT表区,然后从数据中提取出文件的创建时间。由于U盘磁盘格式多样,还有U盘当前的文件存储情况,所以识别过程有些复杂。如果让U盘固定为某种磁盘格式(如FAT32),相对会简单点。
刚才实验了往fat32格式的u盘传输文件(文件名123.txt),抓包的数据中可以看到时间信息。
Fat32的文件信息参考这个链接
https://blog.csdn.net/winafa/article/details/115319185


u盘上的文件信息:


抓包数据:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

13
 楼主| 发表于 2024-5-29 15:17:14 | 只看该作者
初音之恋 发表于 2024-5-28 15:43
再并个法拉电容就不怕了
(引用自11楼)

实际测试,并非本地RTC决定。
插入到一台调快时间的电脑上,设备时间就自动变成调快后的时间。

出0入0汤圆

14
 楼主| 发表于 2024-5-29 15:30:36 | 只看该作者
thepresent 发表于 2024-5-28 17:20
https://item.taobao.com/item.htm?id=621981417136
抓包工具这个便宜,用起来也不错。

(引用自12楼)

这个思路还是通过读取文件的附带属性(修改时间,创建时间)时间作为系统时间对吗?
这个思路相对比较简单,不需要抓包,文件传输完成后,直接通过文件系统打开文件就可以获得文件的这些属性。但文件创建和修改时间并不是传输(复制)时的时间,(我还测试了,从电脑复制到U盘,文件系统并不认为修改了文件,所以时间任然是文件原来时间,并非复制的时间)

出0入4汤圆

15
发表于 2024-5-29 17:00:17 | 只看该作者
本帖最后由 thepresent 于 2024-5-29 20:25 编辑
zyw19987 发表于 2024-5-29 15:30
这个思路还是通过读取文件的附带属性(修改时间,创建时间)时间作为系统时间对吗?
这个思路相对比较简 ...
(引用自14楼)



对于windows系统有问题,window会在打开U盘时读取磁盘目录,windows可能存在文件目录项缓存机制,如果发现U盘有某个文件(例如123.txt),即使删除这个文件然后再重新复制,也不会更新文件创建时间。
但是如果把u盘中的123.txt文件删除掉,之后重新插拔U盘,然后再复制123.txt到U盘,此时U盘里的123.txt文件的创建时间就会变成复制文件时的当前系统时间。
既然你写需求是每次插拔后复制文件时获取一次系统时间,那么可以插入U盘,复制文件文件到U盘,然后在单片机的程序中读取文件创建时间信息之后,把文件重命名或者把文件删除。
这样U盘再次插入后,复制同样的文件也会以复制时的系统时间作为文件的创建时间。

出0入0汤圆

16
 楼主| 发表于 2024-5-30 21:38:10 | 只看该作者
thepresent 发表于 2024-5-29 17:00
对于windows系统有问题,window会在打开U盘时读取磁盘目录,windows可能存在文件目录项缓存机制,如果发 ...
(引用自15楼)


但是如果把u盘中的123.txt文件删除掉,之后重新插拔U盘,然后再复制123.txt到U盘,此时U盘里的123.txt文件的创建时间就会变成复制文件时的当前系统时间。
既然你写需求是每次插拔后复制文件时获取一次系统时间,那么可以插入U盘,复制文件文件到U盘,然后在单片机的程序中读取文件创建时间信息之后,把文件重命名或者把文件删除。
这样U盘再次插入后,复制同样的文件也会以复制时的系统时间作为文件的创建时间。

可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件,在电脑端打开U盘查看文件属性,并没有更新文件属性中的时间哦。

出0入0汤圆

17
 楼主| 发表于 2024-5-30 21:42:39 | 只看该作者
thepresent 发表于 2024-5-29 17:00
对于windows系统有问题,window会在打开U盘时读取磁盘目录,windows可能存在文件目录项缓存机制,如果发 ...
(引用自15楼)

以下是GPT的回复:
在大多数操作系统中,当你从电脑端复制文件到U盘时,U盘中文件的创建时间和修改时间通常会被设置为复制操作的时间,即文件被写入U盘的时间。这是因为在复制过程中,操作系统会将当前的系统时间写入文件的元数据中。

文件时间戳的处理
创建时间(Creation Time):这个时间戳记录了文件首次创建的时间。在复制文件到U盘时,创建时间通常会更新为文件复制到U盘的时间。

修改时间(Modification Time):这个时间戳记录了文件最后一次内容被修改的时间。在复制过程中,操作系统可能会更新这个时间戳为文件复制到U盘的时间,但有时也可能保留原文件的修改时间,这取决于操作系统和文件系统的具体实现。

访问时间(Access Time):这个时间戳记录了文件最后一次被访问的时间。在复制过程中,操作系统可能会更新这个时间戳为复制时的时间。

操作系统行为
Windows:在Windows系统上,复制文件到U盘时,默认情况下文件的创建时间会更新为复制的时间,而修改时间可能会保留原文件的时间(取决于具体操作)。访问时间通常会更新为复制时间。

Linux:在Linux系统上,使用 cp 命令复制文件时,可以使用 -p 选项保留文件的时间戳信息。默认情况下,创建时间会更新为复制的时间,修改时间和访问时间可能保留原文件的时间。

文件系统的影响
不同文件系统处理时间戳的方式也可能不同。例如:

FAT32:通常会更新创建时间和访问时间为复制时的时间。修改时间可能保留原文件的时间,但具体行为取决于操作系统。

NTFS:可能保留更多的时间戳信息,如原文件的修改时间和访问时间,但创建时间通常会更新为复制的时间。

确认方法
要确认文件时间戳,可以在文件复制后查看文件的属性。例如,在Windows上,你可以右键点击文件选择“属性”,查看“创建时间”、“修改时间”和“访问时间”。在Linux上,可以使用 stat 命令查看文件的时间戳信息。

例外情况
某些高级文件复制工具或备份软件(如 rsync)可以保留文件的原始时间戳信息。这些工具提供选项来保持文件的创建、修改和访问时间,使得复制后的文件时间戳与原始文件保持一致。

总结
一般情况下,复制文件到U盘后,文件的创建时间和修改时间会更新为复制操作的时间。如果需要保留原文件的时间戳,可能需要使用特定的复制工具或命令选项。

出0入1119汤圆

18
发表于 2024-5-30 21:47:42 | 只看该作者
以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,win10开始没用过我就不清楚了

出0入0汤圆

19
发表于 2024-5-30 22:46:10 | 只看该作者
U盘单独分个区,属性写成只读。在这个分区里面,你固件生成个autorun.bat,运行你的写在flash里面的MFC程序,MFC程序里面读取电脑时间。就是不知道行不行?早问十年还能帮你做

出0入4汤圆

20
发表于 2024-5-31 08:46:23 | 只看该作者
zyw19987 发表于 2024-5-30 21:38
但是如果把u盘中的123.txt文件删除掉,之后重新插拔U盘,然后再复制123.txt到U盘,此时U盘里的123.txt文 ...
(引用自16楼)
可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件,在电脑端打开U盘查看文件属性,并没有更新文件属性中的时间哦。

你的测试条件是什么?电脑用的什么操作系统?u盘磁盘格式是什么?
从你下面的chatgpt的回答看,一般的操作系统会把U盘里文件创建时间设置为复制时的时间。

出0入0汤圆

21
 楼主| 发表于 2024-5-31 15:08:38 | 只看该作者
yeahmen 发表于 2024-5-30 22:46
U盘单独分个区,属性写成只读。在这个分区里面,你固件生成个autorun.bat,运行你的写在flash里面的MFC程序 ...
(引用自19楼)

老大,此时此刻好想回到过去

出0入0汤圆

22
 楼主| 发表于 2024-5-31 15:10:38 | 只看该作者
thepresent 发表于 2024-5-31 08:46
你的测试条件是什么?电脑用的什么操作系统?u盘磁盘格式是什么?
从你下面的chatgpt的回答看,一般的操 ...
(引用自20楼)

您这么问就提醒产品的兼容性问题了。
目前主流的Windows系统应该都得支持才行。U盘格式就FAT32(用fatfs)

出0入0汤圆

23
 楼主| 发表于 2024-5-31 15:11:51 | 只看该作者
Himem 发表于 2024-5-30 21:47
以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,win10开始没用过我就不清楚了 ...
(引用自18楼)


以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,这个能监测到过程吗?

出0入0汤圆

24
发表于 2024-5-31 16:38:51 | 只看该作者
zyw19987 发表于 2024-5-31 15:11
以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,这个能监测到过程吗? ...
(引用自23楼)

FAT 文件系统里面删除文件,就是把他entry那里前面的HEX改成了E5,时间那些信息就是往后多少位,你对其写好结构体,你读HEX应该读的到。假如windows不写这种文件,你用虽然老掉牙的MFC他有这些API 可以用,你也可以写个txt啥的在U盘里不是一样的效果。搞只读主要是怕那些杀毒软件傻掉了。Windows直接用批处理脚本不行吗?读个时间写个文件有什么问题吗。
电脑上搞个程序,检测到你的 STM32设备的USB描述符,搞几条USB command过去STM32接也可以试试。
我多年不搞技术只知道个大概,希望你能找到思路解决问题。

出0入0汤圆

25
 楼主| 发表于 2024-5-31 16:46:47 | 只看该作者
yeahmen 发表于 2024-5-31 16:38
FAT 文件系统里面删除文件,就是把他entry那里前面的HEX改成了E5,时间那些信息就是往后多少位,你对其写 ...
(引用自24楼)

如果在电脑上安装软件,那就相当于装驱动了。这样方法就简单了。
全程使用,只是复制一个文件到U盘(STM32),这个动作后,希望能获得电脑时间。

出0入0汤圆

26
发表于 2024-5-31 16:52:35 | 只看该作者
zyw19987 发表于 2024-5-31 16:46
如果在电脑上安装软件,那就相当于装驱动了。这样方法就简单了。
全程使用,只是复制一个文件到U盘(STM3 ...
(引用自25楼)

批处理文件小,也有获取系统时间那些指令,可以写好脚本,搞成AUTORUN,主要就看杀毒软件的干预情况

出0入0汤圆

27
 楼主| 发表于 2024-5-31 17:08:25 | 只看该作者
yeahmen 发表于 2024-5-31 16:52
批处理文件小,也有获取系统时间那些指令,可以写好脚本,搞成AUTORUN,主要就看杀毒软件的干预情况 ...
(引用自26楼)

这个怎么弄,有样例吗?

出0入0汤圆

28
发表于 2024-5-31 17:17:30 | 只看该作者
bing批处理指令一大把,批处理获取日期时间,创建文件什么的。写好了winhex读一下这个文件,存成二进制到你的flash里面,或是C程序。接入电脑前fopen fwrite fclose 到你的盘里,USB初始化时要注意写入文件的位置。电脑一识别autorun 就run起来了,不过很容易被判定成毒 ... 所以之前说设置两个盘符,一个只读盘符就是这个意思。这样虽然杀不掉,就不知道能不能正常跑出批处理了,具体还要看这些杀毒软件

出0入4汤圆

29
发表于 2024-5-31 17:46:22 来自手机 | 只看该作者
我不明白你这句话的意思:
可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件,在电脑端打开U盘查看文件属性,并没有更新文件属性中的时间哦

我使用普通U盘,用win11系统复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间就是复制文件时的系统时间。你实验的时候是每次插拔U盘吗?

出0入0汤圆

30
 楼主| 发表于 2024-6-4 11:01:21 | 只看该作者
thepresent 发表于 2024-5-31 17:46
我不明白你这句话的意思:
可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件, ...
(引用自29楼)



用win10系统复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间    不是   复制文件时的系统时间。

就是这个意思。前面强调U盘里是空的,并不是覆盖方式。

出0入4汤圆

31
发表于 2024-6-4 13:28:09 | 只看该作者
zyw19987 发表于 2024-6-4 11:01
用win10系统复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间    不是   复制文件时的 ...
(引用自30楼)

找了一个win10的电脑,用普通U盘,复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间 是 复制文件时的系统时间。U盘的磁盘格式是Fat32.
现在比较奇怪了,你得到的结果跟我的结果不一样。要么是电脑主机系统或硬件不同造成的问题,要么是U盘不同造成的问题。

参考https://segmentfault.com/a/1190000016159823,感觉主机系统或硬件不同的可能性不大。
你用的U盘是普通U盘还是单片机模拟的U盘?

出0入0汤圆

32
 楼主| 发表于 2024-6-4 16:01:50 | 只看该作者
thepresent 发表于 2024-6-4 13:28
找了一个win10的电脑,用普通U盘,复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间 是  ...
(引用自31楼)

我也还在测试,我用复旦微的芯片。老哥你对USB比较熟悉吗?能否v上实时沟通一下zyw19987

出0入0汤圆

33
 楼主| 发表于 2024-6-6 22:01:02 | 只看该作者
thepresent 发表于 2024-6-4 13:28
找了一个win10的电脑,用普通U盘,复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间 是  ...
(引用自31楼)

最新进展:格式化后发送文件到U盘,文件创建时间是当前电脑时间。
相同文件替换或删除后复制,文件创建时间并不更新。

目前先这样告一段落了,配置文件前确保时格式化的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 10:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表