我正在使用一个UDP套接字程序作为我的项目之一,来读取来自EEG耳机的输入数据。然后我用这些数据来控制机器人手臂中的伺服电机。我用来创建套接字和打印数据的代码运行良好。
import socket
import subprocess
UDP_IP = "169.254.110.133"
UDP_PORT = 50000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
while True:
(data,addr) = sock.recvfrom(1024)
print(data)即将进入的数据是来自耳机的原始脑电数据,在终端中如下所示:
SourceTime 31972
TargetCode 1
ResultCode 0
Feedback 1
PauseApplication 0
CursorPosX 717
CursorPosY 2047
CursorPosZ 2047这个数据有33个不同的部分,每几毫秒。数据总是按相同的顺序排列。对于我的代码,我只需要从数据中获取一些信息(TargetCode、ResultCode和反馈)。如何过滤掉这些部分并在代码中使用它们。有没有办法查找TargetCode并复制号码?或者,由于TargetCode总是在33节的流中是24的,我可以这样提取它吗?
发布于 2018-12-14 00:03:10
这是个老问题。您可以使用python调用在Linux套接字上应用过滤器(其他平台选择请参见下面):
sock.setsockopt(socket.SOL_SOCKET, SO_ATTACH_FILTER, filter)然而,我们讨论的是一个编译和解析的过滤器:
SO_ATTACH_FILTER的参数是一个sock_fprog结构,定义于: 结构sock_fprog {无符号短伦;结构sock_filter *过滤器;}; SO_ATTACH_BPF的参数是由bpf(2)系统调用返回的文件描述符,必须引用BPF_PROG_TYPE_SOCKET_FILTER类型的程序。 来源:http://man7.org/linux/man-pages/man7/socket.7.html
这并不容易构建,特别是在Python上。
有几个很好的选择:
attach_filter(socket, filter, interface)函数(Linux & OSX),它使用tcpdump解析过滤器,然后构建编译器过滤器并将其应用于套接字sock = conf.L2socket(filter="tcp") )。这是跨平台的(甚至是Windows)。(谷歌获取更多信息)然后,您只需传递一个过滤器,如:
host 10.0.0.1
port 80
tcp port 80 and host 10.0.0.1
host 10.0.0.1 or host 10.0.0.2 or port 80 or port 443所有过滤器都采用BPF格式(请看Filter)
发布于 2016-07-14 19:09:06
这可能会有帮助。
服务器
import socket
s = socket.socket()
UDP_IP = "169.254.110.133"
UDP_PORT = 50000
sock.bind((UDP_IP, UDP_PORT))
s.listen(5)
while True:
c, addr = s.accept()
c.send('Connected to server.')
c.close() 客户端
import socket
UDP_IP = "169.254.110.133"
UDP_PORT = 50000
s = socket.socket()
s.connect((UDP_IP,UDP_PORT))
print (s.recv(1024))
s.close https://stackoverflow.com/questions/38381540
复制相似问题