在Python中处理来自缓冲区的TCP / IP数据

时间:2017-04-03 11:59:23

标签: python sockets numpy stream tcp-ip

我正在构建一个Python类,通过TCP / IP连接到OpenVibe软件,并将读取该软件流的EEG数据。

OpenVibe是一种开源软件,可以记录EEG,并且能够通过TCP / IP将数据发送到另一台计算机进行处理。我想在localhost的同一台计算机上处​​理它,然后控制一些Arduino的东西。但是我一直在收拾这条小溪。

OpenVibe网站上有文档对我来说不太清楚: http://openvibe.inria.fr/documentation/1.2.0/Doc_BoxAlgorithm_TCPWriter.html

到目前为止,我理解我需要从缓冲区中按字节读取数据并处理每个数据包变化的通道和样本,这在docuemntation 2b表中有所描述。

当我使用代码时:

  1. 连接到服务器
  2. 读取while循环中的每32个字节
  3. 我需要以某种方式处理缓冲区中的数据,但不知道如何处理。

    我的整个Python 3类使用macOS 10.12.4: https://gist.github.com/neuropacabra/3dbeed04fd0d6a257476af1e0ff36567

    我认为在调用readstream()循环时,主要问题在于函数while strreaming

    def readstream(self, info = True):
        try:
            import numpy
        except:
            print("Cannot import numpy module")
    
        if self.header_readed:
            print("Reading the TCPWritter stream...")
            stream = []
            eeg_data = []
            is_streaming = True
    
            while is_streaming:
                try:
                    stream = numpy.frombuffer(self.sock.recv
                                              (self.samples_per_chunk), 
                                              dtype = numpy.float32, 
                                              count = -1)
                except:
                    print("Cannot read datastream")
                if numpy.size(stream) != 0:
                    eeg_data.append(stream)
                    if info:
                        print(stream)
                    return stream                    
                else:
                    is_streaming = False
                    self.disconnect()
                    print("No data in buffer, socket is closed.")
        else:
            print("No header was read. Cannot recieve datastream.")
    

    我需要能够像OpenVibe文档所说的那样从缓冲区处理数据:

    | Name                  | Type          | Bytes from start   |
    | --------------------  | ------------- | ------------------ |
    | Channel 1, sample 1   | float64       | 32 + (k*0+0)*8     |
    | Channel 1, sample 2   | float64       | 32 + (k*0+1)*8     |
    | ...                   | ...           | ...                |
    | Channel 1, sample k   | float64       | 32 + (k*0+(k-1))*8 | 
    | Channel 2, sample 1   | float64       | 32 + (k*1+0)*8     |
    | Channel 2, sample 2   | float64       | 32 + (k*1+1)*8     |
    | ...                   | ...           | ...                |
    | Channel 1, sample k+1 | float64       | 32 + (k*n+0)*8     |
    | ...                   | ...           | ....               |
    

    假设我会使用4个频道进行流式传输。我将OpenVibe通过TCP / IP发送数据,如表所示,但我无法正确读取它。现在我得到一些随机值因为我不解析缓冲区数据所以我基本上读取了所有数据。

    如何编码以及时读取通道1,通道2,通道3和通道4的所有样本?

    谢谢你的建议!

    迈克尔

0 个答案:

没有答案