Если предположить настройку, описанную в записи в блоге на веб-сайте iSeismometer, на ум приходит несколько вариантов.
Импорт
Первый вариант - использовать внешнюю программу для захвата пакетов, а затем использовать Import
для получения результатов, например,
Import["!someexternalprog", "Lines"]
Увы, программа Python, упомянутая в сообщении в блоге, будетне работает хорошо здесь, так как он работает в бесконечном цикле, который должен быть вручную завершен.Подход Import
будет работать только в том случае, если эта программа будет изменена для остановки после фиксированного количества пакетов или ограничения по времени или чего-то еще.
JLink
Альтернативный подходможет быть реализован без выхода из удобной среды Mathematica с помощью JLink.Ну, может быть, не стоит говорить о том, что мы остаемся в Mathematica, так как из кода Mathematica смешано довольно много забавного Java-кода.Тем не менее, он иллюстрирует полезность встроенного Java-дистрибутива, который поставляется с каждой копией Mathematica:
Needs["JLink`"]
LoadJavaClass["java.util.Arrays"];
ClearAll@ListenToISeismometer
ListenToISeismometer[port_] :=
JavaBlock@Module[{socket, packet, listen, record = Null, listening = True}
, packet = JavaNew["java.net.DatagramPacket", JavaNew["[B", 1024], 1024]
; listen[] :=
If[$Failed =!= Quiet[socket@receive[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]
; socket@setSoTimeout[1000]
; Reap[While[listening, listen[]]; socket@close[]][[2, 1]]
]
]
Некоторые ярлыки были сделаны в отношении обработки исключений, декодирования пакетов и тому подобного, чтобыдержите этот пример на управляемой длине.
ListenToISeismometer
должен быть предоставлен номер порта UDP для прослушивания.Давайте использовать тот же порт, что и в сообщении в блоге, 10552:
In[33]:= data = ListenToISeismometer[10552];
Функция будет прослушивать все UDP-события на этом порту до тех пор, пока ей не будет приказано остановиться.Для этого представлена кнопка, где каждый пакет мигает вдоль полученной стороны.Когда кнопка нажата, функция возвращает список полученных пакетов:
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 делает это возможным , но нельзя избежать того факта, что использование JLink требуетрабочее знание Java.