Comment puis-je configurer un «proxy USB» pour / dev / ttyUSB0 sur le réseau?

14

J'ai un appareil sous test (DUT) et je mesure sa consommation d'énergie à l'aide d'un enregistreur de données Power Analyzer en utilisant les données de /dev/ttyUSB0.

Le problème est que le DUT est maintenant à distance du poste de travail avec lequel je collectais des données, mais dans le même réseau, j'ai besoin d'utiliser un 2ème PC qui est directement connecté via USB au Power Anlayzer comme une sorte de proxy USB et ssh créer une sorte de lien symbolique sur la machine de mesure de l'USB de la machine "proxy".

entrez la description de l'image ici

Compte tenu du schéma ci-dessus, comment le 1 er PC peut-il accéder /dev/ttyUSB0au 2 ème PC directement connecté, de manière à ce qu'un programme lisant le flux depuis le 1 er PC ne remarque pas la différence?

Eduard Florinescu
la source

Réponses:

19

socat pourrait fonctionner ici.

Sur le 2ème PC, vous pouvez laisser socatécouter les données /dev/ttyUSB0et les servir sur un port TCP, par exemple:

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

Ensuite, sur le 1er PC, vous pouvez vous connecter au 2ème PC avec socat et fournir les données sur un pseudo-terminal /dev/ttyVUSB0pour votre application:

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

Ceci n'est pas testé et socatprend en charge de nombreuses options, donc des ajustements peuvent être nécessaires.

FloHimself
la source
3
Merci! Environnement de test dans le conteneur Docker sur ordinateur portable -> Tunnel SSH -> PC dans la salle blanche -> Programmeur AVR et enregistreur FTDI dans la salle blanche
Mark K Cowan
2

Vous pouvez utiliser une combinaison de ser2netet socat. Par exemple, j'ai un robot connecté à un Raspberry Pi via un port série. Le raspberry pi est connecté à mon réseau local (équivalent à votre 2ème PC). Et mon ordinateur portable est connecté au même réseau local (équivalent à votre 1er PC). Ensuite, j'utilise ser2net pour transmettre le port série via TCP à partir du 2e PC et créer un fichier de périphérique série proxy à l'aide socatdu 1er PC.

Cette configuration peut également fonctionner pour vous. Solution proposée:

Étape 1: Installez le package ser2net sur votre 2ème PC (en suivant votre schéma)

sudo apt-get install ser2net

ser2net écoute un port TCP et peut acheminer des données vers et depuis un port série via le port TCP. Vous pouvez configurer les ports série pour lesquels vous souhaitez créer des "proxys" via son fichier de configuration /etc/ser2net.conf.

Étape 2: configurer ser2net sur le 2ème PC

Par exemple, si vous avez un périphérique connecté à /dev/ttyACM0avec un débit en bauds 115200et que vous souhaitez le servir à partir du port localhost 3333, vous pouvez ajouter la ligne suivante à/etc/ser2net.conf

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

Après avoir créé le fichier de configuration, puis lancez ser2net en exécutant sur le deuxième PC:

ser2net

ou (s'il est déjà en cours d'exécution, redémarrez-le comme ci-dessous)

/etc/init.d/ser2net restart

Une chose importante ici est l'option remctl. Il permet au côté client (1er PC de votre schéma) de se connecter à l'appareil et de choisir librement les options de connexion série. Je pense que de cette façon, la communication série est complètement transparente du point de vue de l'espace de travail de collecte de données. Voir plus de détails ici .

Étape 3: configurer le fichier de périphérique série proxy sur le poste de travail de collecte de données (1er PC)

(si vous n'avez pas de socat, alors sudo apt-get install socat)

Enfin, dans un terminal sur le 1er PC, socatcréons un port série proxy qui écoutera depuis le port tcp:

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

Où, dans cet exemple ip=<2nd-PC-IP-address>et port=3333(ou ce que vous avez choisi lors de la configuration /etc/ser2net.confsur le 2ème PC).

Étape 4: se connecter à MyProxySerialPort

Vous devriez maintenant pouvoir ouvrir une connexion série normalement à l'appareil situé $HOME/MyProxySerialPortsur le 1er PC.

Cet article de blog contient également plus d'informations sur cette configuration: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/

PsyKongroo
la source
réponse très détaillée +1
Eduard Florinescu
1

Dans les noyaux Linux qui utilisent un lien symbolique de / dev / bus / usb / BUS_ID / DEV_ID vers / dev / char / MAJOR: MINOR socat ne peut pas ouvrir de tels périphériques en raison d'une erreur IOCTL inappropriée!
Cette approche ne semble donc pas fonctionner directement sur les périphériques USB.

J'ai essayé usbip qui est une implémentation plus proche mais uniquement pris en charge sur les noyaux plus anciens.

Comme ma solution concernait les lecteurs de cartes connectés via pcsc-lite, il y avait une meilleure solution en utilisant la variable d'environnement pour les clients libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

De cette façon, un socket de domaine Unix différent peut être spécifié. Et celui-ci peut être transmis au socket du lecteur de carte sur un hôte distant en utilisant socat :

Exécutez ceci sur l'hôte pour remplacer le lecteur de carte

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

exécutez ceci sur l'hôte CARD_READER_HOST avec le lecteur de carte pcsc connecté

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr
UV
la source
1
Salut et bienvenue :). Ce sont des informations intéressantes mais elles ne concernent pas la question /dev/ttyUSB0ou un analyseur de puissance qui n'utilise pas PCSCLITE. Si vous souhaitez publier ces informations, il serait préférable de poser une question distincte. Vous êtes autorisé et encouragé à publier des questions sur le sujet pour lesquelles vous avez une réponse immédiate.
sourcejedi
3
Je l'ai essayé et l'information pertinente était que la réponse proposée n'a PAS fonctionné! Je pense que cette information nécessite un partage. Le reste n'est vraiment pas directement pertinent mais offre une approche différente pour les problèmes connexes.
UV
Serait-ce à cause du :personnage sur le chemin? La page de manuel de socat, section "SPÉCIFICATIONS D'ADRESSE", contient un paragraphe sur la façon d'échapper les caractères (à partir de la v1.5.0).
David Knipe
point intéressant, mais le projet a été mis en boîte donc plus aucun moyen de le vérifier :(
UV