Xác định thiết bị USB


15

Tôi có năm máy ảnh USB, cùng nhãn hiệu, cùng model (Canyon CNR-FWC120H). Chúng được sử dụng để theo dõi các cảnh khác nhau 24/7. Tôi cần xác định bằng cách nào đó máy ảnh nào là từ bảng điều khiển Linux (Debian) hoặc lập trình (bất kỳ ngôn ngữ nào).

Tôi đã thử nhìn vào đầu ra của lsusb -vvv, có một trường iSerialnên khác nhau cho mỗi máy ảnh, nhưng thật không may, nhà sản xuất này đã quyết định không làm phiền và tất cả các máy ảnh đều có cùng một chuỗi tại nơi đó:200901010001

Có cách nào khác để tôi có thể xác định máy ảnh nào độc lập với cổng USB mà chúng được kết nối không vì trong trường hợp cụ thể của tôi, tôi không thể dựa vào thực tế là cùng một máy ảnh sẽ luôn được kết nối với cùng một cổng.

CẬP NHẬT Sau một số thảo luận trong các ý kiến ​​tôi nhận ra đây là nhiệm vụ bất khả thi. Vì vậy, hãy quên đoạn cuối hoặc nếu bạn có một số ý tưởng khéo léo, xin vui lòng, bạn được chào đón để trình bày nó. Bây giờ tôi quan tâm nếu tôi có thể xác định cổng USB mà thiết bị được kết nối với; Tôi sử dụng các cổng USB tích hợp trên bo mạch chủ và các thẻ điều khiển USB PCI bổ sung để chứa các camera có đủ băng thông. Tôi sẽ cần xác định duy nhất cổng và số cổng / nhận dạng cổng không nên thay đổi nếu ví dụ máy khởi động lại và vì một số lý do, bộ điều khiển USB được khởi tạo theo thứ tự khác nhau. Điều đó có thể không?

CẬP NHẬT 2 Tôi thấy trong nhật ký của mình cho một trong các máy ảnh thông tin sau:

[Wed Apr 30 18:35:02 2014] uvcvideo: Found UVC 1.00 device FULL HD 1080P Webcam (0bda:58b0)
[Wed Apr 30 18:35:02 2014] input: FULL HD 1080P Webcam as /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

Sử dụng điều đó, tôi đã gọi lệnh này:

udevadm info --query=all --path=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

Và đã nhận được điều này:

P: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: EV=3
E: ID_BUS=usb
E: ID_INPUT=1
E: ID_INPUT_KEY=1
E: ID_MODEL=FULL_HD_1080P_Webcam
E: ID_MODEL_ENC=FULL\x20HD\x201080P\x20Webcam
E: ID_MODEL_ID=58b0
E: ID_PATH=pci-0000:01:00.0-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_01_00_0-usb-0_2_1_0
E: ID_REVISION=5801
E: ID_SERIAL=Generic_FULL_HD_1080P_Webcam_200901010001
E: ID_SERIAL_SHORT=200901010001
E: ID_TYPE=video
E: ID_USB_DRIVER=uvcvideo
E: ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic
E: ID_VENDOR_ID=0bda
E: KEY=100000 0 0 0
E: MODALIAS=input:b0003v0BDAp58B0e5801-e0,1,kD4,ramlsfw
E: NAME="FULL HD 1080P Webcam"
E: PHYS="usb-0000:01:00.0-2/button"
E: PRODUCT=3/bda/58b0/5801
E: PROP=0
E: SUBSYSTEM=input
E: UDEV_LOG=3
E: USEC_INITIALIZED=41090223

Những điều khác nhau giữa các máy ảnh là DEVPATH, ID_PATH, ID_PATH_TAG, PHYSvà (hầu hết thú vị) USEC_INITIALIZED. Bây giờ bốn yếu tố đầu tiên có thể liên quan đến cổng USB, nhưng yếu tố cuối cùng USEC_INITIALIZEDtrông giống như một số loại số sê-ri. Tôi không thể tìm thấy bất kỳ thông tin về những gì nó thực sự đại diện. Có ai biết gì về nó không? Tôi nghĩ rằng đó có thể là thời gian tính bằng giây khi máy ảnh khởi tạo nhưng máy ảnh khởi tạo sau cái này có USEC_INITIALIZED=17919751, và sau đó là cái sau USEC_INITIALIZED=25609278nên nó có vẻ khá ngẫu nhiên. Tôi sẽ thử khởi động lại hệ thống và xem, nhưng tôi cần đợi thời gian thuận tiện để làm điều đó.

Và nếu có ai thắc mắc tại sao tôi không thử kết nối lại máy ảnh và xem điều đó có còn như cũ không. Câu trả lời là tôi đang vận hành PC này từ xa và tôi đang điều tra tất cả những điều này để chuẩn bị hệ thống hoàn toàn tự chủ cho bất kỳ sự kiện tiềm năng nào trong tương lai. Ví dụ, có thể bao gồm ngắt kết nối máy ảnh khỏi cổng USB.


Nó có thể là không lập trình / không phần mềm quá không? ví dụ bằng cách đánh dấu mặt kính trước của máy ảnh bằng bút đánh dấu (màu khác nhau)? Nếu không có sự khác biệt về phần cứng và / hoặc sê-ri thì tôi nghi ngờ điều này sẽ khả thi nếu không lập trình lại tùy chỉnh, tuy nhiên bạn có thể kết nối máy ảnh qua rơle / hub khác nhau không?
Gizmo

Thật không may cho ý tưởng đánh dấu, bởi vì tôi không được giới thiệu bất cứ điều gì cho chính hình ảnh. Tôi đã tự hỏi nếu có khả năng ghi đè số sê-ri máy ảnh? Hoặc bất kỳ cài đặt / thông tin máy ảnh nào khác ... Có một cái gì đó như thế tồn tại? Ký ức, nhớ dai dẳng?
Ivan Kovacevic

Điều này sẽ thực sự khó khăn, đặc biệt là khi không có thông tin duy nhất nào cho thiết bị được cung cấp, hãy xem điều này: stackoverflow.com/questions/14053764/ Lỗi . Đối với việc ghi đè bộ nhớ, bạn có thể thử tìm một tiện ích flash firmware, xác định serial trong firmware và HEX-EDIT nó thành thứ gì đó bạn thích? Tuy nhiên tôi không thể tìm thấy bất kỳ công cụ cho nó. Nếu bạn có thể tìm cách thay đổi bộ mô tả thiết bị usb thì từ đó trở nên dễ dàng.
Gizmo

Bạn có thể dùng thử công cụ Mô tả HID tại đây - usb.org/developers/hidpage - Tất nhiên, chỉ khi cam của bạn là HID
Gizmo

chết tiệt, yup tôi đoán điều này là không thể, cũng không có phần sụn cho mô hình này vì vậy ý ​​tưởng đó cũng bị loại bỏ. Tôi đoán điều duy nhất tôi có thể làm là thực thi rằng mỗi camera luôn được kết nối với cùng một cổng trên PC mọi lúc ... Tôi sẽ sửa đổi câu hỏi của mình.
Ivan Kovacevic

Câu trả lời:


2

Các máy ảnh ở một vị trí cố định? Là những cảnh nhiều hay ít không đổi? Nếu vậy, bạn có thể sử dụng nhận dạng hình ảnh để xác định máy ảnh bằng những gì họ đang nhìn thấy thay vào đó.

Có một số công cụ python tốt để làm điều này, câu trả lời này có một số thông tin tốt về chủ đề: /programming/1927660/compare-two-images-the-python-linux-way


Tôi đã có giải pháp này trong đầu, tuy nhiên tôi hy vọng điều gì đó đơn giản hơn. Và tôi sẽ gặp vấn đề vì một số máy ảnh thực sự nhìn ra cảng bận rộn, tàu di chuyển, mặt biển không đổi vì sóng, v.v.
Ivan Kovacevic

2

Như bạn đã khám phá, vấn đề không thể được giải quyết, nếu bạn không thể nhận được một nhận dạng duy nhất từ ​​chính thiết bị. Điều gần nhất với một giải pháp là phụ thuộc vào kết nối vật lý của thiết bị. (Điều này sẽ không thay đổi khi khởi động lại. Chỉ khi bạn thay đổi thực tế vị trí của trình kết nối)

Về mặt lập trình, bạn có thể sử dụng sysfs để lấy thông tin mà kernel có, về thiết bị. Sysfs là một đại diện cho các thiết bị giống như hệ thống tệp khi kernel nhìn thấy chúng. (Nó không phải là tập tin thực trên đĩa)

Với nó, bạn có thể: - xác định loại thiết bị với ID sản phẩm và nhà cung cấp - đọc số sê-ri của thiết bị, nếu có. - đọc số kết nối vật lý trên hub USB

Bạn có thể bắt đầu bằng cách tìm loại thiết bị của mình trong / sys / class. Trong ví dụ này tôi sử dụng cổng USB → LPT. Nhưng nguyên tắc là như nhau.

$ ls -l /sys/class/usbmisc
lp1 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5:1.0/usbmisc/lp1
lp2 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.6/4-1.6:1.0/usbmisc/lp2

Grap tên thiết bị từ tập tin uevent:

cat /sys/class/usbmisc/lp1/uevent
MAJOR=180
MINOR=1
DEVNAME=__usb/lp1__

thêm / dev để bạn có được tên thiết bị để mở: / dev / usb / lp1

Sử dụng đường dẫn thực: $ cd -P / sys / class / usbmisc / lp1

Bước lùi 3 nhánh:

$ cd ../../../
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5

Thư mục này chứa rất nhiều thông tin trên thiết bị:

idSản phẩmidVendor có thể được sử dụng để xác định duy nhất loại thiết bị.

Nếu có một tệp nối tiếp và nó chứa một số sê-ri duy nhất, bạn đã hoàn thành.

Nếu không lựa chọn của bạn là sử dụng các kết nối vật lý như xác định, đó là tên thư mục này “ 4-1,5 ” Nó là duy nhất cho kết nối vật lý, và sẽ như bạn đã đề cập thay đổi nếu bạn cắm thiết bị vào cổng khác.


Tôi đoán đây là giải pháp tốt nhất hoặc thỏa hiệp trong trường hợp của tôi ... Cố định các camera vào cùng một cổng USB chuyên dụng. Tôi nói thỏa hiệp vì trong trường hợp của tôi, tôi cũng có yêu cầu xác định máy ảnh nếu ví dụ sau khi bảo trì phần cứng, máy ảnh sẽ được kết nối với các cổng khác nhau bởi người thực hiện bảo trì.
Ivan Kovacevic

Tôi đồng ý. Điều này là xa hoàn hảo. Tôi muốn nó là phổ biến cho các nhà cung cấp, để thêm một ... số serial đơn giản vào thiết bị, như giao thức chỉ định. Tôi hy vọng bạn tìm thấy một giải pháp tốt hơn!
Simon Rigét

1

Đơn giản chỉ cần rút phích cắm của máy ảnh, cắm 1 vào và thực hiện thao tác. Xác định máy ảnh và ghi lại cổng USB nào được sử dụng. Có lẽ đặt một nhãn nhỏ trên cam. Sau đó lặp lại cho các camera khác và bạn sẽ đến đó. Không có gì là nhiệm vụ bất khả thi;)


Điều này thật ý nghĩa. Chỉ cần cắm một camera vào một lúc và lưu ý cổng vật lý nào được gắn vào. Có vẻ như bạn thậm chí có thể bật và tắt các cổng riêng lẻ nếu bạn không thể phân biệt được trong phần mềm của mình, vì vậy mỗi lần chỉ có một cổng xuất hiện. Xem Askubfox.com/questions 4322061 / Mạnh
Ryan Griggs

Tôi thừa nhận tôi đã không giải thích hoàn toàn rõ ràng mục đích cấu hình của tôi. Nó là một PC trên một vị trí từ xa được sử dụng để ghi lại thời gian dài (tháng). Tôi mong muốn một giải pháp có thể tự động xác định máy ảnh mà không cần sự can thiệp của tôi. Bây giờ sau khi mất điện, tôi thực sự phải đăng nhập và tự cấu hình lại các số camera.
Ivan Kovacevic

0

Có thể xác định tất cả các máy ảnh. Lệnh

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

trả về số sê-ri của máy ảnh của tôi (một webcam Logitech HD Pro, được sử dụng làm ví dụ với Nhà cung cấp chính xác: Mã sản phẩm thu được từ lần sử dụng trước lsusb). Xin lưu ý rằng thực sự cần thiết phải thực hiện thao tác này với tư cách là người dùng đặc quyền: người dùng không có đặc quyền không có quyền truy cập vào tất cả thông tin có sẵn thông qua lệnh.

Số sê-ri thường, nhưng không phải luôn luôn, duy nhất. Nếu nó không phải là duy nhất (chỉ cần so sánh đầu ra của các lệnh trên cho hai thiết bị có cùng Nhà cung cấp: Mã sản phẩm), bạn có thể đặt chúng sao cho chúng khác biệt. Có những hướng dẫn trên Google để làm điều đó, tôi sẽ chỉ chỉ một vài trong số họ, vì sự kỹ lưỡng: ở đâyở đây .

Bây giờ lệnh

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

trả về các mã thích hợp cho máy ảnh cụ thể này. Thử nghiệm và lỗi với tất cả các /dev/videoXthiết bị cho phép chim bồ câu bao gồm tất cả chúng.


Dường như với tôi như thể bạn có thể không đọc bài đăng câu hỏi ban đầu của tôi đến cuối. Tôi đã đề cập trong bài viết của mình về việc sử dụng udevadm ... Vấn đề là tất cả các máy ảnh đều có cùng số sê-ri nên bạn không thể phân biệt chúng với thông tin đó. Bạn đã đề cập "bạn có thể đặt chúng sao cho chúng khác biệt" có cách nào để "đặt" / thay đổi số sê-ri không?
Ivan Kovacevic

-1

Tôi đã nghe nói về việc ai đó trì hoãn bật nguồn liên tục cho các thiết bị trong quá trình khởi động, điều này sẽ cho phép bạn xác định chúng dựa trên thứ tự chúng bật. Nó sẽ yêu cầu một số phần cứng bổ sung có thể điều khiển nguồn cho các cổng usb riêng lẻ theo thứ tự.

Bạn có thể hack một trung tâm USB có các công tắc nguồn riêng cho mỗi cổng, nối nó với một arduino và kích hoạt thứ tự chúng được bật.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.