目标是在Linux平台下获取制造商和产品ID以及显示器的序列号。我最终需要在C++的程序中获得这些信息。但我也接受命令行的获取方法。
发布于 2019-03-15 09:26:57
这些信息可以通过/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编写的。请考虑查看它们的源代码,并注意它们使用的是哪些库。
发布于 2019-06-30 20:21:45
我有两个几乎相同的戴尔U3014显示器(在解析输出方面没有区别),但在检查第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同样值得注意的是,卡片0-DP被标记为1-8,在那里,就像在arandr中一样,它们被列为0-7。因此,为了使之与数组匹配,减去一个: DP-5=DP-4,DP-6=DP-5。
https://unix.stackexchange.com/questions/506449
复制相似问题