brainproduct 是一家專門提供腦電圖采集、放大、記錄、分析 服務的德國廠商。其recoder 系列産品十分厲害,在臨床中使用的十分廣泛。recoder運作起來就是類似于這個樣子:
但是,對于我們程式開發人員來說,我們希望能夠采集可操作的實時的腦波資料。可操作是指我們希望直接得到裝置采集過來的實時原始資料,基于這些原始資料,我們可以做進一步的分析 比如使用人工神經網絡對EGG進行模組化等等。而剛好 recoder系列産品又帶了一個remote data access (RDA)子產品,可以支援遠端的實時資料通路。美滋滋~~~
RDA子產品的網絡結構圖:
如上圖所示,安裝了Recorder記錄軟體的計算機就是一個RDA的服務端,RDA 用戶端提供TCP/IP協定來通路服務端,讀取實時資料。用戶端可以使用 python,C,C++,matlab等主流語言來編寫。
其實服務端就是維護了一個原生的TCP socket,然後我們在用戶端編寫socket程式 去通路 服務端就可以了。
打開RDA 服務端:
在recoder 軟體裡面,找到Configuration(配置)菜單, 點選子菜單 Preferences ,然後再preferences的對話面闆選擇remote data Access 欄目,點選那個enable remote data access 一下。效果如下圖:
打開服務端後,會打開兩個服務端口:51234和51244。第一個端口用于發送16位的資料,第二個端口使用者發送32位的資料。
配置用戶端
配置好服務端後,接下來我們就要在用戶端編寫代碼去通路服務端的51234端口或51244端口。
首先我們需要與服務端建立一個TCP連接配接, 使用标準的socket即可完成。
例如:
con=socket(AF_INET,SOCK_STREAM)
con.connect("192.168.1.190",)
其中192.168.1.190是剛剛配置好的服務端的主機IP位址,該主機需要打開RDA子產品才行。
連接配接好以後,用戶端就會等待服務端發來的資料,每個資料叫做一個data block。用戶端不需要發任何資料到服務端。
下面我們介紹 服務端發來的data block的封包格式。
data block的封包格式
每一個data block都是以下面這種格式布局的:
首先是一個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:各個通道的名稱,每個通道名稱沒有”\0”隔開
dResolutions:各個通道的精度(機關是uV)
RDA_MessageData消息
所有連接配接到服務端51234端口的用戶端都會接受到這個消息。該消息的内容如下:
nBlock :從伺服器開始監聽,目前塊的塊号。
nPoints:本資料塊資料點或者采樣點的個數
nMarkers:本資料塊中marker的個數
nData[]:實際的資料點,每個資料點是16位元組的有符号整數。
Markers[]:RDA_Marker類型的數組,每個RDA_Marker的結構:
nSize:本marker的位元組大小
nPosition:本marker對應的資料塊在nData[]中的起點位置,從0開始。
nPoints:本marker覆寫的采樣點個數
nChannel:本marker和那個Channel進行綁定
nTypeDesc:描述性文本,無終結符”\0”
RDA_MessageStop
該消息隻有Header,沒有資料段,表示監聽結束
RDA_MessageData32
和RDA_MessageData類似,唯一的差別在于:
RDA_MessageData32的采樣點的資料字段将RDA_MessageData的nData[]替代為fData[],fData的每個元素是32位的 float資料。
這四類資料看起來就像下面這樣的:
程式設計采集資料
未完待續 (^▽^)