Suponiendo que la configuración se discutió en un blog entry en el sitio web iSeismometer, un par de opciones vienen a la mente.
importación
La primera opción sería utilizar un programa externo para capturar los paquetes, y luego usar Import
a traer a los resultados, por ejemplo,
Import["!someexternalprog", "Lines"]
Por desgracia, el programa de Python se menciona en el blog no va a funcionar bien aquí ya que se ejecuta en un bucle sin fin que debe ser terminado manualmente. El enfoque Import
solo funcionaría si ese programa se modificara para detenerse después de un número fijo de paquetes o un límite de tiempo o algo así.
JLINK
Un enfoque alternativo se puede implementar sin salir del entorno Mathematica cómoda mediante el uso de JLINK. Bueno, tal vez sea exagerado decir que nos quedamos dentro de Mathematica ya que una buena cantidad de código Java de aspecto divertido se mezcla con el código de Mathematica. Sin embargo, sirve para ilustrar la utilidad de los que los buques incorporados en la distribución de Java con cada copia de Mathematica:
Needs["JLink`"]
LoadJavaClass["java.util.Arrays"];
[email protected]
ListenToISeismometer[port_] :=
[email protected][{socket, packet, listen, record = Null, listening = True}
, packet = JavaNew["java.net.DatagramPacket", JavaNew["[B", 1024], 1024]
; listen[] :=
If[$Failed =!= Quiet[[email protected][packet], Java::excptn]
, record =
JavaNew[
"java.lang.String"
, java`util`Arrays`copyOfRange @@ packet /@ {getData[], getOffset[], getLength[]}
]@toString[] // Sow
]
; Row[{Button["Stop", listening = False], Dynamic[record]}, " "] // PrintTemporary
; AbortProtect[
socket = JavaNew["java.net.DatagramSocket", port]
; [email protected][1000]
; Reap[While[listening, listen[]]; [email protected][]][[2, 1]]
]
]
Algunos accesos directos se han tomado con respecto al manejo de excepciones, decodificación de paquetes y similares con el fin de mantener esta ejemplo en una longitud manejable.
ListenToISeismometer
necesita recibir el número de puerto UDP para escuchar. Vamos a utilizar el mismo puerto como en la entrada del blog, 10552:
In[33]:= data = ListenToISeismometer[10552];
La función va a escuchar a todos los eventos de UDP en el puerto hasta que dicho parar. Se presenta un botón para este propósito, con cada paquete parpadeando a lo largo del lado tal como se recibió. Cuando se pulsa el botón, la función devuelve una lista de los paquetes recibidos:
In[34]:= data // Column
Out[34]= 1,83575.099,0.029,0.044,0.094
1,83575.781,0.056,0.033,0.099
1,83575.924,0.047,0.054,0.094
1,83575.613,0.096,0.092,0.057
1,83575.748,0.073,0.049,0.061
1,83575.577,0.008,0.089,0.020
...
JLINK hace que este posible, pero no se puede escapar el hecho de que el uso de JLINK requiere un conocimiento práctico de Java.
Supongo que ninguna de las sugerencias en ese hilo funciona para usted, ¿verdad? –
@ Mr.Wizard Parecía tratar con TCP en lugar de UDP, también involucraba a MathLink con el que no estoy muy familiarizado, usando código para una plataforma diferente (Unix/Solaris), basado en versiones antiguas de mma. Francamente, parecía mucho trabajo. Como podría haber paquetes cómodos escritos desde entonces, pensé que sería mejor esperar primero las sugerencias. –
Mi pregunta puede haber dado a entender que debería buscar soluciones en ese hilo, pero esa no era mi intención. Por el contrario, solo quería confirmar que no sería de agradecer publicar una versión de una de las respuestas a ese hilo. Supongo que se podría suponer, y por lo tanto mi pregunta no tenía sentido. :-) –