Sjo*_*ies 8 udp wolfram-mathematica
我的iPhone上有一个名为iSeismometer的应用程序,可以读取iPhone的加速度计,并充当通过UDP传输此数据的服务器(我可以设置IP地址和端口号).问题是如何使用Mathematica读取此数据流?显然,Dreeves在12年前一直在研究这个问题,所以我想在此期间肯定会发生一些事情.
更新
到目前为止我得到了两个很好的答案 一个来自WReach,一个来自Mark McClure.两者都使用JLink来获取数据.这似乎是一个很好的方法.但是,我想起了我在WII平衡板上所做的一些工作.使用一些免费程序(GlovePIE和PPJoy),我得到了这个蓝牙外设,它可以作为Windows的操纵杆出现,因此也可以作为Mathematica(via ControllerState).当然,蓝牙和UDP是完全不同的,但也可以使用同样的东西来工作吗?
JLink 绝对是您的最佳选择。我更喜欢通过编译 Java 程序来将我的 Java 代码和 Mathematica 代码分开,然后从 Mathematica 调用该程序。我设置了一个 Notebook 和配套的 Java 程序,您可以在这里获取: http: //facstaff.unca.edu/mcmcclur/UDPFiles.tar.gz
这是基本的 Mathematica 代码:
Needs["JLink`"];
InstallJava[];
AddToClassPath[NotebookDirectory[]];
udpReader = JavaNew["myClient"];
i = 0;
While[True && i++ < 100,
Print[udpReader@udpReadOne[10552]]]
Run Code Online (Sandbox Code Playgroud)
updReader 类由以下 Java 代码定义。
// A simple UDP client to read from iseismometer:
// http://www.iseismometer.com/
// You can run this from the command line via "java myClient"
// to check that your iseismometer setup is correct or you can
// call the the udpReadOne method from another program.
import java.io.*;
import java.net.*;
import java.util.*;
public class myClient {
public static void main() throws IOException {
DatagramSocket socket = new DatagramSocket(10552);
byte[] buffer = new byte[500];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while(true) {
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println(received);
}
}
public static String udpReadOne(int port) throws IOException {
DatagramSocket socket = new DatagramSocket(port);
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
socket.close();
return received;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用 myClient 类的 main 方法来检查您的设置是否在没有 Mathematica 的情况下正常工作,从本质上解决了一个潜在问题。