Hallo,
ich suche für ein USB-Gerät nach einer möglichst plattformunabhängigen
Möglichkeit eine einigermaßen hübsche Bedienoberfläche und
Visualisierung zu realisieren. Am liebsten wäre es mir wenn man das mit
dem vorhandenen Default-Browser erledigen könnte. Das USB-Gerät sollte
also vom System als eine Art TCP-Connection erkannt werden an deren
anderen Ende (im USB-µC) ein simpler Web-Server die Bedienoberfläche
ausliefert (ob das per Dynamic-HTML oder AJAX oder gar als Java-Applet
o.ä. realisiert wird ist dann die Entscheidung des
USB-Geräte-Entwicklers und hängt sicher auch von den Möglichkeiten
(ROM-Kapazität) des µC im USB-Gerät ab).
Gibt es da irgendeine Möglichkeit sowas in der Art zu realisieren?
Von den vorhandenen Standard-USB-Device-Klassen habe ich keine gefunden
die sowas ermöglichen würde.
Habt ihr Vorschläge wie man sowas angehen könnte?
Ich möchte eigentlich nur das sich die Bedienoberfläche direkt nach dem
Einstöpseln von alleine öffnet und keinerlei Software auf dem PC
installiert werden muss und dass das natürlich unter jedem OS läuft.
Grüße
Erik
Erik schrieb:> Habt ihr Vorschläge wie man sowas angehen könnte?
es müsste sich einfach als Netzwerkkarte anmelden. Und wenn es dann noch
UpNP bereitstellt sollte es automatisch unter Windows bei Geräten
auftauchen. Dort kann man dann den Browser starten. (so wie bei den
Fritzboxen)
> Ich möchte eigentlich nur das sich die Bedienoberfläche direkt nach> dem Einstöpseln von alleine öffnet
Den Autostart hat Microsoft gotttseidank abgeschafft. Zu viele USB
Geräte hatten auf diese Art Schadcode eingeschleust.
Die mehr oder weniger einzige sinnvolle USB Anbindung fuer Controller is
die USB to Serial. Denn die wird bleiben. Plus die Massenspeicher
Schnittstelle, aber um die geht es hier nicht. Irgendwelche anderen USB
Device werden's schwer haben. Bei der N+1-ten neuen Windows Version geht
der mitgelieferte Treiber dann ploetzlich nicht mehr. Der Hersteller kam
zwischenzeitlich leider nicht auf die Stueckzahlen und mag keine neuen
Zeilen Code zu diesem Projekt mehr schreiben.
Wenn man nun die windows seite und die controller Seite selbst
gestallten kann, ist das obige Konzept fast machbar.
Der controller muss natuerlich den webserver spielen. Und auf der PC
Seite muss ein Demon, (Prozess) die serialports kontrollieren, abfragen
und falls erkannt das Serialport auf einen Socket umleiten, sodass ein
Browser ein Netzwerkdervice sieht. Das automatische Oeffnen des Browsers
halt ich fuer nicht gut, sollte aber machbar sein.
Alles machbar, aber viel Arbeit...
Peter II schrieb:> es müsste sich einfach als Netzwerkkarte anmelden.> Und wenn es dann noch UpNP bereitstellt
Das bedeutet das der µC Ethernet, IP, TCP und dann auch noch UPnP (mit
UDP) bieten muss und das dürfte den Rahmen eines µC selbst mit 256kB
Flash deutlich sprengen.
Eine TCP-Verbindung ist im wesentlichen eine bidirektionale
Byte-Strom-Schnittstelle mit guter Zuverlässigkeit (also eine perfekte
RS232-Verbindung) und das sollte erstmal keinen µC vor echte Probleme
stellen, die Zuverlässigkeit von TCP kann man sicher auch auf Basis von
USB abbilden (und sowas wie Staukontrolle oder Slow-Start ist bei USB
wohl eher nicht erforderlich). Es bliebe für den µC ein Web-Server mit
einer persistenten Verbindung zum Client (Browser), damit ließen sich
zwar nicht mehrere Dateien parallel (in unterschiedlichen
Geschwindigkeiten) übertragen aber für eine halbwegs hübsche
Bedienoberfläche in einem Browser sollte es IMHO schon reichen und auch
in 128kB Flash passen (wenn man auf Bilder gut verzichten kann).
Ein weiteres Problem mit nacktem Ethernet ist die Vergabe der
IP-Adressen, ein normaler PC wird wohl kaum auf DHCP-Anfragen in der
Rolle als Server antworten, wenn dann eher umgekehrt und in einem
USB-Gerät das nichts über die sonstige Netzwerkkonfiguration des PC weiß
würde ich keinen DHCP-Server packen wollen, schon wegen dem Potential
auf IP-Adressraum-Kollisionen usw., selbst mit IPv6 ist das IMHO nicht
so ganz einfach. Nebst dessen das man dann eigentlich auch immer 2
gültige (also einmalige) MAC-Adressen benötigt was die Kosten wieder
unnötig erhöht (echte MAC-Adressen kosten Geld und gefackte könnten bei
mehreren gleichartigen USB-Geräten eventuell kollidieren).
> sollte es automatisch unter Windows bei Geräten auftauchen.
Da sind genau zwei Worte die mir nicht so gut gefallen, Du ahnst sicher
schon, "sollte" und "Windows".
Ich suche etwas das halbwegs zuverlässig Autostart hinbekommt und das
unter möglichst jedem OS, wobei die zweite Anforderung definitiv die
wichtigere ist. Autostart kann man eventuell mit einer kleinen
gedruckten Anleitung für den User umgehen.
> Dort kann man dann den Browser starten. (so wie bei den Fritzboxen)
Aha, ich hab zwar weder eine Fritzbox noch Windows (kann also nicht
nachvollziehen was Du genau meinst) aber das klingt zumindest halbwegs
nach dem was ich mir wünsche, wenn ich auch den nötigen Aufwand (wegen
Ethernet/IP/TCP) für zu hoch halte.
Danke für Deine Idee.
Noch andere Vorschläge?
Grüße
Erik
uiii. schrieb:> Die mehr oder weniger einzige sinnvolle USB Anbindung fuer Controller is> die USB to Serial. Denn die wird bleiben.
Daran hatte ich auch schon gedacht aber das erfordert in jedem Fall ein
bereits installiertes Programm auf dem PC und genau das will ich in
jedem Fall vermeiden.
> Plus die Massenspeicher Schnittstelle, aber um die geht es hier nicht.
Diese Schnittstelle bietet zumindest theoretisch Autostart (ja ich weiß
das wurde alles wieder abgeschalten) aber dafür keine
Echtzeit-Kommunikation zwischen dem PC und dem "Speichergerät" (schon
wegen dem Datei-Cache den alle modernen OSe haben).
> Der controller muss natuerlich den webserver spielen.
Den Webserver ansich sehe ich gar nicht mal als so großes Problem, man
muss ja nich gleich einen Apache nehmen, es gibt in der Embedded-Szene
durchaus einige kleine Webserver die auch anhand von Vorlagen Messwerte
usw. in einen HTML-Seite zur Laufzeit einpflegen können. Das wäre so
ungefähr die Größenordnung die ich mir wünschen würde. Nur
Ethernet/IP/TCP halte ich für zu aufwändig und für zu problemlastig
(IP-Adressen festlegen usw.)
> Und auf der PC Seite muss ein Demon, (Prozess) die serialports> kontrollieren, abfragen und falls erkannt das Serialport auf einen> Socket umleiten, sodass ein Browser ein Netzwerkdervice sieht.
Ansich eine wirklich interessante Idee die auch mit vertretbaren
Aufwand, selbst für mehrere OSe, machbar sein sollte. Es bleibt nur der
Hacken das der User vor der ersten Benutzung ein Programm installieren
muss das er erstmal bekommen muss, es wäre schön wenn es ohne dem ginge.
> Das automatische Oeffnen des Browsers halt ich fuer nicht gut
Die Bedenken kann ich natürlich gut nachvollziehen. Der KDE fragt mich
immer was er mit neuen USB-Geräten (die einer bekannten Device-Klasse
entsprechen, also eigentlich nur Massenspeicher und Kameras) passieren
soll. Ich denke ein oder zwei Mausklicks sind jedem User zuzumuten damit
ein neu eingestöpseltes USB-Gerät seinen Dienst aufnimmt.
Grüße
Erik
Erik schrieb:> Ein weiteres Problem mit nacktem Ethernet ist die Vergabe der> IP-Adressen
ist nicht wirklich ein Problem. Es gibt
http://en.wikipedia.org/wiki/Zero-configuration_networking> > sollte es automatisch unter Windows bei Geräten auftauchen.> Da sind genau zwei Worte die mir nicht so gut gefallen, Du ahnst sicher> schon, "sollte" und "Windows".
naja Linux war noch nie Benuzterfreundlich, dort wirst du so etwas nicht
finden, aber diese Leute kommen auch mit eine Anleitung und ein paar
scripten zurecht.
Erik schrieb:>> Dort kann man dann den Browser starten. (so wie bei den Fritzboxen)> Aha, ich hab zwar weder eine Fritzbox noch Windows (kann also nicht> nachvollziehen was Du genau meinst) aber das klingt zumindest halbwegs> nach dem was ich mir wünsche,
Windows stellt UPNP Geräte die es finden gleich in einer Liste darf,
dort kann man einfach mit Doppelklick die Webseite des Geräte öffnen.
Erik schrieb:> Noch andere Vorschläge?
dann wirst du wohl einen Webserver selber schreiben müssen, in Java
sollte er unter Windows und Linux laufen - aber nur wenn die Leute noch
Java haben. Dann müsste dein USB-Gerät ein Massenspeicher bereitstellen
wo der Webserver drauf ist. Eine Andere Möglichkeit sehe ich nicht.
Das wird definitiv schwer. Am weitesten kommst du wahrscheinlich mit der
CDC-ACM-Klasse, die ist weit unterstützt, und ein kleines
Terminalprogramm ist sowieso vorhanden oder einfach nachinstalliert.
uiii. schrieb:> Die mehr oder weniger einzige sinnvolle USB Anbindung fuer> Controller is> die USB to Serial. Denn die wird bleiben.
HID lässt sich auch sehr sinnvoll einsetzen, auch für
Nicht-Eingabe-Geräte. In diesem Fall aber eher nicht.
Hatte sowas mal als MSD gemacht.
War im Prinzip ein PIC18 mit nem 1MBit SO8-Flash. Meldete sich wie ein
USB Stick.
Darauf war die Oberfläche als HTML Datei. Diese hat ein Javascript
eingebunden, das per speziellem Ajax mit dem Filesystem, also dem PIC18
kommunizierte. Über eine RS232 konnte dann mit anderen Microcontrollern
kommunizieren.
Hat unter Win, Linux, Solaris, BSD, OSX funktioniert. Da es aber ein
"Hack" war gabs immer wieder mal Probleme, dass die neueste Firefox
Version wieder mal spezielle Zugriffe geschützt (verboten) hatte. Zum
Beispiel per Javascript auf ein weiteres Script zugreifen, das in einem
parallel-Ordner lag. Das Projekt wurde deshalb uninteressant.
gerd
Du bräuchtest ein Composite Device, das aus folgenden Geräten besteht:
1. Mass Storage, das ein USB CD-Laufwerk mit einem ISO bereitstellt.
Darüber gibts die Software, Dokumentation etc. Viele UMTS-Sticks machen
das so, aber auch mein Brother 2430PC Labelprinter.
2. RNDIS: eine standardisierte Ethernet-Schnittstelle, über die die
Kommunikation anschließend geht. Alternativ wäre auch eine USB CDC
Schnittstelle (also eine virtuelle serielle Schnittstelle) denkbar.
Windows braucht dafür ein .INF, das auf dem eingebauten ISO-Image
mitgeliefert wird.
USB-technisch ist das ganze nicht trivial, aber andere machen es ja
auch.
fchk
Peter II schrieb:> ist nicht wirklich ein Problem. Es gibt> http://en.wikipedia.org/wiki/Zero-configuration_networking
und wenn das lokale Netz des PCs bereits mit diesem IP-Adressraum
arbeitet, oder gar mehrere dieser USB-Geräte angestöpselt werden sollen?
Ich denke einem Gerät IP aufzupfropfen das eigentlich gar kein IP
braucht ist viel zu problemanfällig.
> naja Linux war noch nie Benuzterfreundlich,
Sory, aber mein Linux ist Benuzterfreundlich!
> Windows stellt UPNP Geräte die es finden gleich in einer Liste darf,> dort kann man einfach mit Doppelklick die Webseite des Geräte öffnen.
Solange diese Liste nicht zu arg versteckt ist ist das sicher eine
interessante Variante aber UPnP gibt es soweit ich weiß nur unter
Windows halbwegs brauchbar, MAC OS und Linux setzen wohl eher auf
Bonjour / Zero-Conf (das kann mehr als nur IP-Adressen vergeben), hab
ich selber schon für andere Projekte eingesetzt.
> Dann müsste dein USB-Gerät ein Massenspeicher bereitstellen wo> der Webserver drauf ist. Eine Andere Möglichkeit sehe ich nicht.
Aber per Massenspeicher kann man nicht wirklich mit dem USB-Gerät
kommunizieren, man kann das OS auch nicht dazu bringen auf bestimmte
Sektoren o.ä. zuzugreifen.
greg schrieb:> Am weitesten kommst du wahrscheinlich mit der CDC-ACM-Klasse,
die finde ich nicht, meinst Du CDC-ATM (CDC Subclass for Asynchronous
Transfer Mode Devices)?
Grüße
Erik
Erik schrieb:> Aber per Massenspeicher kann man nicht wirklich mit dem USB-Gerät> kommunizieren, man kann das OS auch nicht dazu bringen auf bestimmte> Sektoren o.ä. zuzugreifen.
ein USB-Gerät kann mehr Sachen gleichzeitig bereitstellen.
gerd schrieb:> Darauf war die Oberfläche als HTML Datei. Diese hat ein Javascript> eingebunden, das per speziellem Ajax mit dem Filesystem, also dem PIC18> kommunizierte.
ich kann mir ehrlich nicht vorstellen wie das zuverlässig funktionieren
sollte, jede Datei die der Browser per Script liest landet im Cache des
OS und wird damit nie wieder gelesen (ist also eine einmalige
Kommunikation und das auch nur in eine Richtung), es sei denn der
Massenspeicher ist deutlich größer als der RAM und hat genug Dateien.
> Da es aber ein "Hack" war gabs immer wieder mal Probleme, ...
Das kann ich mir lebhaft vorstellen.
Grüße
Erik
Peter II schrieb:> ein USB-Gerät kann mehr Sachen gleichzeitig bereitstellen.
Okay, nehmen wir einen Massenspeicher auf dem ein platformunabhängiges
Programm (z.B. in Java) liegt und eine virtuelle serielle Schnittstelle
o.ä., dann bleibt das Problem wie das Programm diese Schnittstelle
findet (selbst wenn mehrere ähnliche USB-Geräte angeschlossen sind) und
benutzen kann.
Kann Java mit seriellen Schnittstellen umgehen?
Kann ein Java-Programm herausfinden zu welchem USB-Gerät eine serielle
Schnittstelle gehört bzw. von welchem USB-Gerät es selber stammt?
Grüße
Erik
Ja. Im Prinzip war nur der 1MBit Speicher reel. Ich hab aber einfach
einen Stick mit fast unendlicher Größe vorgegaugelt. Und die Daten waren
jedesmal in einer anderen "virtuellen Datei" verpackt.
Erik schrieb:> Kann Java mit seriellen Schnittstellen umgehen?
ja
> Kann ein Java-Programm herausfinden zu welchem USB-Gerät eine serielle> Schnittstelle gehört bzw. von welchem USB-Gerät es selber stammt?
irgendwie bestimmt. Denn es ist ja EIN USB gerät, bei Linux müsste es
ich halt im /proc/usb und unter Windows gibt es auch Möglichkeiten. Man
müsste also den Zusammenhang zwischen Laufwerk und COM-Port herstellen.