如何以编程方式检索OSX板id信息

How to retrieve OS X board-id information programmatically

本文关键字:OSX id 信息 检索 方式 编程      更新时间:2023-10-16

如何在c++中以编程方式检索以下信息:

这是Mac OSX中的终端命令:

ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '"' '{print $2}'

我使用IOKit库来检索信息,如IOPlatformSerialNumber和PlatformUUID信息。但我找不到任何对应的"板id"键。

如果在C++代码中有IOPlatformExpertDeviceio_service_t句柄,则可以使用IORegistryEntryCreateCFProperty()函数来获取"board id"属性。期望接收到一个CFData对象,但请检查null和正确的类型id以确定。然后,使用常用的CFData方法以所需的形式提取数据。

如果您还没有IOService句柄,那么您应该能够使用IOServiceGetMatchingService()(我希望可以安全地假设只有一个IOPlatformExpertDevice实例。),或者使用IORegistryGetRootEntry()获取根,并使用IORegistryEntryGetChildEntry()或类似的方法将IORegistry图遍历到平台专家设备。

由于board-id属性没有命名的符号常量,您只需要对其进行硬编码:

CFTypeRef board_id_property = IORegistryEntryCreateCFProperty(
  platform_expert_device, CFSTR("board-id"), kCFAllocatorDefault, 0);

请注意,属性值可以采用不同的类型,包括CFNumberCFBooleanCFStringCFDataCFArrayCFDictionary,并且您需要准备好处理类型与预期类型不匹配的情况,或者返回NULL时(如果属性不存在)。使用CFGetTypeID()检查类型,例如:

if (board_id_property != NULL && CFGetTypeID(board_id_property) == CFDataGetTypeID())
{
    CFDataRef board_id_data = (CFDataRef)board_id_property;
    // safe to use CFData* functions now
    ...
    CFRelease(board_id_property);
}
else
{
    // Unexpected, do error handling.
    ...
    if (board_id_property != NULL)
        CFRelease(board_id_property);
}