Swiftpack.co - Package - Bouke/HAP

Homekit Accessory Protocol, implemented in Swift

The goal of this package is to provide a complete implementation of the Homekit Accessory Protocol, to build your DIY accessories, or provide a bridge for non-HAP devices.

Build Status

Implementation notes

Currently GenericCharacteristic<T> is used, to allow for user-defined value types. As Swift requires homegenous arrays, a protocol AnyCharacteristic is introduced. I don't like the resulting implementation as the generics result in a cascade of workarounds (boxing + ObjectIdentifier()).

How to build

MacOS

Install libsodium (used for Curve25519 and Ed25519):

brew install libsodium

And then build the project itself:

swift build -c release

Linux

Install dependencies:

sudo apt install openssl libssl-dev libsodium-dev libcurl4-openssl-dev

Make sure you have libsodium 1.0.9 or above. Ubuntu 16.10 or later suffices. Otherwise you have to compile and install libsodium from source;

wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.12.tar.gz
tar xzf libsodium-1.0.12.tar.gz
cd libsodium-1.0.12
./configure
make && make check
sudo make install
sudo ldconfig

And then build the project itself:

swift build -c release

Usage

Run swift build to compile and .build/debug/hap-server to run. Modify Sources/hap-server/main.swift to include your own accessories.

On Mac OS, you can debug using XCode by running the command swift package generate-xcodeproj and the opening the resulting HAP.xcodeproj project. Select the hap-server target to execute.

Linux

There is some support on Linux. It uses my own implementation of NetService for multicast DNS (mDNS). However this implementation might be working for some use-cases, it isn't production grade. Patches welcome. Another solution would be to switch to using Avahi instead.

CommonCrypto has been replaced with the portable BlueCryptor; it uses CommonCrypto on Apple platforms and OpenSSL on Linux.

Object-Oriented Design

A high-level overview of the objects involved are shown in the diagram below. The terminology of HAP (Device, Accessory, Service, Characteristic) is followed for ease of understanding.

                      +------------+
                      | NetService |
                      +------------+
                             |
                             |delegate
                             v
   +--------+ 1       1 +--------+
   | Device |-----------| Server |
   +--------+\          +--------+
        |1    -\notify       |1
        |*      -\           |*
  +-----------+   -\  +------------+ 1   0…1 +---------------+
  | Accessory |     ->| Connection |---------| Cryptographer |
  +-----------+       +------------+         +---------------+
        |1
        |*
   +---------+
   | Service |
   +---------+
        |1
        |*
+----------------+
| Characteristic |
+----------------+

Credits

This library was written by Bouke Haarsma.

Github

link
Stars: 86
Help us keep the lights on

Releases

0.5.0 - Nov 19, 2017

  • Swift 4
  • Improved HAP specification conformity (notification coalescence, multiple status return codes)
  • Additional builtin accessory and service types
  • Resolved issue with pairings not being removed