# awesome-open-iot

A curated list of awesome open source IoT frameworks, libraries and software.

Note that the list only features components we think are particularly relevant for IoT (e.g they are appropriate for use in embedded IoT devices, deal with the specific constraints of IoT communication networks, etc.). The reader will want to refer to the Awesome catalog for more references in his/her programming language or technical field of choice.

- Awesome Open IoT
  - Connectivity
    - Bluetooth 4.0, Bluetooth Smart (BLE)
    - enOcean
    - KNX
    - LoRa / LoRaWAN
    - NFC
    - RS-232 / Serial
    - RS-485
    - ZigBee
    - Z-Wave
  - Data Encoding
    - CBOR
    - FlatBuffers
    - Protocol Buffers
  - Data Visualization
  - Data Storage
  - Device Discovery
    - mDNS / Bonjour
    - uPNP
  - Gateway
  - Home Automation
  - Messaging
    - CoAP
    - Modbus
    - MQTT
    - MQTT-SN
    - OPC-UA
  - Operating Systems
  - Remote Management
    - LWM2M
    - OMA-DM
    - SNMP
    - TR-069
  - Robotics and Physical computing
  - Security
    - DNS-SEC
    - DTLS
    - TLS
  - Workflow management
- Contributing

## Connectivity

### Bluetooth 4.0, Bluetooth Smart (BLE)

Name | Description | License | Language
--- | --- | --- | ---
bluez | Official Linux Bluetooth protocol stack | GPL | C
Gatt | Gatt is a Go package for building Bluetooth Low Energy peripherals | BSD-3 | Go
noble | A Node.js BLE (Bluetooth Low Energy) central module | MIT | Node.js

### enOcean

Name | Description | License | Language
--- | --- | --- | ---
EnJ | EnJ: EnOcean Java library | ASL | Java
Python EnOcean | A Python library for reading and controlling EnOcean devices | MIT | Python
serialport-enocean-parser | An EnOcean Serial Protocol 3 (ESP3) parser for node-serialport | WTFPL | Node.js

### KNX

TBC

### LoRa / LoRaWAN

Name | Description | License | Language
--- | --- | --- | ---
LoRa packet forwarder | A program running on the host of a Lora Gateway that forward RF packets receive by the concentrator to a server through a IP/UDP link, and emits RF packets that are sent by the server. | BSD-3 | C
The Things Network | A complete LoRaWAN network stack (router, broker, message handler) | MIT | Go

### NFC

Name | Description | License | Language
--- | --- | --- | ---
libnfc | libnfc is a library which allows userspace application access to NFC devices. | LGPL v3 | C
Go NFC | Go bindings for libnfc | LGPL v3 | Go
Node NFC | Node.js bindings for libnfc | MIT | Node.js
Java NFC | nfctools library for Java | ASL | Java

### RS-232 / Serial

Name | Description | License | Language
--- | --- | --- | ---
Java Simple Serial Connector | Platform-independent serial port access for Java | LGPL | Java
rxtx | A Java cross platform wrapper library for the serial port | LGPL | Java/C
OpenJDK Device/IO | The Device I/O Project provides a Java-level API for accessing generic device peripherals on embedded devices. | GPL w/ classpath exception | Java/C

### RS-485

TBC

### ZigBee

TBC

### Z-Wave

TBC

## Data Encoding

This section focuses on data encoding formats that are particularly appropriate for IoT scenarios (i.e bandwidth or battery efficient, small memory footprint, …)

### CBOR

Name | Description | License | Language
--- | --- | --- | ---
TinyCBOR | TinyCBOR is Intel’s industrial strength C/C++ implementation of CBOR, as used in the IoTivity framework. | MIT | C

More at: http://cbor.io/impls.html

### FlatBuffers

Name | Description | License | Language
--- | --- | --- | ---
Offical libraries from Google | FlatBuffers is an efficient cross platform serialization library for games and other memory constrained apps. | ASLv2 | C++, C#, C, Go, Java, JavaScript, PHP, Python

### Protocol Buffers

Name | Description | License | Language
--- | --- | --- | ---
Offical libraries from Google | Protocol Buffers (a.k.a., protobuf) are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data. | BSD-3 | C++, Java, Python, Objective-C, C#, JavaScript, Ruby, Go
nanopb | Nanopb is a small code-size Protocol Buffers implementation in ansi C. It is especially suitable for use in microcontrollers, but fits any memory restricted system. | BSD-3 | C

## Data Visualization

See awesome-dataviz.

## Data Storage

Name | Description | License | Language
--- | --- | --- | ---
CrateDB | CrateDB is a distributed SQL database that makes it simple to store and analyze massive amounts of machine data in real-time. | Apache 2.0 | Java

## Device Discovery

### mDNS / Bonjour

Name | Description | License | Language
--- | --- | --- | ---
mdns | Simple mDNS client/server library in Golang | MIT | Go
bonjour | mDNS/DNS-SD (also known as Apple Bonjour) library for Go (in pure Go) | MIT | Go
node_mdns | mDNS/zeroconf/bonjour service discovery add-on for Node.js | MIT | Node.js
mdnsjava | Multicast DNS (mDNS) & DNS-Based Service Discovery (DNS-SD) in Java | BSD | Java

### uPNP

Name | Description | License | Language
--- | --- | --- | ---
goupnp | goupnp is a UPnP client library for Go | BSD-2 | Go
UpnpServer | Fast and light upnp server for Node.js | GPLv2 | Node.js
Cling | Java/Android UPnP library and tools | LGPL/CDDL-1.0 | Java

## Gateway

Name | Description | License | Language
--- | --- | --- | ---
Eclipse Kura | Eclipse Kura is a Java/OSGi-based framework for IoT gateways |  | Java
OpenWrt | OpenWrt is an embedded operating system based on the Linux kernel, primarily used on embedded devices to route network traffic | GPLv2 | C, Lua
UBOS | UBOS is an Arch-derived Linux distro optimized for cost-efficient administration Personal Servers and Indie IoT Devices | Linux | many

## Home Automation

Name | Description | License | Language
--- | --- | --- | ---
Calaos | Calaos is a free software project (GPLv3) that lets you control and monitor your home. | GPLv3 | C++
Freedomotic | Freedomotic is an open source, flexible, secure Internet of Things (IoT) development framework, useful to build and manage modern smart spaces. | GPLv2 | Java
openHAB | The open Home Automation Bus (openHAB) project aims at providing a universal integration platform for all things around home automation | EPL | Java
Eclipse SmartHome | The Eclipse SmartHome project is a framework that allows building smart home solutions that have a strong focus on heterogeneous environments. It provides a uniform access to devices and information and to facilitate different kinds of interactions with them. | EPL | Java
Home Assistant | Home Assistant is a home automation platform running on Python 3. It is able to track and control all devices at home and offer a platform for automating control. | Apache 2.0 | Python 3

## Messaging

### CoAP

Name | Description | License | Language
--- | --- | --- | ---
Californium | Californium is a Java CoAP implementation for IoT Cloud services. | EPL/EDL | Java
microcoap | A small CoAP implementation for microcontrollers | MIT | C (Arduino)
gocoap | Implementation of CoAP in go | MIT | Go
node-coap | node-coap is a Node.js client and server library for CoAP modelled after the http module. | MIT | Node.js

### Modbus

Name | Description | License | Language
--- | --- | --- | ---
go modbus | Fault-tolerant implementation of modbus protocol in Go | BSD-3 | Go
j2mod | Enhanced Modbus library implemented in the Java programming language | Apache | Java
libmodbus | libmodbus is a free software library to send/receive data with a device which respects the Modbus protocol. This library can use a serial port or an Ethernet connection. | LGPL v2.1 | C
modbus4j | A high-performance and ease-of-use implementation of the Modbus protocol written in Java by Infinite Automation Systems and Serotonin Software. Supports ASCII, RTU, TCP, and UDP transports as slave or master, automatic request partitioning and response data type parsing. | GPL v3 | Java
node-modbus-stack | A StreamStack implementation of the MODBUS protocol, for NodeJS. | MIT | Node.js
pymodbus | A full modbus protocol written in Python | BSD | Python

### MQTT

Name | Description | License | Language
--- | --- | --- | ---
Eclipse Paho | The Eclipse Paho project provides open-source client implementations of MQTT | EPL/EDL | Java, Python, Javascript, Go, C, .Net (C#), Embedded C/C++
Eclipse Mosquitto | Eclipse Mosquitto is an open source message broker that implements the MQTT protocol versions 3.1 and 3.1.1. […] This makes it suitable for “Internet of Things” messaging such as with low power sensors or mobile devices such as phones, embedded computers or microcontrollers like the Arduino. | EPL/EDL | C, Python
Moquette | Moquette is a lightweight MQTT broker in Java | ASLv2 | Java
MQTT.js | MQTT.js is a client library for the MQTT protocol, written in JavaScript for node.js and the browser. | MIT | Javascript

### MQTT-SN

Name | Description | License | Language
--- | --- | --- | ---
mqtt-sn-tools | Command line tools written in C for the MQTT-SN (MQTT for Sensor Networks) protocol. | MIT | C

### OPC-UA

Name | Description | License | Language
--- | --- | --- | ---
Eclipse Milo | Eclipse Milo provides all the tools necessary to implement OPC Unified Architecture (UA) client and/or server functionality in any JVM-based project. | EPL/EDL | Java
node-opcua | An implementation of a OPC UA stack fully written in Javascript and Node.js | MIT | Node.js
OPC UA .NET | The official OPC Foundation OPC UA .NET Stack and sample applications. | GPLv2 | .Net
open62541 | An open source and free C (C99) OPC UA stack licensed | MPLv2 | C

## Operating Systems

Name | Description | License | Language
--- | --- | --- | ---
Contiki | Contiki is an open source operating system for the Internet of Things. Contiki connects tiny low-cost, low-power microcontrollers to the Internet. | BSD-3 | C
FreeRTOS | A cross-platform real-time operating system | GPL-like | C
mbed OS | ARM® mbed™ OS is an open source embedded operating system designed specifically for the “things” in the Internet of Things (IoT). It includes all the features you need to develop a connected product based on an ARM Cortex-M microcontroller | ASLv2 | C/C++
OpenWrt | OpenWrt is an embedded operating system based on the Linux kernel, primarily used on embedded devices to route network traffic | GPLv2 | C, Lua
RIOT-OS | RIOT OS is an operating system for Internet of Things (IoT) devices. It is based on a microkernel and designed for energy efficiency, hardware independent development and a high degree of modularity | LGPL | C
UBOS | UBOS is an Arch-derived Linux distro optimized for cost-efficient administration Personal Servers and Indie IoT Devices | Linux | many
Zephyr | Zephyr Project is a small, scalable real-time operating system for use on resource-constrained systems supporting multiple architectures. | ASLv2 | C

## Remote Management

Libraries that can be used to implement remote management of IoT devices

### LWM2M

Name | Description | License | Language
--- | --- | --- | ---
Betwixt | Betwixt is a LWM2M Client and Server in Go | ASL | Go
Eclipse Leshan | Eclipse Leshan is a LWM2M implementation in Java | EPL/EDL | Java
lwm2m-node-lib | lwm2m-node-lib is a library for building LWM2M applications (client and server) in Javascript | AGPL | Node.js
Eclipse Wakaama | Eclipse Wakaama is a LWM2M implementation in C | EPL/EDL | C
AwaLWM2M | Awa LWM2M is an implementation of the OMA Lightweight M2M protocol in C | BSD-3 | C

### OMA-DM

Name | Description | License | Language
--- | --- | --- | ---
libdmclient | libdmclient implements the client-side of OMA DM 1.2 protocol | ASL | C

### SNMP

Name | Description | License | Language
--- | --- | --- | ---
SNMP4J | SNMP4J is an enterprise class free open source and state-of-the-art SNMP implementation for Java™ SE 1.4 or later | ASL | Java
GoSNMP | A simple SNMP library written in Go | BSD | Go

### TR-069

Name | Description | License | Language
--- | --- | --- | ---
netcwmp | A software client for enabling TR-069 in embedded devices | ASLv2 | C

## Robotics and Physical computing

Name | Description | License | Language
--- | --- | --- | ---
Artoo | Artoo is a micro-framework for robotics using Ruby. | ASLv2 | Ruby
Cylon.js | Cylon.js is a JavaScript framework for robotics, physical computing, and the Internet of Things. | ASLv2 | Node.js
Gobot | Gobot is a framework using the Go programming language for robotics, physical computing, and the Internet of Things. | ASLv2 | Go

## Security

### DNS-SEC

Name | Description | License | Language
--- | --- | --- | ---
Dnsruby | Dnsruby is a pure Ruby DNS client library which implements a stub resolver and supports DNSSEC | ASLv2 | Ruby
dnssecjava | A DNSSEC validating stub resolver for Java. | EPL | Java

### DTLS

Name | Description | License | Language
--- | --- | --- | ---
DTLS Go | DTLS 1.2 in Go | MIT | Go
Eclipse Scandium | The Scandium (Sc) sub-project within Californium implements DTLS 1.2 to secure your application through ECC with pre-shared keys, certificates, or raw public keys. | EPL/EDL | Java
Eclipse TinyDTLS | tinydtls is a library for Datagram Transport Layer Security (DTLS) covering both the client and the server state machine. tinydtls is a library for Datagram Transport Layer Security (DTLS) covering both the client and the server state machine. | EPL/EDL | C
mbed TLS | mbed TLS (previously PolarSSL) is an implementation of the TLS and SSL protocols and the respective cryptographic algorithms and support code required. | ASLv2 | C
OpenSSL | OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. | OpenSSL/SSLeay | C/Assembly
PyDTLS | Datagram Transport Layer Security for Python | ASLv2 | Python

### TLS

Name | Description | License | Language
--- | --- | --- | ---
mbed TLS | mbed TLS (previously PolarSSL) is an implementation of the TLS and SSL protocols and the respective cryptographic algorithms and support code required. | ASLv2 | C
OpenSSL | OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. | OpenSSL/SSLeay | C/Assembly

## Workflow management

Name | Description | License | Language
--- | --- | --- | ---
Node-RED | A visual tool for wiring the Internet of Things. | ASL | Node.js
huginn | Huginn is a system for building agents that perform automated tasks for you online. | MIT | Ruby
Nebula | A docker orchestrator designed to manage IoT devices | GPL v3 | Python

# Contributing

Contributions are very welcome! In order to be considered an Awesome Open IoT project you need the following: * Valid OSI approved license, * Proven record of regular commits, * Significant community interest shown through GitHub stars, * Project is focused on solving problems that are specific to IoT.

Please also have a look at this contributing guide for some general guidelines.

openiot.md Github