class="markdown_views prism-dracula">
brainproduct 是一家专门提供脑电图采集、放大、记录、分析 服务的德国厂商。其recoder 系列产品十分厉害,在临床中使用的十分广泛。recoder运行起来就是类似于这个样子:
![这里写图片描述](data/attach/1904/ycdg0zuywp5vt208h8byq5zan5opzvzo.jpg)
但是,对于我们程序开发人员来说,我们希望能够采集可操作的实时的脑波数据。可操作是指我们希望直接得到设备采集过来的实时原始数据,基于这些原始数据,我们可以做进一步的分析 比如使用人工神经网络对EGG进行建模等等。而刚好 recoder系列产品又带了一个remote data access (RDA)模块,可以支持远程的实时数据访问。美滋滋~~~
RDA模块的网络结构图:
![这里写图片描述](data/attach/1904/77jx1g5928lv770524f6b0f6mknh5pra.jpg)
如上图所示,安装了Recorder记录软件的计算机就是一个RDA的服务端,RDA 客户端提供TCP/IP协议来访问服务端,读取实时数据。客户端可以使用 python,C,C++,matlab等主流语言来编写。
其实服务端就是维护了一个原生的TCP socket,然后我们在客户端编写socket程序 去访问 服务端就可以了。
打开RDA 服务端:
在recoder 软件里面,找到
Configuration(配置)菜单, 点击子菜单
Preferences ,然后再preferences的对话面板选择
remote data Access 栏目,点击那个enable remote data access 一下。效果如下图:
![这里写图片描述](https://img-blog.csdn.net/20171014084419273?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam1oMTk5Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
打开服务端后,会打开两个服务端口:51234和51244。第一个端口用于发送16位的数据,第二个端口用户发送32位的数据。
配置客户端
配置好服务端后,接下来我们就要在客户端编写代码去访问服务端的51234端口或51244端口。
首先我们需要与服务端建立一个TCP连接, 使用标准的socket即可完成。
例如:
con=socket(AF_INET,SOCK_STREAM)
con.connect("192.168.1.190",51244)
其中192.168.1.190是刚刚配置好的服务端的主机IP地址,该主机需要打开RDA模块才行。
连接好以后,客户端就会等待服务端发来的数据,每个数据叫做一个data block。客户端不需要发任何数据到服务端。
下面我们介绍 服务端发来的data block的报文格式。
data block的报文格式
每一个data block都是以下面这种格式布局的:
![这里写图片描述](https://img-blog.csdn.net/20171014091043436?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam1oMTk5Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
首先是一个Header 头部区域,里面描述了后面实际数据的类型,长度,标识符。
Header主要包含三个字段:
- guid ,一个128比特的常数,用于唯一标识该data block
- nSize, 描述了整个data block的大小。(1字节为单位)
- nType,数据类型,描述后面data的是哪一类数据。
nType可以取四个值:
nType取值 |
含义 |
备注 |
1
RDA_MessageStart
启动消息
2
RDA_MessageData(for 16bit)
数据消息(从服务端51234端口发出)
3
RDA_MessageStop
停止消息
4
RDA_MessageData(for 32bit)
数据消息(从服务端51244端口发出)
RDA的四类Message 格式
RDA_MessageStart消息
启动消息是在服务端切换到监听模式,同时有客户端登入进来的时候发送的。
RDA_MessageStart消息
主要包含如下信息:
nChannels:通道数目
dSamplingInterval:信号采用间隔,单位是uS,微秒。
sChannelNames:各个通道的名称,每个通道名称没有”