OpenBCI Hub
THIS SOFTWARE HAS BEEN DEPRECATED AND IS NO LONGER IN ACTIVE DEVELOPMENT.
Middleware Software used to communicate with OpenBCI boards through TCP/IP command protocol. This Doc covers the OpenBCI Hub for Cyton, Ganglion, and WiFi Shield.
Last used with GUI v4.2.0 from January 2020.
Version
Version v2.1.0
last used January 2020.
Version v2.0.0
released September 2018.
Version v1.0.0
released January 3rd, 2017.
OpenBCI Electron Hub Overview
The OpenBCI Electron Hub (or just "Hub") is a TCP/IP server that listens for clients on port 10996
on localhost
aka 127.0.0.1
. Broadcast/multicast is never used for transmitting information to clients. Outgoing data is only transmitted to the requesting client. We use semantic versioning the protocol is always listed first and foremost in all documentation. Please follow the rules of semantic versioning to avoid breaking changes.
The hub is designed for either two use cases:
- An owning application, such as OpenBCI's processing app, starts and stops the Hub.
- The Hub runs continuously and 3rd party applications can simply connect as clients, use OpenBCI boards, disconnect and go on their way without closing the Hub.
A unique port, 10996
, is critical because applications must be able to hit a known port number on a local machine. This Specification shall be available here in the source code of the Hub.
Hub Command Protocol Overview
As of v2.0.0, the Hub uses JSON to pass messages send and receive messages over TCP. Each JSON string should end in a \n
. Parse for \n
and then strip the beginning of the string down to the character before \n
and use your languages built in JSON parser. The contents of the buffer can be now be considered a Message. The buffer can be flushed and the Message can be processed. There will always be a 'command' key which will aid in parsing the rest of message. The rest of the Message will then be translated based on the protocol for that command described in the Specification below. All commands sent to the client will be replied to asynchronously.
Example:
If a client sends {"type":"scan", "action":"start"}\n
to the Hub on 127.0.0.1:10996
, the Hub will respond with either {"type":"scan", "action":"start", "code":200}\n
if the scan was started or an error message if unable to start such as {"type":"scan","code":412,"message":"unable to start scan"}\n
.
Command Set
Commands are sent from the client to the Hub. Each command gets an asynchronous response with a meaningful code. When able, errors are sent with string error messages.
Accelerometer
type: accelerometer
Stop or start accelerometer.
action
- start
Description: Start accelerometer. Only useful for Ganglion.
Availability:
As of v1.0.0
Example:
{"type":"accelerometer", "action": "start"}
Response: on success
{"type":"accelerometer", "action": "start", "code": 200}
Response: on failure
{"type":"accelerometer", "action": "start", "code": 416, "message": "string error message"}
action
- stop
Description: Stop accelerometer. Only useful for Ganglion.
Availability:
As of v1.0.0
Example:
{"type":"accelerometer", "action": "stop"}
Response: on success
{"type":"accelerometer", "action": "stop", "code": 200}
Response: on failure
{"type":"accelerometer", "action": "stop", "code": 417, "message": "string error message"}
Board Type
type: boardType
Attempts to set the board type to user requested board type, such as when a user requests 16 channel Cyton. This command is only useful for Cyton because of Daisy.
boardType
- cyton
Description: Force set to 8 channel Cyton board.
Availability:
As of v2.0.0
Example:
{"type":"boardType", "boardType": "cyton"}
Response: on success
{"type":"boardType", "boardType": "cyton", "code": 200}
Response: on failure
{"type":"boardType", "boardType": "cyton", "code": 421, "message": "string error message"}
boardType
- daisy
Description: Force set to 16 channel Cyton board.
Availability:
As of v2.0.0
Example:
{"type":"boardType", "boardType": "daisy"}
Response: on success
{"type":"boardType", "boardType": "daisy", "code": 200}
Response: on failure
{"type":"boardType", "boardType": "daisy", "code": 421, "message": "string error message"}
Channel Settings
type: channelSettings
For setting the channel settings on a Cyton board with either WiFi or Serial protocols set.
Availability: as of v2.0.0
action
- start
Description: Used to start a channel setting sync. This will emit channel settings on success.
Availability:
As of v2.0.0
Example:
{"type":"channelSettings", "action": "start"}
Response: on success
{"type":"channelSettings", "action": "start", "code": 200}
Response: on failure when channel setting sync is already in progress
{"type":"channelSettings", "action": "start", "code": 422, "message": "Sync in progress"}
Response: on success for each channel, see the Response Set below for Channel Settings.
action
- set
Description: Used to set a channel for cyton over wifi or ganglion.
channelNumber
Channel number as zero indexed i.e. 0-7 or 0-15 for Cyton and Cyton with Daisy respectively.
powerDown
Will be either true
if channel is powered down and false
if channel is powered up like normal.
gain The integer version of the gain. i.e. 1, 2, 4, 6, 8, 12, 24
inputType
Selects the ADC channel input source. It's a 'String' that MUST be one of the following: "normal", "shorted", "biasMethod" , "mvdd" , "temp" , "testsig", "biasDrp", "biasDrn".
bias
Selects if the channel shall include the channel input in bias generation. It's a number where true
includes the channel in bias (default) or false
for channel removed from bias.
srb2
Select to connect true
this channel's P input to the SRB2 pin. This closes a switch between P input and SRB2 for the given channel, and allows the P input to also remain connected to the ADC. It's an integer where true
connects this input to SRB2 (default) or false
which disconnect this input from SRB2.
srb1
Select to connect true
all channels' N inputs to SRB1. This effects all pins, and disconnects all N inputs from the ADC. It's an integer where true
connects all N inputs to SRB1 and false
disconnects all N inputs from SRB1 (default).
Availability:
As of v2.0.0
Example:
{
"action": "set",
"type": "channelSettings",
"channelNumber": 3,
"powerDown": false,
"gain": 24,
"inputType": "normal",
"bias": true,
"srb2": true,
"srb1": false
}
Response: on success
{"type":"channelSettings", "action": "set", "code": 200}
Response: on failure to set command
{"type":"channelSettings", "action": "set", "code": 424, "message": "verbose error message here"}
Response: on failure to parse input commands properly. This means comma separated string input did not contain the correct positioned items. Verify with example.
{"type":"channelSettings", "action": "set", "code": 425, "message": "more verbose error message"}
Command
type: command
Passes through a COMMAND
, either one char or a string, to a connected device.
Availability: as of v2.0.0
command
- *
Description: Single or multi char to get passed through the module to the connected board. Multi char limited to 30 on WiFi and 19 on BLE.
Availability:
As of v2.0.0
Example:
{"type":"command", "command": "1"}
Response: on success
{"type":"command", "command": "start", "code": 200}
Response: on failure unable to write to connected device
{"type":"command", "command": "start", "code": 406, "message": "verbose error message"}
Response: on failure when protocol of current device is not selected
{"type":"command", "command": "start", "code": 420, "message": "verbose error message"}
Connect
type: connect
Connect to any device a local name or IP address.
Availability: as of v2.0.0
name
The local string name of a Cyton USB Dongle, Ganglion peripheral, or WiFi Shield unique name to connect to.
burst optional
True to use burst mode, only applies when UDP is set for protocol. Either true
and false
.
sampleRate optional
A number that is the requested sample rate to set the attached Ganglion or Cyton to. Ganglion must have v2.0.0 firmware or later and Cyton must have v3.0.0 firmware available. Value is in Hz and must be a valid sample rate for the board of choice.
latency optional
A number that is the latency for the inter-packet sending on the WiFi Shield. The time is in micro-seconds.
protocol optional
The type of internet protocol to use, either 'udp' or 'tcp'.
ipAdderss optional
The ip
Availability:
As of v2.0.0
Example for Ganglion and Cyton:
{"type": "connect", "name": "Ganglion-XXXX"}
Example for WiFi with name over tcp:
{
"type": "connect",
"name": "OpenBCI-XXXX",
"latency": 1000,
"sampleRate": 500,
"protocol": "tcp"
}
Example for WiFi with IP Address over UDP with burst mode:
{
"type": "connect",
"ipAddress": "192.168.4.1",
"latency": 1000,
"sampleRate": 500,
"protocol": "udp",
"burst": true
}
Response: on success
{"type":"connect", "firmware": "v2.0.0", "code": 200}
Response: on failure to connect
{"type":"connect", "code": 402, "message": "verbose error message"}
Response: on failure already connected
{"type":"connect", "code": 408}
Disconnect
type: disconnect
Disconnect from a connected device.
Availability:
As of v1.0.0
Example:
{"type":"disconnect"}
Response: on success
{"type":"disconnect", "code": 200}
Response: on failure unable to disconnect to connected device
{"type":"disconnect", "code": 401, "message": "verbose error message"}
Examine
type: examine
Examine a WiFi shield.
Availability:
As of v2.0.0
Example with shield name:
{"type":"examine", "shieldName": "OpenBCI-XXXX"}
Example with ipAddress:
{"type":"examine", "ipAddress": "192.168.4.1"}
If was searching for WiFi Shield prior to start, expect response on a
{"type":"scan", "action": "stop", "code": 200}
Response: on success
{"type":"examine", "code": 200}
Response: on failure to connect to device
{"type":"examine", "code": 402, "message": "verbose error message"}
Response: on failure if already connected to device
{"type":"examine", "code": 408, "message": "verbose error message"}
Response: on failure to stop scan
{"type":"examine", "code": 411, "message": "could not stop error"}
Impedance
type: impedance
Stop or start impedance testing for Ganglion or send a impedance setting for the cyton.
action
- set
Description: Used to set impedance registers for Cyton.
Availability:
As of v2.0.0
channelNumber
Channel number as zero indexed i.e. 0-7 or 0-15 for Cyton and Cyton with Daisy respectively.
pInputApplied
Should the impedance signal be routed to the P input channelNumber
nInputApplied
Should the impedance signal be routed to the N input channelNumber
Example:
{
"action": "set",
"type": "impedance",
"channelNumber": 3,
"pInputApplied": false,
"nInputApplied": true
}
Response: on success
{"type":"impedance", "action": "set", "code": 200}
Response: on failure to set impedance
{"type":"impedance", "action": "set", "code": 424, "message": "verbose error message here"}
Response: on failure to parse input commands properly.
{"type":"impedance", "action": "set", "code": 431, "message": "more verbose error message"}
action
- start
Description: Used to start impedance testing for Ganglion
Availability:
As of v1.0.0
Example:
{"type":"impedance", "action": "start"}
Response: on success
{"type":"impedance", "action": "start", "code": 200}
Response: on failure to start
{"type":"impedance", "action": "start", "code": 414, "message": "Error message"}
action
- stop
Description: Used to stop impedance testing for Ganglion
Availability:
As of v1.0.0
Example:
{"type":"impedance", "action": "stop"}
Response: on success
{"type":"impedance", "action": "stop", "code": 200}
Response: on failure to stop
{"type":"impedance", "action": "stop", "code": 415, "message": "Error message"}
Protocol
type: protocol
Protocol should also be started prior to each session. It will cleanly start a session. The currently supported protocols are ble
, bled112
, serial
, and wifi
.
Availability: as of v2.0.0
action
- start
Description: Start a protocol. Stop all other protocols before starting this new one.
Availability:
As of v2.0.0
protocol
The currently supported protocols are ble
, bled112
, serial
, and wifi
.
Only the Ganglion uses the ble
and bled112
as of today. Paired, with start
, the ble
will start a ble attempt to start the bluetooth low energy drivers. When using CSR Dongle on Windows, it's very important for you to use Zadig tool as described in the deprecated tutorial.
Example of ble
or bled112
for Ganglion:
{"type":"protocol", "action": "start", "protocol": "ble"}
Response: on success for Ganglion:
{"type":"protocol", "action": "start", "protocol": "ble", "code": 200}
Response: on failure to start ganglion ble driver
{"type":"impedance", "action": "start", "code": 419, "message": "failed to start driver"}
Only the Ganglion uses the ble
and bled112
as of today. Paired, with start
, the ble
will start a ble attempt to start the bluetooth low energy drivers. When using CSR Dongle on Windows, it's very important for you to use Zadig tool as described in the deprecated tutorial. This is not necessary for the BLED112 dongle.
Example of serial
for Cyton:
{"type":"protocol", "action": "start", "protocol": "serial"}
Response: on success for serial
Cyton:
{"type":"protocol", "action": "start", "protocol": "serial", "code": 200}
Example of wifi
for Cyton:
{"type":"protocol", "action": "start", "protocol": "wifi"}
Response: on success for wifi
for Cyton:
{"type":"protocol", "action": "start", "protocol": "wifi", "code": 200}
action
- status
Description: Check the to see if a protocol has been started and is set as the current protocol.
Availability:
As of v1.0.0
Example on ble
or bled112
:
{"type":"protocol", "action": "status", "protocol": "ble"}
Response: on on ganglion was started successfully and running
{"type":"protocol", "action": "status", "code": 200}
Response: on protocol is stopped
{"type":"protocol", "action": "status", "code": 501}
Example on serial
or wifi
:
{"type":"protocol", "action": "status"}
Response: on protocol is started
{"type":"protocol", "action": "status", "code": 304}
Response: on protocol is stopped
{"type":"protocol", "action": "status", "code": 305}
action
- stop
Description: Check the to see if a protocol has been started and is set as the current protocol.
Availability:
As of v1.0.0
Example for ble
, bled112
, serial
, and wifi
:
{"type":"protocol", "action": "stop", "protocol": "ble"}
Response: on stop for ble
, bled112
, serial
, and wifi
:
{"type":"protocol", "action": "stop", "protocol": "ble", "code": 200}
Scan
type: scan
Scan for devices for the protocol set previously and when found, send their local names to requesting client.
action
- start
Description: Start a scan. Stop a scan if one in progress before starting the newly requested scan.
Availability:
As of v1.0.0
Example:
{"type":"scan", "action": "start"}
Response: on success
{"type":"scan", "action": "start", "code": 200}
Response: on failure to start scan
{"type":"scan", "action": "start", "code": 412, "message": "Error message"}
Response: on failure to stop scan in progress
{"type":"scan", "action": "start", "code": 411, "message": "Error message"}
action
- status
Description: Is a scan in progress
Availability:
As of v1.0.0
Example:
{"type":"scan", "action": "status"}
Response: a scan is in progress for ganglion over ble and bled112
{"type":"scan", "action": "status", "code": 302}
Response: a scan is not in progress for ganglion over ble and bled112
{"type":"scan", "action": "status", "code": 303}
Response: a scan is in progress for wifi shields
{"type":"scan", "action": "status", "code": 304}
Response: a scan is not in progress for wifi shields
{"type":"scan", "action": "status", "code": 305}
action
- stop
Description: Stop a scan in progress
Availability:
As of v1.0.0
Example:
{"type":"scan", "action": "stop"}
Response: on success
{"type":"scan", "action": "stop", "code": 200}
Response: on failure because there is no scan in progress to stop
{"type":"scan", "action": "stop", "code": 410, "message": "Error message"}
Response: on failure because unable to stop scan
{"type":"scan", "action": "stop", "code": 411, "message": "Error message"}
SD Card
type: sd
The SD Card is only working on the Cyton. So you can only use it for protocols wifi
, and serial
.
Availability: as of v1.0.0
action
- start
Description: Start and SD card recording with a human readable command.
Availability:
As of v1.0.0
command
The currently supported protocols are serial
, and wifi
.
The duration you want to log SD information for. Opens a new SD file to write into. Limited to:
14sec
- 14 seconds5min
- 5 minutes15min
- 15 minutes30min
- 30 minutes1hour
- 1 hour2hour
- 2 hour4hour
- 4 hour12hour
- 12 hour24hour
- 24 hour
Example:
{"type":"sd", "action": "start", "command": "5min"}
Response: on success
{"type":"sd", "action": "start", "code": 200}
Response: on failure because there is no SD card or some other failure
{"type":"scan", "action": "start", "code": 499, "message": "Error message"}
action
- stop
Description: Stop an SD card recording. Does not have DURATION property.
Availability:
As of v1.0.0
Example:
{"type":"sd", "action": "stop"}
Response: on success
{"type":"sd", "action": "stop", "code": 200}
Response: on failure
{"type":"scan", "action": "stop", "code": 499, "message": "Error message"}
Status
type: status
Get the status of a Hub. If the TCO server in the Hub is working, this will always respond true.
Availability:
As of v1.0.0
Example:
{"type":"status"}
Response: on success
{"type":"status", "code": 200}
WiFi
type: wifi
Used to get information on an attached WiFi Shield.
Availability: as of v1.0.0
action
- eraseCredentials
Description: Erase credentials on the WiFi shield. Your WiFi shield must have no board attached. You should use the Examine command to connect to the WiFi Shield with no Ganglion or Cyton attached. The process will take about 6 seconds. WiFi Shield will become a hotspot again.
Availability:
As of v2.0.0
Example:
{"type":"wifi", "action": "eraseCredentials"}
Response: on success
{"type":"wifi", "action": "eraseCredentials", "code": 200, "command": eraseCredentials, "message": "Rebooting wifi shield in 5 seconds"}
Response: on failure because no wifi shield attached
{"type":"wifi", "code": 426}
Response: on failure when failure to erase credentials command fails
{"type":"wifi", "code": 428, "command": eraseCredentials, "message": "Error message"}
action
- getFirmwareVersion
Description: Get the firmware version of the attached WiFi Shield.
Availability:
As of v2.0.0
Example:
{"type":"wifi", "action": "getFirmwareVersion"}
Response: on success
{"type":"wifi", "command": "getFirmwareVersion", "code": 200, "message": "v3.1.1"}
Response: on failure because no wifi shield attached
{"type":"wifi", "code": 426}
action
- getIpAddress
Description: Get the IP Address of the attached WiFi Shield.
Availability:
As of v2.0.0
Example:
{"type":"wifi", "action": "getFirmwareVersion"}
Response: on success
{"type":"wifi", "command": "getFirmwareVersion", "code": 200, "message": "192.168.4.1"}
Response: on failure because no wifi shield attached
{"type":"wifi", "code": 426}
action
- getMacAddress
Description: Get the MAC Address of the attached WiFi Shield.
Availability:
As of v2.0.0
Example:
{"type":"wifi", "action": "getMacAddress"}
Response: on success
{"type":"wifi", "action": "getMacAddress", "code": 200, "message": "AA:12:AB:23:11:CD"}
Response: on failure because no wifi shield attached
{"type":"wifi", "code": 426}
action
- getTypeOfAttachedBoard
Description: If the WiFi Shield is connected to a board, return the type of board. Potential board types are none, cyton, daisy, or ganglion
Availability:
As of v2.0.0
Example:
{"type":"wifi", "action": "getTypeOfAttachedBoard"}
Response: on success
{"type":"wifi", "command": "getTypeOfAttachedBoard", "code": 200, "message": "cyton"}
Response: on failure because no wifi shield attached
{"type":"wifi", "code": 426}
Response Set
As soon as a client has established itself to the Hub as a requester of information, messages will asynchronously be sent to the client.
Accelerometer
type: accelerometer
Description: Accelerometer data from the Ganglion.
Availability:
As of v1.0.0
accelDataCounts
An array of integers with three indexs: [AXIS_X,AXIS_Y,AXIS_Z]
Where:
AXIS_X The X axis in raw integer counts.
AXIS_Y The Y axis in raw integer counts.
AXIS_Z The Z axis in raw integer counts.
Example:
{"type": "accelerometer", "code": 202, "accelDataCounts": [50, 0, 30]}
Channel settings
type: channelSettings
Description: Used to give registers of cyton
channelNumber
Channel number as zero indexed i.e. 0-7 or 0-15 for Cyton and Cyton with Daisy respectively.
powerDown
Will be either true
if channel is powered down and false
if channel is powered up like normal.
gain The integer version of the gain. i.e. 1, 2, 4, 6, 8, 12, 24
inputType
Selects the ADC channel input source. It's a 'String' that MUST be one of the following: "normal", "shorted", "biasMethod" , "mvdd" , "temp" , "testsig", "biasDrp", "biasDrn".
bias
Selects if the channel shall include the channel input in bias generation. It's a number where true
includes the channel in bias (default) or false
for channel removed from bias.
srb2
Select to connect true
this channel's P input to the SRB2 pin. This closes a switch between P input and SRB2 for the given channel, and allows the P input to also remain connected to the ADC. It's an integer where true
connects this input to SRB2 (default) or false
which disconnect this input from SRB2.
srb1
Select to connect true
all channels' N inputs to SRB1. This effects all pins, and disconnects all N inputs from the ADC. It's an integer where true
connects all N inputs to SRB1 and false
disconnects all N inputs from SRB1 (default).
Availability:
As of v1.0.0
Example:
{
"code": 207
"type": "channelSettings",
"channelNumber": 3,
"powerDown": false,
"gain": 24,
"inputType": "normal",
"bias": true,
"srb2": true,
"srb1": false
}
Impedance
type: impedance
Description: Impedance data from the Ganglion.
Availability:
As of v1.0.0
channel
Channel number as zero indexed i.e. 1,2,3,4 or 0 for the reference channel.
value
The impedance value in ohms for CHANNEL
.
Example:
{
"code": 203
"type": "impedance",
"channel": 3,
"value": 300
}
Message
type: message
Description: Message from the boards.
Availability:
As of v1.0.0
message
The string message from the Ganglion.
Example:
{
"code": 200
"type": "message",
"message": "Hello, world!",
"value": 300
}
Samples
type: data
Description: Sample from the boards.
Availability:
As of v1.0.0
startByte
Number should be 0xA0
sampleNumber
a Number between 0-255
channelData
channel data indexed at 0 filled with floating point Numbers in Volts) if sendCounts is false
channelDataCounts
channel data indexed at 0 filled with un scaled integer Numbers in raw ADS counts) if sendCounts is true
accelData
Array with X, Y, Z accelerometer values when new data available) if sendCounts is false
accelDataCounts
Array with X, Y, Z accelerometer values when new data available) Only present if sendCounts is true
auxData
Buffer filled with either 2 bytes (if time synced) or 6 bytes (not time synced)
stopByte
Number should be 0xCx where x is 0-15 in hex
boardTime
Number the raw board time
timestamp
Number the boardTime plus the NTP calculated offset
Example for gangliom:
{
"code": 200,
"type": "data",
"channelDataCounts": [0, 1, 2, 3]
}
Example for Cyton with accel:
{
"code": 200,
"type": "data",
"channelDataCounts": [0, 1, 2, 3, 4, 5, 6, 7],
"accelDataCounts": [0, 1, 2],
"stopByte": 192
}
Example for Cyton with Daisy in analog read mode:
{
"auxData": {
"lower": {
"data": [ 1, 215, 1, 45, 3, 250],
"type": "Buffer"
},
"upper": {
"data": [ 1, 215, 1, 44, 3, 251],
"type": "Buffer"
}
},
"valid": true,
"code": 204,
"stopByte": 193,
"_timestamps": {
"lower": 1543879978994,
"upper": 1543879978994
},
"channelDataCounts": [-7729993, -7649407, -7606327, -7571616, -7591709, -7687549, -7552756, -7590690, -7580998, -7556930, -7596914, -7549892, -7594576, -7658804, -7523426, -7662588],
"type": "data",
"sampleNumber": 52,
"timestamp": 1543879978994
}