USB免驱设备(虚拟U盘)如何获取电脑当前系统时间?
1、STM32的USB虚拟成U盘后,从电脑端复制一个文件到该U盘中。在这个过程中可以获取到电脑的当前时间吗?2、目前排除了文件属性(创建时间,修改时间)和文件内容携带方式获取(生成和修改时间和拷贝动作有较大时间间隔,而最终都能同步拷贝动作时电脑的系统时间(该时间还手动更改))。
3、2所描述的内容是在竞品实物上做的实验动作,也排除了设备安装专属驱动情况。
特来请教属性USB通信的坛友支招{:smile:} 准备抓包分析,对USB通信本人纯粹是小白,也请推荐实用的抓包工具。 小白路过,没见过usb通信里头存在过什么时间戳。如果pc不能运行软件,u盘里头放个autorun或者其它让用户可以双击的程序?运行后写个time信息到u盘文件,误差应该1秒内? 本帖最后由 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
应该不是 可能在是连接的瞬间获取了一个时间。文件系统里面应该是没有这个的。可能纯粹是一个usb通信然后获取的时间 jaywen 发表于 2024-5-22 13:39
可能在是连接的瞬间获取了一个时间。文件系统里面应该是没有这个的。可能纯粹是一个usb通信然后获取的时 ...
(引用自5楼)
目前所了解的免驱设备,没法获取到时间戳。头疼中。。。。 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楼)
噢。。。。什么情况? 有没有一种可能,人家设备里面自带RTC? gzhuli 发表于 2024-5-27 21:22
有没有一种可能,人家设备里面自带RTC?
(引用自8楼)
圣手都来帮忙,有希望了{:victory:} 。
设备内部有RTC,但电池都是更换的,所以每次启动时(插入电脑,导入配置文件)会同步一次北京时间。 gzhuli 发表于 2024-5-27 21:22
有没有一种可能,人家设备里面自带RTC?
(引用自8楼)
https://qa.1r1g.com/sf/ask/2857370561/?share_token=18E98507-07F0-4B13-A803-B4F8EC489776&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1
这是网友研究的过程,但好像没成功。 zyw19987 发表于 2024-5-28 15:28
圣手都来帮忙,有希望了 。
设备内部有RTC,但电池都是更换的,所以每次启动时(插入电脑,导 ...
(引用自9楼)
再并个法拉电容就不怕了 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盘上的文件信息:
抓包数据:
初音之恋 发表于 2024-5-28 15:43
再并个法拉电容就不怕了
(引用自11楼)
实际测试,并非本地RTC决定。
插入到一台调快时间的电脑上,设备时间就自动变成调快后的时间。 thepresent 发表于 2024-5-28 17:20
https://item.taobao.com/item.htm?id=621981417136
抓包工具这个便宜,用起来也不错。
(引用自12楼)
这个思路还是通过读取文件的附带属性(修改时间,创建时间)时间作为系统时间对吗?
这个思路相对比较简单,不需要抓包,文件传输完成后,直接通过文件系统打开文件就可以获得文件的这些属性。但文件创建和修改时间并不是传输(复制)时的时间,(我还测试了,从电脑复制到U盘,文件系统并不认为修改了文件,所以时间任然是文件原来时间,并非复制的时间) 本帖最后由 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盘再次插入后,复制同样的文件也会以复制时的系统时间作为文件的创建时间。
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盘查看文件属性,并没有更新文件属性中的时间哦。 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盘后,文件的创建时间和修改时间会更新为复制操作的时间。如果需要保留原文件的时间戳,可能需要使用特定的复制工具或命令选项。 以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,win10开始没用过我就不清楚了 U盘单独分个区,属性写成只读。在这个分区里面,你固件生成个autorun.bat,运行你的写在flash里面的MFC程序,MFC程序里面读取电脑时间。就是不知道行不行?早问十年还能帮你做 zyw19987 发表于 2024-5-30 21:38
但是如果把u盘中的123.txt文件删除掉,之后重新插拔U盘,然后再复制123.txt到U盘,此时U盘里的123.txt文 ...
(引用自16楼)
可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件,在电脑端打开U盘查看文件属性,并没有更新文件属性中的时间哦。
你的测试条件是什么?电脑用的什么操作系统?u盘磁盘格式是什么?
从你下面的chatgpt的回答看,一般的操作系统会把U盘里文件创建时间设置为复制时的时间。 yeahmen 发表于 2024-5-30 22:46
U盘单独分个区,属性写成只读。在这个分区里面,你固件生成个autorun.bat,运行你的写在flash里面的MFC程序 ...
(引用自19楼)
老大,此时此刻好想回到过去{:lol:} thepresent 发表于 2024-5-31 08:46
你的测试条件是什么?电脑用的什么操作系统?u盘磁盘格式是什么?
从你下面的chatgpt的回答看,一般的操 ...
(引用自20楼)
您这么问就提醒产品的兼容性问题了。
目前主流的Windows系统应该都得支持才行。U盘格式就FAT32(用fatfs) Himem 发表于 2024-5-30 21:47
以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,win10开始没用过我就不清楚了 ...
(引用自18楼)
以前windows的readyboost倒是会悄悄的往U盘上写个文件来测速再删除,这个能监测到过程吗? 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接也可以试试。
我多年不搞技术只知道个大概,希望你能找到思路解决问题。 yeahmen 发表于 2024-5-31 16:38
FAT 文件系统里面删除文件,就是把他entry那里前面的HEX改成了E5,时间那些信息就是往后多少位,你对其写 ...
(引用自24楼)
如果在电脑上安装软件,那就相当于装驱动了。这样方法就简单了。
全程使用,只是复制一个文件到U盘(STM32),这个动作后,希望能获得电脑时间。 zyw19987 发表于 2024-5-31 16:46
如果在电脑上安装软件,那就相当于装驱动了。这样方法就简单了。
全程使用,只是复制一个文件到U盘(STM3 ...
(引用自25楼)
批处理文件小,也有获取系统时间那些指令,可以写好脚本,搞成AUTORUN,主要就看杀毒软件的干预情况 yeahmen 发表于 2024-5-31 16:52
批处理文件小,也有获取系统时间那些指令,可以写好脚本,搞成AUTORUN,主要就看杀毒软件的干预情况 ...
(引用自26楼)
这个怎么弄,有样例吗? bing批处理指令一大把,批处理获取日期时间,创建文件什么的。写好了winhex读一下这个文件,存成二进制到你的flash里面,或是C程序。接入电脑前fopen fwrite fclose 到你的盘里,USB初始化时要注意写入文件的位置。电脑一识别autorun 就run起来了,不过很容易被判定成毒 ... 所以之前说设置两个盘符,一个只读盘符就是这个意思。这样虽然杀不掉,就不知道能不能正常跑出批处理了,具体还要看这些杀毒软件 我不明白你这句话的意思:
可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件,在电脑端打开U盘查看文件属性,并没有更新文件属性中的时间哦
我使用普通U盘,用win11系统复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间就是复制文件时的系统时间。你实验的时候是每次插拔U盘吗? thepresent 发表于 2024-5-31 17:46
我不明白你这句话的意思:
可以确保插入时,U盘里没有待复制进来的相同名字的文件。直接用U盘测试复制文件, ...
(引用自29楼)
用win10系统复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间 不是 复制文件时的系统时间。
就是这个意思。前面强调U盘里是空的,并不是覆盖方式。 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盘? thepresent 发表于 2024-6-4 13:28
找了一个win10的电脑,用普通U盘,复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间 是...
(引用自31楼)
我也还在测试,我用复旦微的芯片。老哥你对USB比较熟悉吗?能否v上实时沟通一下zyw19987 thepresent 发表于 2024-6-4 13:28
找了一个win10的电脑,用普通U盘,复制一个文件到U盘,然后在U盘里查看文件属性,发现文件的创建时间 是...
(引用自31楼)
最新进展:格式化后发送文件到U盘,文件创建时间是当前电脑时间。
相同文件替换或删除后复制,文件创建时间并不更新。
目前先这样告一段落了,配置文件前确保时格式化的。
页:
[1]