INDI is a protocol designed to support control, automation, data acquisition, and exchange among hardware devices and software frontends. INDI stands for the Instrument-Neutral-Distributed-Interface, and was developed by Elwood C. Downey of ClearSky Institute.
Control systems are often written for a specific device or range of devices. When one or more of the device parameters change, the software needs to be modified to accommodate the change. That is, the software frontend and hardware backend are tightly coupled.
INDI Control Protocol INDI resolves this problem by providing a framework that decouples low level hardware drivers from high level front end clients. That is, clients that use the device drivers are completely unaware of the device capabilities. In run time, clients communicate with the device drivers and build a completely dynamical GUI based on the services provided by the device.
INDI Architecture
In essence, INDI provides the capacity to describe any device and its parameters to any INDI-compliant client. Once you have a client, you can develop as many devices as you can without any changes on the client side. But this is not all! Since INDI's protocol is based on XML, it can be easily parsed and nested in other frameworks. For example, you can incorporate INDI in RTML to place observational constraints on your devices. Furthermore, remote control of devices is seamless with INDI's server/client architecture. Distributed devices can be controlled from one centralized environment. Finally, INDI drivers are scriptable using INDI scripting tools. You can use these command line tools in your favourite language to have complete control of the device. These tools enable developers to provide scheduling and automation frameworks for their devices.
INDI driver is what communicates directly to your device. A driver may connect to one or more physical devices. It is responsible for controlling the device parameters and for defining them to clients. Drivers send a list of supported device properties to clients where they are parsed and presented to the end users.
For more information on INDI drivers, please refer to INDI Developers Manual.
INDI server is the hub that sits between your devices and your clients. It reroutes traffic for control and data acorss distributed networks. Each device or client in the network is a node and may communicate with other nodes whenever desired. The server supports broadcasting, chaining, and marshalling of data. Moreover, the server support dynamic startup and shutdown of devices upon request.
INDI Server Network Topology
Clients are the software frontends that communicate with the hardware drivers. They usually communicate with INDI hardware drivers via INDI server, though they can communicate with the drivers directly. There are many types of clients, most notably:
INDI Control Panel in DCD
Thanks to the generic nature of INDI, INDI can virtually control any device. While our focus is astronomical instruments, there is nothing that prevents you from writing an INDI driver for your toaster! Currently, INDI Library supports a growing number of telescopes, CCD, focusers, filter wheels and video capture devices. For a complete list, please visit INDI devices page. If your device doesn't exist in the devices list page, there is a couple of things you can do:
INDI fully supports ArduinoINDI Library is shipped with many Linux distributions today by default, and is available for Mac OS via MacPorts. Check if your distribution includes one of INDI compatible clients. Ideally, GUI clients should take care of establishing INDI server and providing users with a list of supported drivers.
Support for Windows port of INDI Library is under progress. Nevertheless, you may opt to use wINDI which is a complete implementation of INDI under .NET. You may use the INDI version shipped with your client, or at your option, you may download the latest stable INDI release from the download section.
KStars Device Manager
All INDI compatible clients can also connect to local and remote INDI servers. So you should first start INDI server, then configure your client to connect to it. INDI server must be running on the same physical machine connected to the device. For example, to start INDI server to run the LX200 GPS telescope on localhost and listening on default port 7624, type:
$ indiserver indi_lx200gps