Connecting to the NeuroSky ThinkGear API (in Scala)

If you want to connect to the NeuroSky ThinkGear API -- what they call the ThinkGear Socket Protocol -- this code shows you how to do it, at least in Scala. It consists of a few pieces of code I pulled from this GitHub repo. I wrote this code to help debug a problem I was seeing with the data.

The RawReader class does all the work. It opens a socket on the right port, then sends the necessary JSON to that socket to get things started. After that I just read the raw data that the API writes to the socket.

Here’s the source code:

package com.alvinalexander.neurosky

import java.io.OutputStreamWriter
import java.net.Socket
import java.io.{BufferedReader, InputStreamReader}
import scala.util.parsing.json.JSONObject

object RawRecorder extends App {

  val reader = new RawReader
  reader.start
  Thread.sleep(30*1000)
  reader.stop

}

class RawReader extends Thread {

  val host = "127.0.0.1" 
  val port = 13854
  val rawOutput = false
  val jsonFormat = true
  val socket = new Socket(host, port)
  val neuroInput = new BufferedReader(new InputStreamReader(socket.getInputStream))
  val neuroOutput = new OutputStreamWriter(socket.getOutputStream)

  def configure(rawOutput: Boolean = false, jsonFormat: Boolean = true) {
    val jsonConfig = new JSONObject(Map("enableRawOutput" -> rawOutput,
      "format" -> (if (jsonFormat) "Json" else "BinaryPacket")))
    neuroOutput.write(jsonConfig.toString())
    neuroOutput.flush()
  }
  
  configure(rawOutput, jsonFormat)

  override def run {
    while (true) {
      val line = neuroInput.readLine
      println(line)
    }
  }

}

This is written in Scala, so it’s an easy port to Java if someone needs that. Well, except for the JSON part, you’ll need to handle that differently in Java, but everything else is a simple port.

If you need to connect to the NeuroSky ThinkGear Socket Protocol API using Scala, I hope this has been helpful.