如何通过EDID识别Linux主机连接的显示器与HDMI中继器?
基于EDID识别Linux主机连接的显示器/HDMI中继器
问题背景
我司拥有大量显示器与HDMI中继器,需对这些显示设备进行区分识别,以便Linux主机检测当前连接的是哪台显示器/中继器。
虽然Linux主机可从/sys/class/drm/*/edid获取EDID,但我不确定如何以此识别显示器/中继器,具体疑问如下:
- 若EDID数据未被篡改,是否会永久保持恒定?
- 若是,只需收集所有EDID二进制文件(或其哈希签名)即可。是否有相关EDID规范或标准可参考?
- 我担忧部分显示器在切换模式(如分辨率、旋转)时会改变EDID内容,这类临时标识符并无用处。
- 能否从EDID中提取唯一标识符?
- 若EDID可能变更,则需从EDID二进制文件中提取唯一标识符。根据EDID规范,EDID二进制包含以下标识符字段:
- Manufacturer ID(位于头部)
- product code(位于头部)
- serial number(位于头部)
- Display Product Serial Number(位于显示描述符)
- 但serial number与Display Product Serial Number均为可选字段,是否有方法从EDID二进制文件中提取有效的唯一标识符?
- 若EDID可能变更,则需从EDID二进制文件中提取唯一标识符。根据EDID规范,EDID二进制包含以下标识符字段:
解决方案
1. EDID的恒定性问题
在未被篡改的前提下,EDID数据是永久恒定的,不会因为显示器切换分辨率、旋转等显示模式而改变。EDID是存储在显示器/中继器内部EEPROM中的固定数据,核心作用是向主机报告设备固有属性,显示模式切换属于动态运行状态,不会修改EEPROM内的EDID内容。
相关规范可参考VESA发布的EDID标准(目前主流为EDID 1.4和EDID 2.0),标准明确规定EDID是设备的固有标识数据,除非物理改写EEPROM,否则不会变更。
如果担心个别设备存在异常,可实际测试:切换不同显示模式后,读取/sys/class/drm/*/edid并计算哈希值,正常情况下哈希值应完全一致。此时直接收集所有设备的EDID哈希签名,即可作为唯一标识区分设备。
2. 从EDID提取唯一标识符的方法
若因特殊场景(如部分中继器EDID可配置)导致EDID可能变更,或需要更精细化的标识提取,可按以下优先级组合EDID字段作为唯一标识:
- 优先级1:Display Product Serial Number + Manufacturer ID + Product Code
Display Product Serial Number是描述符字段,虽为可选,但多数正规品牌显示器都会填充(通常为设备实际序列号),结合强制存在的厂商代码和产品型号代码,三者组合基本能保证唯一性。 - 优先级2:Serial Number(头部) + Manufacturer ID + Product Code
若Display Product Serial Number不存在,可使用头部的Serial Number字段,同样结合厂商和产品代码。注意头部的Serial Number是4字节数值型字段,部分设备会用它存储序列号。 - 优先级3:EDID哈希值兜底
若上述可选字段均为空,直接计算整个EDID文件的哈希值(如SHA-256),只要EDID不变,哈希值就是唯一的。对于HDMI中继器,只要其EDID固定(多数商用中继器均如此),哈希值也能有效区分。
在Linux下,可使用edid-decode工具(部分发行版需单独安装)解析EDID内容,快速查看各字段值:
edid-decode /sys/class/drm/card0-HDMI-A-1/edid
内容的提问来源于stack exchange,提问作者takaomag
相关产品推荐
相关产品推荐

