This is a cross-platform open source implementation of IEC 60839-11-5 Open Supervised Device Protocol (OSDP). The protocol is intended to improve interoperability among access control and security products. It supports Secure Channel (SC) for encrypted and authenticated communication between configured devices.
OSDP describes the communication protocol for interfacing one or more Peripheral Devices (PD) to a Control Panel (CP) over a two-wire RS-485 multi-drop serial communication channel. Nevertheless, this protocol can be used to transfer secure data over any stream based physical channel. Read more about OSDP here.
This protocol is developed and maintained by Security Industry Association (SIA).
- Supports secure channel communication (AES-128) by default and provides a custom init-time flag to enforce a higher level of security not mandated by the specification
- Can be used to setup a PD or CP mode of operation (see examples).
- Exposes a well defined contract though a single header file.
- Cross-platform; can be built to run on bare-metal embedded devices, Linux, Mac, and Windows.
- No run-time memory allocation. All memory is allocated at init-time
- No external dependencies (for ease of cross compilation)
- Fully non-blocking, asynchronous design
- Provides Rust, Python3, and C++ bindings for the C library for faster integration into various development phases.
- Includes dozens of integration and unit tests which are incorporated in CI to ensure higher quality of releases.
- Built-in, sophisticated, debugging infrastructure and tools (see).
- Packaged and distributed through various package repositories such as Cargo crates, PyPI, Vcpkg, PlatformIO, etc.,
A device complying with OSDP can either be a CP or a PD. There can be only one CP on a bus which can talk to multiple PDs. LibOSDP allows your application to work either as a CP or a PD so depending on what you want to do you have to do some things differently.
LibOSDP creates the following constructs which allow interactions between devices on the OSDP bus. These should not be confused with the protocol specified terminologies that may use the same names. They are:
- Channel - Something that allows two OSDP devices to talk to each other
- Commands - A call for action from a CP to one of its PDs
- Events - A call for action from a PD to its CP
You start by implementing the osdp_channel
interface; this allows LibOSDP to
communicate with other OSDP devices on the bus. Then you describe the PD you
are
- talking to on the bus (in case of CP mode of operation) or,
- going to behave as on the bus (in case of PD mode of operation)
by using the
osdp_pd_info_t
struct.
You can use osdp_pd_info_t
struct (or an array of it in case of CP) to create
a osdp_t
context. Then your app needs to call the osdp_cp/pd_refresh()
as
frequently as possible. To meet the OSDP specified timing requirements, your
app must call this method at least once every 50ms.
After this point, the CP context can,
- send commands to any one of the PDs (to control LEDs, Buzzers, etc.,)
- register a callback for events that are sent from a PD
and the PD context can,
- notify it's controlling CP about an event (card read, key press, etc.,)
- register a callback for commands issued by the CP
LibOSDP core is written in C. It exposes a minimal set of API to setup
and manage the life-cycle of OSDP devices. See include/osdp.h
or
include/osdp.hpp
for more details.
LibOSDP is available via crates.io. See rust/README.md for more info and usage examples.
LibOSDP is available as a python package. See python/README.md for more info and usage examples.
OSDP has certain command and reply IDs pre-registered. This implementation of the protocol support only the most common among them. You can see a list of commands and replies and their support status in LibOSDP here.
- A working C compiler; such as gcc, clang or msvc
- Cmake3 (or GNU Make)
- goToMain/C-Utils submodule
Optionally,
- Python3 (host)
- Doxygen (host; for building the html docs as seen here)
- OpenSSL (host and target, optional - recommended)
- MbedTLS (host and target, optional)
- PyTest (host; for running the integrated test suite)
LibOSDP provides a lean-build that only builds the core library and nothing
else. This is useful if you are cross compiling as it doesn't have any other
dependencies but a C compiler. Here is an example of how you can cross compile
LibOSDP to arm-none-eabi-gcc
.
export CROSS_COMPILE=arm-none-eabi-
export CCFLAGS=--specs=nosys.specs
./configure.sh
make
To build LibOSDP and all its components you must have Cmake version 3.14 (or
above) and a C compiler installed. This repository produces a libosdp.so
and
libosdpstatic.a
; so depending on on your needs you can link these with -losdp
or -losdpstatic, respectively.
Have a look at examples/*
for a quick lookup on how to consume this library and
structure your application.
You can also read the API documentation for a comprehensive list of APIs that are exposed by LibOSDP.
git clone https://github.com/goToMain/libosdp --recurse-submodules
cd libosdp
cmake -B build .
cmake --build build --parallel
Refer to the documentation for more information on build and cross compilation.
LibOSDP uses the PyTest python framework to test changes made to ensure we aren't breaking existing functionalities while adding newer ones. You can install PyTest in your development machine with,
python3 -m pip install pytest
Running the tests locally before creating a pull request is recommended to make sure that your changes aren't breaking any of the existing functionalities. Here is how you can run them:
./scripts/make-release.sh
To add new tests for the feature you are working one, see the other tests in
pytest
directory.
This sections is for those who want to build the HTML documentation for this project locally. The latest version of the doc can always be found at libosdp.sidcha.dev.
Build the docs by doing the following (build directory has the html files).
./scripts/make-html-docs.sh
The Github issue tracker doubles up as TODO list for this project. Have a look at the open issues, PRs in those directions are welcome.
If you have a idea, find bugs, or other issues, please open a new issue in the github page of this project https://github.com/goTomain/libosdp.
You can read more on this here.
This software is distributed under the terms of Apache-2.0 license. If you don't know what that means/implies, you can consider it is as "free as in beer".
OSDP protocol is also open for consumption into any product. There is no need to,
- obtain permission from SIA
- pay royalty to SIA
- become SIA member
The OSDP specification can be obtained from SIA for a cost. Read more at our FAQ page.
Since this is no longer a hobby project, it takes time and effort to develop and maintain this project. If you are a user and are happy with it, consider supporting the development by donations though my GitHub sponsors page. Your support will ensure sustained development of LibOSDP.