以人类可读的形式获取显示器品牌和型号以及其他信息

以人类可读的形式获取显示器品牌和型号以及其他信息

我已经提取了连接到计算机的当前显示器的速记版本。
这是一个例子: vendor "VSC", prod id "18500"

在 Ubuntu 的监视器首选项中,它被标识为Viewsonic Corporation 16".

我如何提取这种人类可读的形式? ...另外,我如何确定监视器是 aCRT还是 a LCD? (这实际上是我开始这个任务的原因)

EDID格式可以在维基百科上找到:扩展显示识别数据
Vendor这是用于获取 EDID和的 代码Product id

edid=$(xrandr -q --verbose | 
         sed -n '/^[[:space:]]\+00ffffffffffff00/,/[^a-fA-F0-9[:space:]]/{
                                                  /[^a-fA-F0-9[:space:]]/d
                                                  s/[[:space:]]\+//g; p}')
nibble=({0..1}{0..1}{0..1}{0..1})
vend=$(for i in {16..19} ;do 
           printf "%s" ${nibble[$((16#${edid:$i:1}))]}
       done)
vend="$(for i in 1 6 11 ;do
            printf \\x$(printf %x $((2#${vend:$i:5} +64)))
        done)"
prod=$((16#${edid:22:2}${edid:20:2}))
printf "monitor: vendor \"%s\", prod id \"%s\"\n" "${vend}" "$prod"

编辑:以下是 outpt 的前导行xrandr -q verbose...直到 EDID 十六进制转储的末尾

Screen 0: minimum 320 x 200, current 1280 x 960, maximum 8192 x 8192
VGA1 connected 1280x960+0+0 (0x47) normal (normal left inverted right x axis y axis) 320mm x 240mm
        Identifier: 0x41
        Timestamp:  26386
        Subpixel:   unknown
        Clones:    
        CRTC:       0
        CRTCs:      0 1
        Transform:  1.000000 0.000000 0.000000
                    0.000000 1.000000 0.000000
                    0.000000 0.000000 1.000000
                   filter: 
        EDID:
                00ffffffffffff005a63444809000000
                15090101682018b1e84f22a157479925
                0f484ffffe00315945596159714f8140
                818001010101000000ff004848393231
                30303030390a2020000000fd0032781e
                46ff000a202020202020000000fc0056
                696577536f6e696320453737000000fc
                00312d320a2020202020202020200084
  1280x1024 (0x46)  108.0MHz +HSync +VSync
        h: width  1280 start 1328 end 1440 total 1688 skew    0 clock   64.0KHz
        v: height 1024 start 1025 end 1028 total 1066           clock   60.0Hz
  1280x960 (0x47)  ....  
        ...
        ... etc

答案1

在 Ubuntu 的显示器首选项中,它被识别为 Viewsonic Corporation 16"。我如何提取这个人类可读的形式?

人类可读的形式(“优派公司”)并不直接来自您的 EDID:Ubuntu 使用下面的 gnome 库。libgnome-desktop解码 edid 并通过pnp.ids转换三个字母的供应商 ID (“VSC”在您的特定情况下)转换为“显示的漂亮名称。
在我的系统上

grep VSC /usr/share/hwdata/pnp.ids

返回:

VSC    ViewSonic Corporation

除此之外,还可以从 EDID(即描述符块)中提取附加信息。来自相同的维基百科链接:

描述符块。详细的时序描述符,按优先顺序递减。在所有详细的时序描述符之后,允许使用附加描述符:

  • 监控范围限制(必填)
  • ASCII 文本(显示器名称(必需)、显示器序列号或非结构化文本)
  • 6 附加标准定时信息块
  • 色点数据

目前定义的描述符类型有:

  • 0xFF:显示器序列号(文本)
  • 0xFE:未指定的文本(文本)
  • 0xFD:监控范围限制。 6 或 13 字节二进制描述符。
  • 0xFC:监视器名称(文本)
  • 0xFB:附加白点数据。 2× 5 字节描述符,用 0A 20 20 填充。
  • 0xFA:附加标准时序标识符。 6×2字节描述符,用0A填充。

在您的 EDID 中,描述符 1(字节 54-71)中有0xFF(序列号):

00 ff 00 48 48 39 32 31 30 30 30 30 39 0a 20 20 00 00

0xFC并且描述符 3(字节 90–107)和 4(字节 108–125)中有(监视器名称):

  00 fc 00 56 69 65 77 53 6f 6e 69 63 20 45 37 37 00 00
  00 fc 00 31 2d 32 0a 20 20 20 20 20 20 20 20 20 00 84

所以只需从那里提取信息即可,例如描述符 3:

56 69 65 77 53 6f 6e 69 63 20 45 37 37>>优派E77


最后,我不知道如何确定(在linux中)显示器是LCD还是CRT。我不知道有任何库实现了这样的功能(比如这个来自微软)。

答案2

像这样的东西应该工作得更好(所有其他答案在这里都没有100%工作):

for file in `ls -1 /sys/class/drm/*/edid`; do text=$(tr -d '\0' <"$file"); if [ -n "$text" ]; then edid-decode "$file" | grep -e Manufacturer: -e Product; sleep 0.0001; fi done

我在这里用两台显示器进行了测试。我的主要显示器是内置笔记本电脑显示器,辅助显示器是 DELL 25"。输出如下:

Manufacturer: DELL Model 53359 Serial Number 809781068
Display Product Serial Number: YKFWP5790DGL
Display Product Name: DELL U2515H
Manufacturer: LGD Model 1133 Serial Number 0

您必须已edid-decode在发行版中安装了。我的设置是 DELL Latitude e5450 和 Ubuntu 20.04。

答案3

以下工具有助于解码 edid 信息: http://cgit.freedesktop.org/xorg/app/edid-decode

答案4

我一直在尝试获取一些连接到运行 Ubuntu 16.04 LTE 的旧电脑的戴尔平板显示器的型号。这是最终对我有用的方法。

  1. 我安装了 edid-decode 包。
$ sudo apt 更新
$ sudo apt install -y edid 解码
  1. edid-decode 手册页指出,
概要
    edid 解码 [输入] [输出]

描述
    [...]有两个参数,正常输出被抑制,并且
    二进制 EDID blob 被写入由
    第二个论点。 [...]

笔记
       并非所有字段都被解码或完全解码。一些
       字段的解码可能会损坏输出......

“注释”部分下有关损坏输出的声明正在发生在我身上。在输出一些人类可读的文本之前,运行 edid-decode 会产生一些乱码输出(非打印字符)。

鉴于手册页中的信息,我尝试了以下命令行:

$ edid-解码 /sys/class/drm/card0/card0-VGA-1/edid vga.edid

不幸的是,这并没有产生输出文件vga.edid。因此,我手动创建了一个名为的空文件vga.edid,然后重新运行 edid-decode 命令行:

$触摸vga.edid
$ edid-解码 /sys/class/drm/card0/card0-VGA-1/edid vga.edid

这次,edid-decode 将 EDID 数据转储到输出文件中vga.edid

接下来,我使用该应用程序xxd生成 file 内容的十六进制转储vga.edid。十六进制转储输出的最后一行产生了显示器的型号:

$ xxd vga.edid
[...其他的东西...]
00000070:0044 454c 2031 3930 3846 5042 4c4b 00ad.DEL 1908FPBLK..

因此,显示器是 Dell 1908FP(黑色外壳)。

FWIW,上面显示的 edid-decode 命令行也为显示器制造商显示了此信息:

制造商:DEL 型号 4047 序列号 xxxxxxxxx

(注意:我模糊了序列号值。)我环顾四周,但在网上找不到将整数值 4047 映射到特定戴尔显示器产品的查找表。

我已经在两台不同的戴尔显示器上尝试过这种方法,两者都是较旧的型号,并且它为两者生成了正确的戴尔型号。

相关内容