获取显示器的制造商和产品 ID 以及序列号

获取显示器的制造商和产品 ID 以及序列号

目标是获取Linux平台下显示器的制造商和产品ID以及序列号。我最终需要在 C++ 程序中获取这些信息。但我也接受命令行获取的方式。

答案1

此类信息可通过/sys/class/drm子系统获得。诸如此类的工具xrandr广泛使用。现在,该子系统中的每个显示器都有一个目录,其中包含一个文件edid扩展显示识别数据

在基于 Debian 的系统上有两个可用的软件包,edid-decode以及read-edid.两者似乎都工作正常,但在旧的和过时的模型上read-edid似乎工作得足够好,而edid-decode返回错误:

EDID block does NOT conform to EDID 1.3!
    Detailed block string not properly terminated
EDID block does not conform at all!
    Bad year of manufacture

所以我建议安装read-edid包。安装完成后,使用parse-edid命令如下:

$ parse-edid < /sys/class/drm/card0-HDMI-A-1/edid 
Checksum Correct

Section "Monitor"
    Identifier "X20G-NagaIII"
    ModelName "X20G-NagaIII"
    VendorName "SPT"
    # Monitor Manufactured week 42 of 2005
    # EDID version 1.3
    # Digital Display
    DisplaySize 410 310
    Gamma 2.20
    Option "DPMS" "true"
    Horizsync 30-92
    VertRefresh 40-86
    # Maximum pixel clock is 170MHz

另一个命令get-edid似乎连接到 i2c 总线,并自动计算出连接了哪些显示器以及可用的数据。当然,这不是 C++ 方法,但这两个工具很可能是用 C 编写的。考虑查看它们的源代码并记下它们使用哪些库。

答案2

我有两台几乎相同的 Dell U3014 显示器(解析 edid 输出没有差异),但在检查第 5 个和第 6 个显示端口的 edid 文件时,我可以看到不同的序列号:

# Compare edid output
diff -a /sys/class/drm/card0-DP-{5,6}/edid
1c1
PT�K���qO�@�����h��@.`0 6��!�P1V6N45V001L
---
PT�K���qO�@�����h��@.`0 6��!�P1V6N45V002L
4c4
<       ��P� #  �:�q8-@X,E��!�q X,%��!�rQ� n(U��!�
---
>       ��P� #  �:�q8-@X,E��!�q X,%��!�rQ� n(U��!�

# Better view of just serial numbers:
grep -ao 'P1V6N45V00.L' /sys/class/drm/card0-DP-*/edid
/sys/class/drm/card0-DP-5/edid:P1V6N45V001L
/sys/class/drm/card0-DP-6/edid:P1V6N45V002L

另外值得注意的是,card0-DP 被标记为 1-8,而在 arandr 中,它们被列为 0-7。因此,要将 edid 与 arandr 相匹配,您需要减去 1:DP-5=DP-4 和 DP-6=DP-5。

相关内容