Verbindung zu einem UDP-Datenstrom mit Mathematica

8

Ich habe eine App auf meinem iPhone namens iSeismometer , die die Beschleunigungssensoren des iPhones liest und als Server fungiert, der diese Daten über UDP streamt ( Ich kann die IP-Adresse und die Portnummer einstellen). Die Frage ist, wie man diesen Datenstrom mit Mathematica liest? Anscheinend hat Dreeves dieses 12 Jahren , also stelle ich mir vor, dass in der Zwischenzeit etwas passiert sein muss.

Aktualisieren
Ich habe bis jetzt zwei großartige Antworten erhalten. einer von WReach und einer von Mark McClure. Beide verwenden JLink, um an die Daten zu gelangen. Dies scheint ein guter Ansatz zu sein. Ich wurde jedoch an eine Arbeit erinnert, die ich auf der WII Balance Board gemacht habe. Mit einigen kostenlosen Programmen (GlovePIE und PPJoy) habe ich dieses Bluetooth-Peripheriegerät als Joystick zu Windows und damit auch zu Mathematica (via ControllerState ) erscheinen lassen. Natürlich sind Bluetooth und UDP ganz anders, aber könnte etwas in der gleichen Richtung auch funktionieren?

    
Sjoerd C. de Vries 29.04.2011, 21:29
quelle

2 Antworten

4

JLink ist definitiv der richtige Weg. Ich bevorzuge es, meinen Java-Code und meinen Mathematica-Code getrennt zu halten, indem ich ein Java-Programm kompiliere, das ich dann von Mathematica anrufe. Ich habe ein Notebook- und Companion-Java-Programm eingerichtet, das Sie hier finden können: Ссылка

Hier ist der wesentliche Mathematica-Code:

%Vor%

Die updReader-Klasse wird durch den folgenden Java-Code definiert.

%Vor%

Beachten Sie, dass Sie die Hauptmethode der myClient-Klasse verwenden können, um zu überprüfen, ob Ihre Konfiguration ohne Mathematica funktioniert und im Wesentlichen ein potenzielles Problem aus der Schleife entfernt.

    
Mark McClure 30.04.2011, 19:55
quelle
4

Angenommen, das Setup wurde in einem Blogeintrag besprochen Auf der iseismometer Website kommen ein paar Optionen in den Sinn.

Importieren

Die erste Option wäre, ein externes Programm zu verwenden, um die Pakete zu erfassen, und dann Import zu verwenden, um die Ergebnisse einzubringen, z. B.

%Vor%

Leider wird das im Blogpost erwähnte Python-Programm hier nicht gut funktionieren, da es in einer Endlosschleife läuft, die manuell beendet werden muss. Der Import -Ansatz würde nur funktionieren, wenn das Programm geändert wurde, um nach einer festen Anzahl von Paketen oder einem Zeitlimit oder etwas zu stoppen.

JLink

Ein alternativer Ansatz kann implementiert werden, ohne die komfortable Mathematica-Umgebung mit JLink zu verlassen. Nun, vielleicht ist es eine Strecke zu sagen, dass wir in Mathematica bleiben, da eine Menge lustig aussehender Java-Code mit dem Mathematica-Code gemischt ist. Dennoch veranschaulicht es den Nutzen der integrierten Java-Distribution, die mit jeder Mathematica-Version ausgeliefert wird:

%Vor%

Es wurden einige Abkürzungen in Bezug auf Ausnahmebehandlung, Paketdekodierung und dergleichen gemacht, um dieses Beispiel in einer überschaubaren Länge zu halten.

ListenToISeismometer muss die UDP-Portnummer erhalten, auf die gewartet werden soll. Verwenden wir denselben Port wie im Blogpost 10552:

%Vor%

Die Funktion wird alle UDP-Ereignisse an diesem Port abhören, bis sie aufgefordert werden, anzuhalten. Zu diesem Zweck wird eine Schaltfläche angezeigt, bei der jedes Paket entlang der empfangenen Seite blinkt. Wenn die Schaltfläche gedrückt wird, gibt die Funktion eine Liste der empfangenen Pakete zurück:

%Vor%

JLink macht dies möglich , aber es gibt kein Entkommen an der Tatsache, dass die Verwendung von JLink Java-Kenntnisse erfordert.

    
WReach 30.04.2011 19:18
quelle

Tags und Links