目標は、Linuxプラットフォームでモニターの製造元、製品ID、およびシリアル番号を取得することです。最終的にはC++プログラムからこの情報を入手する必要があります。しかし、私はコマンドラインメソッドも受け入れます。
答え1
この情報は/sys/class/drm
サブシステムを通じて提供されます。このようなツールxrandr
が広く使用されています。このサブシステムの各ディスプレイには、ファイルを含むディレクトリがありますedid
。識別データの拡張表示。
Debianベースのシステムでも2つのパッケージを使用できます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 ++アプローチではありませんが、これら2つのツールはおそらくCで書かれています。ソースコードを見て、どのライブラリを使用しているかを記録してください。
答え2
ほぼ同じ(edid出力の解析に違いはありません)2つのDell 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
また、注目に値するのは、Card0-DPが1-8で表示され、arandrでは0-7で表示されることです。したがって、edidをarandrに一致させるには1を減算します(DP-5 = DP-4およびDP-6 = DP-5)。