Làm cách nào tôi có thể thiết lập một proxy USB USB cho / dev / ttyUSB0 qua mạng?


14

Tôi có một thiết bị đang được thử nghiệm (DUT) và tôi đo mức độ sử dụng năng lượng của nó bằng cách sử dụng Bộ phân tích dữ liệu phân tích năng lượng bằng cách sử dụng dữ liệu từ /dev/ttyUSB0.

Vấn đề là DUT hiện ở xa máy trạm mà tôi đã sử dụng để thu thập dữ liệu, nhưng trong cùng một mạng, tôi cần sử dụng PC thứ 2 được kết nối trực tiếp qua USB với Power Anlayzer như một loại proxy USB và ssh để tạo một loại liên kết tượng trưng trên máy đo USB của máy "proxy".

nhập mô tả hình ảnh ở đây

Với sơ đồ trên, làm thế nào để truy cập PC thứ 1 /dev/ttyUSB0của PC thứ 2 được kết nối trực tiếp, theo cách mà một chương trình đọc luồng từ PC thứ 1 sẽ không nhận thấy sự khác biệt?

Câu trả lời:


19

socat có thể làm việc ở đây

Trên PC thứ 2, bạn có thể cho phép socatnghe dữ liệu /dev/ttyUSB0và phân phát đến cổng tcp, ví dụ:

socat /dev/ttyUSB0,raw,echo=0 tcp-listen:8888,reuseaddr

Sau đó, trên PC thứ 1, bạn có thể kết nối với PC thứ 2 bằng socat và cung cấp dữ liệu trên thiết bị đầu cuối giả /dev/ttyVUSB0cho ứng dụng của bạn:

socat PTY,raw,echo=0,link=/dev/ttyVUSB0 tcp:<ip_of_pc2>:8888

Điều này không được thử nghiệm và socathỗ trợ nhiều tùy chọn, vì vậy có thể cần phải điều chỉnh.


3
Cảm ơn! Kiểm tra môi trường trong thùng chứa docker trên máy tính xách tay -> SSH đường hầm -> PC trong phòng sạch -> lập trình viên AVR và logger FTDI trong phòng sạch
Mark K Cowan

2

Bạn có thể sử dụng kết hợp ser2netsocat. Ví dụ, tôi có một robot được kết nối với một quả mâm xôi pi thông qua một cổng nối tiếp. Raspberry pi được kết nối với mạng cục bộ của tôi (tương đương với PC thứ 2 của bạn). Và máy tính xách tay của tôi được kết nối với cùng một mạng cục bộ (tương đương với PC đầu tiên của bạn). Sau đó, tôi sử dụng ser2net để chuyển tiếp cổng nối tiếp qua TCP từ PC thứ 2 và tạo tệp thiết bị nối tiếp proxy bằng cách sử dụng socattrên PC thứ nhất.

Thiết lập này có thể làm việc cho bạn là tốt. Giải pháp đề xuất:

Bước 1: Cài đặt gói ser2net trên PC thứ 2 của bạn (theo sơ đồ của bạn)

sudo apt-get install ser2net

ser2net lắng nghe một cổng TCP và có thể dẫn dữ liệu đến và đi từ một cổng nối tiếp qua cổng TCP. Bạn có thể thiết lập cổng nối tiếp nào bạn muốn tạo "proxy" thông qua tệp cấu hình của nó /etc/ser2net.conf.

Bước 2: cấu hình ser2net trong PC thứ 2

Ví dụ: nếu bạn có một thiết bị được kết nối /dev/ttyACM0với baudrate 115200và muốn phục vụ nó từ cổng localhost 3333, thì bạn có thể thêm dòng sau vào/etc/ser2net.conf

3333:raw:0:/dev/ttyACM0:115200,remctl

Đã tạo tệp cấu hình, sau đó khởi động ser2net bằng cách chạy trên PC thứ hai:

ser2net

hoặc (nếu nó đã chạy, thì chỉ cần khởi động lại như bên dưới)

/etc/init.d/ser2net restart

Một điều quan trọng ở đây là tùy chọn remctl. Nó cho phép phía máy khách (PC thứ 1 trong sơ đồ của bạn) kết nối với thiết bị và chọn các tùy chọn kết nối nối tiếp một cách tự do. Tôi nghĩ theo cách này giao tiếp nối tiếp hoàn toàn minh bạch từ phối cảnh không gian làm việc thu thập dữ liệu. Xem thêm chi tiết tại đây .

Bước 3: Thiết lập tệp thiết bị nối tiếp proxy trên máy trạm thu thập dữ liệu (PC thứ 1)

(nếu bạn không có socat, thì sudo apt-get install socat)

Cuối cùng, trong một thiết bị đầu cuối trên PC đầu tiên, hãy socattạo một cổng nối tiếp proxy sẽ lắng nghe từ cổng tcp:

socat pty,link=$HOME/MyProxySerialPort,waitslave tcp:$ip:$port,forever,reuseaddr,keepalive

Ở đâu, trong ví dụ này ip=<2nd-PC-IP-address>port=3333(hoặc bất cứ điều gì bạn đã chọn khi thiết lập /etc/ser2net.conftrên PC thứ 2).

Bước 4: Kết nối với MyProxySerialPort

Bây giờ bạn sẽ có thể mở một kết nối nối tiếp bình thường đến thiết bị được đặt tại $HOME/MyProxySerialPortPC thứ 1.

Bài đăng trên blog này cũng có một số thông tin về thiết lập này: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/


câu trả lời rất chi tiết +1
Eduard Florinescu

1

Trong các nhân linux đang sử dụng một liên kết tượng trưng từ / dev / bus / usb / BUS_ID / DEV_ID đến / dev / char / MAJOR: MINOR socat không thể mở các thiết bị đó do lỗi IOCTL không phù hợp!
Vì vậy, phương pháp này dường như không hoạt động trực tiếp trên các thiết bị USB.

Tôi đã thử usbip , một triển khai gần hơn nhưng chỉ được hỗ trợ trên các kernel cũ.

Vì giải pháp của tôi là về các đầu đọc thẻ được kết nối thông qua máy tính cá nhân, nên có một giải pháp tốt hơn bằng cách sử dụng biến môi trường cho các máy khách libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

Bằng cách này, một ổ cắm miền unix khác nhau có thể được chỉ định. Và cái này có thể được chuyển tiếp đến ổ cắm đầu đọc thẻ trên một máy chủ từ xa bằng socat :

Chạy cái này trên máy chủ để thay thế đầu đọc thẻ

socat tcp:$CARD_READER_HOST:8888 UNIX-LISTEN:$PCSCLITE_CSOCK_NAME,fork

chạy cái này trên máy chủ CARD_READER_HOST với đầu đọc thẻ pcsc được kết nối

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr

1
Xin chào và chào mừng :). Đây là thông tin thú vị nhưng nó không liên quan đến câu hỏi /dev/ttyUSB0hoặc máy phân tích công suất không sử dụng PCSCLITE. Nếu bạn muốn đăng thông tin này, nó sẽ tốt hơn như là một câu hỏi riêng biệt. Bạn được phép và khuyến khích gửi câu hỏi về chủ đề mà bạn có câu trả lời tiếp theo ngay lập tức.
sourcejedi

3
Tôi đã thử nó và thông tin liên quan là câu trả lời được đề xuất DID KHÔNG hoạt động! Tôi nghĩ rằng thông tin này đòi hỏi phải chia sẻ. Phần còn lại thực sự không liên quan trực tiếp nhưng cung cấp một cách tiếp cận khác cho các vấn đề liên quan.
UV

Điều này sẽ là do các :nhân vật trong đường dẫn? Trang man socat, phần "THÔNG SỐ ĐỊA CHỈ", có một đoạn về cách thoát các ký tự (v1.5.0 trở đi).
David Knipe

Điểm thú vị, nhưng dự án đã được đóng hộp nên không có cách nào để kiểm tra nữa :(
UV
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.