USB Ethernet als treiberlose Schnittstelle

OP #2693163
Lesenswert?

Hallo,
ich möchte hier eine Idee diskutieren, die mir gekommen ist und ich 
hoffe ja schon fast, dass ich nicht der erste bin und dass es das schon 
fertig gibt.

Also folgende Situation: Ich möchte gerne eine Stück Hardware bauen mit 
folgenden Anforderungen:
A1: Lauffähig unter Windows, Linux und Mac
A2: In der zugehörigen Software soll der Benutzer NICHT auswählen oder 
raten müssen, an welchem COM-Port das Gerät hängt.
A3: Der Benutzer soll nicht explizit irgendwo refresh drücken müssen, 
wenn man das Gerät ansteckt, sondern das Gerät soll auftauchen, wenn 
angesteckt wird.
A4: Ich möchte mich mit Treibersignierung nicht beschäftigen müssen.
A5: Möglichst treiberlos

Bisher hab ich den FT232RL als USB-UART-Wandler benutzt, der kollidiert 
aber meiner Meinung nach erstmal mit der Anforderungen A2. Wenn ich den 
Chip nicht über einen virtuellen COM-Port ansprechen will, sondern über 
die D2XX-Library werde ich die Device-ID ändern müssen und muss den 
Treiber dann neu signieren.

Nun kam die Idee auf, anstatt eines virtuellen COM-Ports auf einem 
Mikrocontroller ein virtuelles Ethernet-Device zu implementieren. Das 
hätte weitere Vorteile:
- Alles über Userspace-Libs abzufrühstücken
- Migrationspfad bei der Software, falls man später mal eine richtige 
Ethernetschnittstelle drann an das Gerät baut.

Da kommt natürlich die Frage auf: Warum nicht gleich Ethernet? Ich hätte 
gerne, dass das Gerät direkt an einem Notebook betrieben und auch 
darüber mit Strom zu versorgen ist. PoE wäre da ne Option, aber ich hab 
noch kein Notebook gesehen, was PoE am Netzwerkport speist.

Ich freue mich nun über eine Diskusion über die Vor- und Nachteile 
dieser Idee, möglicher Realisierungen sowie Prüfung meiner Annahmen über 
die anderen Lösungen.
#2693173
Lesenswert?

Ethernet hat halt den Nachteil, dass da nix mit Plug&Play ist und man 
das gerät erst mal auf eine IP konfigurieren muss. Sicherlich kann man 
mit DHCP und uPNP einiges machen, aber das ist ziemlich aufwendig und 
nervig zu implementieren.

USB ist schon das Mittel der Wahl für direktes Anstecken und loslegen.

Wieso nicht LibUSB? Das ist auf Linux, Windows, Mac verfügbar und der 
Treiber für Windows x64 ist signiert, also kein Ärger damit.

WinUSB ist zumindest unter Windows ein ähnliches Modell, der Treiber ist 
seit XP SP2 im Windows integriert. Und mit Windows 8 kann man einen OS 
descriptor in USB anlegen, dann erkennt Windows gleich, dass man WinUSB 
nutzen will, da brauchts nicht mal mehr die Inf Datei.
Gast #2693177
Lesenswert?

Meine Idee: Das Gerät simuliert einen USB Massenspeicher. Die 
Kommunikation läuft über spezielle Dateien. Man könnte damit auch gleich 
die Software zur Verfügung stellen. Das wäre echtes Plug&Play: 
einstecken, Software vom Gerät starten, läuft.

Leider habe ich keine Ahnung ob und wie man das umsetzen kann. Wer weiß 
mehr?
OP #2693180
Lesenswert?

Christian R. schrieb:
> Wieso nicht LibUSB? Das ist auf Linux, Windows, Mac verfügbar und der
> Treiber für Windows x64 ist signiert, also kein Ärger damit.

Meiner Meinung nach geht die Treibersignierung kaputt, wenn ich die 
Device-ID ändere. Außerdem wüsste ich nicht, wie ich auf Mac und Windows 
Events bekomme, wenn ich ein Gerät eingesteckt hab, weil ich da ja 
keinen HAL-Daemon zur Verfügung habe. Oder irre ich hier? Wie sieht denn 
die Situation mit WinUSB bezüglich Events aus?

Bei der Netzwerklösung habe ich schon an so Sachen wie Bonjour oder 
Universal Plug and Play gedacht, um solche Events zu bekommen.

 Zu der Idee mit dem Massenspeicher: Es gibt doch Geräte, wo man so ein 
Firmwareupdate macht? Als Nachteil der Lösung sehe ich, dass man das 
Gerät im Explorer sieht und das den Benutzer verwirren könnte.
#2693206
Lesenswert?

Axel Jäger schrieb:
> A1: Lauffähig unter Windows, Linux und Mac
> A5: Möglichst treiberlos
> A4: Ich möchte mich mit Treibersignierung nicht beschäftigen müssen.

Also müssen auf der Plattform schon generic-Treiber vorhanden sein.

> A2: In der zugehörigen Software soll der Benutzer NICHT auswählen oder
> raten müssen, an welchem COM-Port das Gerät hängt.

Jegliche Konfiguration fällt also aus.

> A3: Der Benutzer soll nicht explizit irgendwo refresh drücken müssen,
> wenn man das Gerät ansteckt, sondern das Gerät soll auftauchen, wenn
> angesteckt wird.

Mit anderen Worten: Du suchst eine Schnittstelle, mit der man ohne 
jegliche Useraktion Aktionen auf dem PC ausführen können soll. Praktisch 
für einen Virus ... aber nicht gewollt.

Und Stromversorgung wolltest Du ja auch ...

Die einzige Schnittstelle, die mir dazu einfällt, ist die für die 
Tastatur - egal ob USB, PS/2 oder DIN. Aber ob damit die Daten dort 
landen, wo sie hin sollen ...


Gruß

Jobst
#2693246
Lesenswert?

Axel Jäger schrieb:

> Also folgende Situation: Ich möchte gerne eine Stück Hardware bauen mit
> folgenden Anforderungen:
> A1: Lauffähig unter Windows, Linux und Mac
> A2: In der zugehörigen Software soll der Benutzer NICHT auswählen oder
> raten müssen, an welchem COM-Port das Gerät hängt.
> A3: Der Benutzer soll nicht explizit irgendwo refresh drücken müssen,
> wenn man das Gerät ansteckt, sondern das Gerät soll auftauchen, wenn
> angesteckt wird.
> A4: Ich möchte mich mit Treibersignierung nicht beschäftigen müssen.
> A5: Möglichst treiberlos
>
> Bisher hab ich den FT232RL als USB-UART-Wandler benutzt, der kollidiert
> aber meiner Meinung nach erstmal mit der Anforderungen A2. Wenn ich den
> Chip nicht über einen virtuellen COM-Port ansprechen will, sondern über
> die D2XX-Library werde ich die Device-ID ändern müssen und muss den
> Treiber dann neu signieren.

Du willst also ein HID Device bauen. Kein Problem. Jedes Betriebssystem 
kennt HID (A1), Dein Device ist durch VID/PID oder den Device String 
eineindeutig identifizierbar (A2), das Gerät wird ohne Zutun automatisch 
erkannt (A3), Du brauchst Dich mit Treibersignierung nicht beschäftigen 
(A4), und Du musst keine Treiber mitliefern (A5).

> Da kommt natürlich die Frage auf: Warum nicht gleich Ethernet? Ich hätte
> gerne, dass das Gerät direkt an einem Notebook betrieben und auch
> darüber mit Strom zu versorgen ist. PoE wäre da ne Option, aber ich hab
> noch kein Notebook gesehen, was PoE am Netzwerkport speist.

Das gibts auch nicht. Baue einen Akku ein, den Du an einem Netzteil 
wieder aufladen kannst. Das ist die sinnvollste Lösung und wird auch so 
gemacht (UMTS/WLAN Router z.B.)
Gast #2693306
Lesenswert?

Jörg S. schrieb:
> Mache ich immer so das das PC Tool an alle verfügbaren COM-Ports einen
> "Info-Befehl" oder "Ping" schickt. Antwortet das Gerät auf diesen
> speziellen Befehl mit der richtigen Antwort, ist der richtige Com-Port
> gefunden.

den Fehler haben schon andere gemacht (MS) und wenn an dem COM-Port z.b. 
eine USV angeschlosse ist damit irgendwelcher Aktionen ausgeführt.

Wenn überhaupt sollte da gerät etwas senden, und bei abfragen der 
Com-Port lauscht man nur.
OP #2693353
Lesenswert?

Jobst M. schrieb:
> Mit anderen Worten: Du suchst eine Schnittstelle, mit der man ohne
> jegliche Useraktion Aktionen auf dem PC ausführen können soll. Praktisch
> für einen Virus ... aber nicht gewollt.

Es ist ausreichend, wenn mein Programm schon läuft und dann meldet, dass 
jetzt die Hardware angeschlossen wurde. Also das Programm muss nicht 
durch das Anstecken gestartet werden.

Frank K. schrieb:
> Du willst also ein HID Device bauen
Hab ich mir auch schon überlegt. HID wäre eine Möglichkeit, aber da sind 
die Datenraten meines Wissens nach nicht so hoch, auch wenn es dazu 
bisher keine Anforderung gibt.
#2693490
Lesenswert?

Axel Jäger schrieb:
> Meiner Meinung nach geht die Treibersignierung kaputt, wenn ich die
> Device-ID ändere. Außerdem wüsste ich nicht, wie ich auf Mac und Windows
> Events bekomme, wenn ich ein Gerät eingesteckt hab, weil ich da ja
> keinen HAL-Daemon zur Verfügung habe. Oder irre ich hier? Wie sieht denn
> die Situation mit WinUSB bezüglich Events aus?

Die Signierung geht weder bei WinUSB noch LibUSB kaputt. WinUSB ist 
immer signiert, LibUSB nutzt den spziellen Modus, die Signatur in die 
sys direkt einzubauen, da ist die VID/PID egal.
Events gibts nicht direkt über LibUSB/WinUSB, sondern im Falle von 
Windows über die WinAPI. Unter Mac und Linux gibts garantiert ebenfalls 
Systemfunktionen, die dir ein neues Gerät melden. Einen 100% generischen 
Code wirst du eh nicht schreiben können.

HID wäre aber bei niedrigen Datenraten wirklich noch eine Überlegung.
OP #2693642
Lesenswert?

Zur Datenrate:
Aktuelles Zielprojekt ist ein DMX-Interface. Das hab ich schon sowohl 
mit FTDI, als auch als USB-HID-Device. Ich würde aber gerne diese Lösung 
da mit USB-Ethernet evaluieren, um sie für zukünftige Projekte zur 
Verfügung zu haben, wenn sich denn hier in der Diskussion rausstellt, 
dass das sinnvoll ist.
#2693661
Lesenswert?

Wäre es nicht zweckmäßiger, dann gleich ein Artnet-Gerät zu bauen?

Dann hast du alle Treiberprobleme los und Artnet beherrschen die meisten 
Programme für Lichtsteuerungen eh. Und von Artnet auf DMX umsetzen ist 
keine große Sache mehr, das haben andere auch schon gemacht, z.b. mit 
ATmega644 und dem ENC-Ethernet-Chip.

_.-=: MFG :=-._
#2693678
Lesenswert?

Axel Jäger schrieb:
> Zur Datenrate:
> Aktuelles Zielprojekt ist ein DMX-Interface. Das hab ich schon sowohl
> mit FTDI, als auch als USB-HID-Device. Ich würde aber gerne diese Lösung
> da mit USB-Ethernet evaluieren, um sie für zukünftige Projekte zur
> Verfügung zu haben, wenn sich denn hier in der Diskussion rausstellt,
> dass das sinnvoll ist.

Warum schreibst Du das nicht gleich? Damit hättest Du die Diskussion 
früher in eine sinnvolle Richtung gelenkt.

Bei DMX sollte HID kein Problem sein. Als zweites USB-Standardprotokoll 
gibts CDC, das Microsoft aber ein wenig vermurkst hat, weil Windows da 
ein .inf-File sehen will (der usbser.sys ist aber bei Windows dabei).

Dafür ersetzt Du den FTDI einfach durch einen Microchip MCP2200, der CDC 
und HID macht.

USB Ethernet ist mit einiger Sicherheit nicht treiberlos über 
Betriebssystemgrenzen realisierbar, d.h. Du brauchst (a) einen Treiber 
und musst (b) das Ethernet konfigurieren bzw einen DHCP-Server 
bereitstellen und hoffen, dass der nicht mit der vorhandenen 
Netzwerkinfrastruktur kollidiert. Das ist irgendwie Murks. Dann lieber 
richtiges Ethernet.

Dafür brauchst Du einen Microchip PIC18F67J60 (der hat gleich Ethernet 
MAC+PHY und den UART für RS485 bzw DMX drin, Du brauchst also nur noch 
die Ethernet-Buchse und etwas Kleinzeug anzuschließen), einen 
RS485-Transceiver (am Besten sowas wie TI SN75HVD08/SN65HVD08 mit 3.3V 
Versorgungsspannung, weil der PIC auch mit 3.3V arbeitet), und die 
Stromversorgung (z.B. LM1117-3.3V).

Obendrein ist das Interface dank des in der RJ45-Buchse verbauten 
Übertragers galvanisch isoliert, sofern Du UTP-Kabel nimmst, d.h. 
Masseschleifen über Deinen PC können nicht auftreten.

fchk
OP #2693685
Lesenswert?

Frank K. schrieb:
> Warum schreibst Du das nicht gleich? Damit hättest Du die Diskussion
> früher in eine sinnvolle Richtung gelenkt.

Weil ich erstmal diskutieren wollte, ob es außer für Arnet und DMX, wo 
ein Ethernet-Device absolut naheliegend ist, sinnvoll ist, diese 
Deviceklasse zu benutzen. Das wird ja nicht das letzte Gerät sein, was 
ich baue. Im Moment hab ich den Eindruck, die Standardlösung ist der 
Virtual COM-Port und der geht mir sowohl bei der DMX-Geschichte, als 
auch bei anderen Geräten auf die Nerven.

Hier in dem Thread sind so schon einige interessante Informationen 
zusammen gekommen.

Die Sache mit Ethernet konfigurieren sehe ich nicht so kritisch, mit 
Universal Plug & Play/Bonjour und APIPA-Adressen geht da schon einiges 
denke ich.
#2693699
Lesenswert?

Axel Jäger schrieb:
> Frank K. schrieb:


> Im Moment hab ich den Eindruck, die Standardlösung ist der
> Virtual COM-Port und der geht mir sowohl bei der DMX-Geschichte, als
> auch bei anderen Geräten auf die Nerven.

Das muss nicht sein.

Schau Dir unter Windows die SETUPAPI an. Damit kannst Du durch den USB 
Device Tree durchiterieren und Dein Gerät finden, entweder über VID/PID, 
oder bei Verwendung einer Standard VID/PID unter Zuhilfenahme der 
Seriennummer und der Manufacturer/Product Device Deskiptoren (die kannst 
Du beliebig ändern, ohne dass das .inf nicht mehr funktioniert und neu 
signiert werden muss). Wenn Du im SETUPAPI Dein Gerät gefunden hast, 
bekommst Du auch raus, auf welchem COM-Port es liegt. Das steht irgendwo 
in der MSDN Doku drin, hab ich schon mal gesehen.

Und um das Anstecken/abstecken zu registrieren, musst Du die 
WM_DEVICECHANGE Window Messages auswerten, die Dein Main Window bekommt.

fchk
#2693709
Lesenswert?

Peter II schrieb:
> Jörg S. schrieb:
>> Mache ich immer so das das PC Tool an alle verfügbaren COM-Ports einen
>> "Info-Befehl" oder "Ping" schickt. Antwortet das Gerät auf diesen
>> speziellen Befehl mit der richtigen Antwort, ist der richtige Com-Port
>> gefunden.
> den Fehler haben schon andere gemacht (MS) und wenn an dem COM-Port z.b.
> eine USV angeschlosse ist damit irgendwelcher Aktionen ausgeführt.
Das spricht wohl eher gegen die Programmierer der USV die nach erhalt 
irgendwelcher Daten irgendwas macht :)
Gast #2693715
Lesenswert?

Jörg S. schrieb:
> Peter II schrieb:
>> Jörg S. schrieb:
>>> Mache ich immer so das das PC Tool an alle verfügbaren COM-Ports einen
>>> "Info-Befehl" oder "Ping" schickt. Antwortet das Gerät auf diesen
>>> speziellen Befehl mit der richtigen Antwort, ist der richtige Com-Port
>>> gefunden.
>> den Fehler haben schon andere gemacht (MS) und wenn an dem COM-Port z.b.
>> eine USV angeschlosse ist damit irgendwelcher Aktionen ausgeführt.
> Das spricht wohl eher gegen die Programmierer der USV die nach erhalt
> irgendwelcher Daten irgendwas macht :)

Hm, dann kannst du die Schnittstelle auch gleich weglassen, wenn sie auf 
keine Daten die darüber kommen reagiert...
#2693830
Lesenswert?

Axel Jäger schrieb:

> Außerdem wüsste ich nicht, wie ich auf Mac und Windows
> Events bekomme, wenn ich ein Gerät eingesteckt hab, weil ich da ja
> keinen HAL-Daemon zur Verfügung habe.

Bei beiden Systemen können Programme über das entsprechende API 
Callbacks einrichten, über die Benachrichtigungen über derartige 
Ereignisse versendet werden.

Wie soll es auch sonst funktionieren? Denkst Du, unter Mac OS und 
Windows müssen alle interessierten Parteien ständig den USB-Port pollen, 
um über dessen Zustand auf dem Laufenden zu bleiben?

Christian
OP #2693922
Lesenswert?

Christian Gudrian schrieb:
> Denkst Du, unter Mac OS und
> Windows müssen alle interessierten Parteien ständig den USB-Port pollen,
> um über dessen Zustand auf dem Laufenden zu bleiben?

Ich weis, dass bei MacOS die Situation überaus komfortabel ist und man 
da über DeviceKit solche Events bekommt. Wie die entsprechende API unter 
Windows heißt, wusste ich bisher nicht, aber ist ja im Rahmen dieser 
Diskusion rausgekommen. Ich wundere mich aber ein bisschen, dass libusb 
zwar den Zugriff auf USB-Geräte abstrahiert, nicht aber diese 
HotPlug-Events, da es meiner Meinung nach keinen guten Grund gibt, das 
nicht zu tun. Jede Anwendung, die libusb benutzt, wird doch auf solche 
Events reagieren können wollen?

Zu der Diskusion mit der USV: Wenn man es sauber machen würde, würde man 
die Datenpakete auf der seriellen Schnittstelle kryptografisch signieren 
und so sicherstellen, dass zufällig gesendete Daten nicht interpretiert 
werden.
#2694038
Lesenswert?

Rufus Τ. Firefly schrieb:
> Und, wenn die zu "Testzwecken" gesendeten Daten zufälligerweise aus
> Sicht der USV legal sind?
Genauso zufällig kann auch ein UDP/TCP Paket bei Ethernet 
"missverstanden" werden. Immerhin sind etliche Ports doppelt und 
dreifach belegt. Oder Übertragungen im 2,4GHz Band, da senden alle quer 
durcheinander. Oder der User weiß nicht was am welchen COM-Port hängt 
und stellt zufällig den Port der USV ein und sendet quatsch.

> Alle Schnittstellen aufmachen und was 'rausblasen macht man nicht.
Bei einem komerziellen Gerät würde ich auch erst was anderes versuchen, 
aber privat sehe ich kein Problem.
Gast #2694057
Lesenswert?

> > Alle Schnittstellen aufmachen und was 'rausblasen macht man nicht.
> Bei einem komerziellen Gerät würde ich auch erst was anderes versuchen,
> aber privat sehe ich kein Problem.

warum sollte man es bei einem Privaten gerät nicht auch richtig machen? 
Wenn das gerät sich selber meldet und in ping sendet dann ist das der 
gleich aufwand und es ist gleich richtig.
Gast #2694826
Lesenswert?

Axel Jäger schrieb:
> Ich weis, dass bei MacOS die Situation überaus komfortabel ist und man
> da über DeviceKit solche Events bekommt. Wie die entsprechende API unter
> Windows heißt, wusste ich bisher nicht, aber ist ja im Rahmen dieser
> Diskusion rausgekommen. Ich wundere mich aber ein bisschen, dass libusb
> zwar den Zugriff auf USB-Geräte abstrahiert, nicht aber diese
> HotPlug-Events, da es meiner Meinung nach keinen guten Grund gibt, das
> nicht zu tun. Jede Anwendung, die libusb benutzt, wird doch auf solche
> Events reagieren können wollen?

Seit wann sind Events über neue Geräte spezifisch nur für USB ? Sind sie 
nicht also hat das nichts mit einer Lib zu tun die nur USB macht.
OP #2694871
Lesenswert?

tz schrieb:
> Seit wann sind Events über neue Geräte spezifisch nur für USB ? Sind sie
> nicht also hat das nichts mit einer Lib zu tun die nur USB macht.

Nun der Sinn von von Cross-Plattform-Abstraktionslibraries ist ja, den 
Anteil von plattformspezifischem Code zu minimieren. Wenn ich mich also 
ohnehin mit dem nativen Code dererlei APIs beschäftigen muss, fällt die 
Rechtfertigung für libusb weg. Ich wünsche mir mit so einer lib ein 
Rundum-Sorglos-Paket für einen gewissen Usecase, nämlich mit USB-Geräten 
schaffen. Ich wüsste aber grad auch nicht, was man an einem modernen PC 
neben USB großartig an anderen Hotplug-Events bekommen könnte.
#2694890
Lesenswert?

USB Sticks oder Express Cards benutzt du nicht? Auch die sind voll 
Hotplug fähig. Übrigens gibts die SetupAPI Events nicht nur, wenn ein 
Hotplug Gerät angestekt/abgezogen wird, sondern auch wenn im 
Gerätemanager manuell nach neuen Geräten gesucht und diese gefunden 
wurden. Außerdem für uPNP Geräte usw. das ist also keineswegs auf USB 
beschränkt.
Es ist aus der Sicht der User-Lib schlicht nicht die Aufgabe. Solche 
Aufgaben sind system-spezifisch und demnach in den Systemfunktionen des 
jeweiligen OS zu finden. Den Traum von OS-unabhängigem Code träumen 
viele, der platzt spätestens beim Zugriff auf Hwrdware.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren