OOCSI

OOCSI, short for “Out of Control for Semantic Interactivity”, is a simple, easy-to-use connection fabric that allows designers to easily create distributed systems (Funk, 2019).

What it is

OOCSI is a message-based connectivity layer, event bus and RPC middleware that connects clients running Processing, plain Java, Python, Arduino ESP (C/C++), JavaScript (HTML5 web sockets; Node.js), OSC (Pd, MaxMSP, …) and more. OOCSI covers platforms such as desktop, mobile (iOS, Android), and embedded platforms (ESP). Clients can exchange semantic data via messages and channels, communicate synchronously and asynchronously, and build flocks of micro-services. The server component of OOCSI is built in Java and maintained as an open source project as well. There is also a growing library of examples for systems design building blocks such as synchronization, election and consensus algorithms.

How it can be used

OOCSI can be used for educational, creative and commercial purposes alike, it is open-source and fully supported from TU/e Industrial Design. OOCSI allows to build small or medium-sized systems of different components that all communicate and exchange data in similar ways. The interface to sending and receiving data with OOCSI is almost same on all supported platforms (see above). This allows to transfer your knowledge from one platform to the next, which is great for using OOCSI in a research and education context. Over the years, students and researchers know how to get results quickly–and there is always someone around to help.

We can confidently say that OOCSI supports 99% of use-cases for prototyping connectivity in our department (with the only exception of streaming audio and video).

Learning about OOCSI

The easiest way to learn about OOCSI is to enroll in my course “Technologies for Connectivity” which runs for several years now from February till April. All lectures about OOCSI have been filmed in 2019, and they will be available here soon.

OOCSI tools

While OOCSI is commonly used in a coding context, there are a few “no-code” tools available to work with OOCSI for prototyping or quick debugging sessions.

  • OOCSImote is a quick prototyping tool for building web-based remote (“mote”, yes you got it!) controls for triggering or controlling prototypes. Think of a physical prototype with a servo motor; you can quickly prototype motor motion with OOCSImote. Or, think of a design deployment; you can remote-control the deployed prototype to move from one design intervention to the next.
  • animOOCSI is a connected animation tool that allows for drawing curves and sending the values on the drawn curves to the OOCSI network. This can be used to prototype interaction and motion, or to control periodic behaviors of prototypes.
  • Dashboard is a tool to visualise data in the OOCSI network as timeseries charts. We use the dashboard in almost every project to check on the data transmission and to record sensor data. Imagine prototyping a design that relies on heartbeat signals or heart rate variability; the dashboard can easily show how the prototype performs over time.
  • IoTsim is a sequencing tool that allows to script event sequences that are looped over an adjustable time frame. The scripted events are sent out to the OOCSI network, and this can, for instance, be used to simulate human behavior in a smart home.

All OOCSI tools are integrated in the OOCSI platform and available from the landing page of a running OOCSI server.

Roadmap

OOCSI is mature, but there are a lot of improvements happening continuously. Also, we extend the

  1. Middleware, Design, Education, Connectivity, Ja...

    Funk, M. (2019). OOCSI. https://doi.org/10.5281/zenodo.1321219

    Cite: BibTeX
    @misc{59e8875edfb340e78098c49418627b27,
      title = {OOCSI},
      keywords = {Middleware, Design, Education, Connectivity, Java, Processing, Python, C++, Node.js, WebSocket, Server, Web platform},
      author = {Funk, Mathias},
      year = {2019},
      month = may,
      day = {22},
      doi = {10.5281/zenodo.1321219},
      language = {English}
    }