14. 公共信息获取
大家好,我是程序喵。
上一章节中,我介绍了项目中上报模块的实现,本节我们来点轻松的,介绍下如何获取公共信息。
为什么要获取公共信息?
上报每一条埋点数据时,我们其实最好还是需要拼接一些其他公共信息和系统信息,这样才方便我们排查问题。
具体要获取的信息字段,我其实在前面章节中有过介绍,这里再简单贴一下:

这其中很多有一些字段需要用户配置进来,但也有些字段需要我们内部自己获取。
比如:
- system_version
- device_name
- device_id
- buried_version
- lifecycle_id
- timestamp
- process_time
本节我就主要介绍如何获取和生成这些字段值。
system_version
由于我们这个项目是针对Windows平台,所以需要获取Windows的系统版本,可以直接调用系统的API,详见代码:
通过GetVersionExA方法给os_version_info赋值,然后将major、minor、build三个字段拼接即可。
device_name
device_name和system_version类似,都和操作系统强相关,这里也需要使用Windows API获取:
device_id
device_id作为设备唯一的ID,它稍微麻烦一些,需要我们先生成一个随机数,作为设备ID,存到设备的某个固定的位置,后面每次都从这个位置读取,这样才可以保证重启程序或者重启设备后,获取到的device_id是一致的。
存到哪里呢?Windows下我们可以存到注册表里,正常用户一般不会查看和改动注册表,这里还涉及到注册表相关的编码:
代码中可以看到,我们将相关数据存到了HKEY_CURRENT_USER\Software\Buried下面。
写完代码运行后,我们也可以打开Windows的注册表,查看是否存储成功。

buried_version
用这个version表示SDK的版本号,这个版本号我们通过CMake生成,可以看到项目src目录下有个buried_config.h.in文件,内容如下:
那如何使用这个文件呢?再看src目录下的CMakelists.txt文件,有一行这样的代码:
根目录的CMakeLists.txt就设置了项目的PROJECT_NAME和VERSION:
这样通过cmake编译后,就会自动生成build_config.h的头文件,我们只需include这个头文件,就可以获取buried_version:
lifecycle_id
标识某一进程的id,这个好弄,一个static的随机数即可:
process_time
获取进程的运行时间直接调用Windows的API方法即可,不过Windows的GetProcessTimes获取出来的时间是FILETIME,还需要我们自己转成SystemTime才可以,具体可以看下面的代码:
有了这些公共信息后,上报的埋点才更有意义,更方便我们排查问题。
到这里,整个公共信息模块已经介绍完毕,下期见。
