目标是获取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。