Sự cố nhiều thiết bị USB giống hệt nhau
Tôi có một chiếc Rasperry Pi với bốn camera. Tôi lấy pix với fswebcam
sẽ xác định các máy ảnh như /dev/video0
.. video3
. Đôi khi máy ảnh là video0
, vide02
, video4
và video6
nhưng chúng ta có thể quên về điều đó vào lúc này.
Tôi cần một ID liên tục để xác định số camera để, ví dụ như video0
luôn luôn là cùng một camera vì tôi chú thích ảnh. Thật không may, điều này không xảy ra một cách đáng tin cậy - khi khởi động, các máy ảnh được liệt kê là video0
.. video3
nhưng không phải lúc nào cũng như vậy.
Các máy ảnh đều có cùng ID và số sê-ri.
Giải pháp cho vấn đề này liên quan đến các quy tắc udev, nhưng cũng có rất nhiều lưỡi câu ở đó.
Nếu bạn ban hành lệnh
udevadm info –attribute-walk –path=/dev/video0
bạn nhận được một lượng lớn đầu ra nhưng các bit nổi bật là
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
Bit Kernels là một cổng trung tâm USB. Với bốn máy ảnh, có bốn trong số này - chúng không thay đổi khi khởi động lại, nhưng video{x}
liên kết với một cổng có thể thay đổi.
Vì vậy, chúng ta cần một quy tắc udev để buộc một số video vào cổng trung tâm USB - đại loại như:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
Trông đơn giản - truy cập máy ảnh với
fswebcam –d $realpath /dev/camera0
Ngoại trừ nó không hoạt động - nếu bạn đặt điều này trong quy tắc udev và hệ thống đã phân bổ video0 (khi khởi động) cho một cổng khác, quy tắc udev sẽ bị bỏ qua. Các symlink /dev/camera0
về cơ bản nói no such device
. Một hình vuông.
Những gì chúng tôi muốn là liên kết một liên kết tượng trưng với một địa chỉ trung tâm USB, không phải là một video{x}
số. Nó lấy một chương trình Python.
Bước đầu tiên là chạy
fswebcam –d /dev/video${x} tst.jpg
trong x
khoảng từ 1 đến 8. Sự tồn tại của tst.jpg
sau mỗi cuộc gọi sẽ xác định xem có camera trên số video này hay không. Từ đây tạo một danh sách các số video hoạt động. Kinh nghiệm của tôi đã được rằng nó là một trong hai 0,1,2,3
hoặc 0,2,4,6
cho máy ảnh Tôi đã sử dụng.
Những người khác tất nhiên có thể xây dựng danh sách này bằng cách sử dụng một quy trình khác.
Sau đó, cho mỗi số video trong danh sách chạy
udevadm info –attribute-walk –path=/dev/videox > dd
và trích xuất KERNELS= line
từ dd
. Từ quá trình này, bạn kết thúc với một danh sách các địa chỉ cổng USB cho máy ảnh. Sắp xếp danh sách này để ở bước tiếp theo, bạn luôn xử lý nó theo cùng một thứ tự. Gọi đây là "danh sách địa chỉ".
Chạy lại udevadm … > dd
thứ đó và tạo một danh sách giống như
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
Bây giờ bước qua danh sách địa chỉ - cho mỗi mục tìm mục nhập tương ứng từ danh sách video. Tạo một danh sách mới trông giống như một bộ sưu tập các dòng như
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
X (số liên kết tượng trưng) được thay thế bằng số thứ tự trong danh sách địa chỉ.
Bây giờ bạn có một quy tắc udev hoạt động. Một liên kết tượng trưng được gắn với một địa chỉ trung tâm USB bất kể số video nào được phân bổ cho cổng đó khi khởi động.
Viết danh sách cuối cùng vào một tập tin /etc/udev/rules.d/cam.rules
. Chạy udevadm trigger
để kích hoạt nó và công việc được thực hiện. /dev/camera2
sẽ là cùng một camera (cổng USB) bất kể số video của nó.