Here we compare two major OGC Sensorthings implementaions.  Go-Sensorthings (GOST) release V0.5 ( docker release on 05-Mar-2018) vs FRaunhofer Opensource SensorThings Server  (FROST) release V1.6 (docker release on 05-Mar-2018).

LicenseLGPLMITMIT is bit relaxed than LGPL in redistribution 

Geodan HOldings

Fraunhofer IOSB 

Compliance to OGCFROST is compliant
Docker image sizes582MB14.2MB
Memory usage idle463.1MiB13.7MB

The goal of this Hackaton is to become familiar with several LinkSmart components and at the same time, create something useful. 

In the following steps we will setup the DHT Adafruit Library and LinkSmart Device Gateway on a Raspberry Pi 3 in order to read measurements from a DHT22 sensor and publish them in SenML format to a MQTT broker. 

1) Setup the DHT Library

  1. Install the latest stable Docker for debian-stretch (armhf). 
    1. Follow the instructions here (Tip: stretch>jessy>wheezy). Too lazy to follow instructions? Skip to step c.
    2. Optional: Post-installation (Manage Docker as a non-root user), so that docker commands run without sudo

    3.  Click here to expand...

      If you didn't go through steps a and b. Run the following commands:

      # Update the apt package index:
      $ sudo apt-get update
      # Install packages to allow apt to use a repository over HTTPS:
      $ sudo apt-get install \
           apt-transport-https \
           ca-certificates \
           curl \
           gnupg2 \
      # Add Docker’s official GPG key:
      $ curl -fsSL$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
      # Set up the stable repository:
      $ echo "deb [arch=armhf]$(. /etc/os-release; echo "$ID") \
           $(lsb_release -cs) stable" | \
          sudo tee /etc/apt/sources.list.d/docker.list
      # Update the apt package index:
      $ sudo apt-get update
      # Install the latest version of Docker CE:
      $ sudo apt-get install docker-ce
      # (Post Installation) Add your user to the docker group:
      $ sudo usermod -aG docker $USER

      Log out and log in. Then to verify that Docker CE is installed correctly, run the hello-world image. This command downloads a test image and runs it in a container. When the container runs, it prints an informational message and exits.

      $ docker run armhf/hello-world

  2. Create and enter the directory structure

    mkdir -p /home/pi/dgw 
    cd /home/pi/dgw
  3. Download This script reads temperature and humidity values from a DHT sensor and prints the measurements in SenML format. (You need appropriate drivers to run it)

  4. Use the following command to download an image with DHT drivers and runs it once. The command tries to read from a DHT22 sensor with data pin connected to GPIO 4 and SenML basename bn/. Remove these arguments to see usage instructions.

    docker run --privileged -v $(pwd):/home --entrypoint=python --rm farshidtz/adafruit_dht 22 4 bn/

    The SenML output should be similar to:

    {"bn": "basename/", "e": [{"v": 21.0, "u": "Cel", "t": 1514631068, "n": "Temperature"}, {"v": 21.0, "u": "%RH", "t": 1514631068, "n": "Humidity"}]}

2) Deploy Device Gateway 

We'll use the DHT library container to run Device Gateway.

  1. Follow instructions in previous section to get the DHT Library docker container working.

  2. Download and configure Device Gateway:
    (In this example, we use device-gateway-linux-arm and create a timer that executes the python script for getting measurements every 120 seconds.) After downloading the file, make it executable. 

    1.  Configure the DGW service. Modify (replace <name> with the device hostname, e.g. linksmart-cyan) and place in /home/pi/dgw/conf/device-gateway.json

        "id": "dgw",
        "description": "Example Gateway",
        "publicEndpoint": "http://fqdn-of-the-host:8080",
        "http": {
          "bindAddr": "",
          "bindPort": 8080
        "protocols": {
          "REST": {
            "location": "/rest"
          "MQTT": {
            "url": "tcp://",
            "prefix": "<name>-dgw-",
            "offlineBuffer": 10000
    2. Configure the device agent. Modify (replace <name>s with the device hostname, e.g. linksmart-cyan) and place in /home/pi/dgw/conf/devices/dht22.json

        "name": "dht22",
        "description": "This sensor measures Temperature and Humidity.",
        "resources": [
            "type": "Resource",
            "name": "measurements",
            "agent": {
              "type": "timer",
              "interval": 120,
              "dir": null,
              "exec": "python /home/dgw/ 22 4 <name>/"
            "protocols": [
                "type": "MQTT",
                "methods": [
                "pub_topic": "LS/DGW/<name>/senml"
                "type": "REST",
                "methods": [
                "content-types": [

      With the above configuration, Device Gateway executes the Python script every 120 seconds and exposes the resulting data over two protocols:

      1. MQTT: Publishes the sensor data to the given topic. The MQTT broker was configured in previous step.

      2. REST: Exposes a REST endpoint to GET the latest collected data. The HTTP server was configured in the previous step. E.g for getting data: curl http://<hostname>:8080/rest/dht22/measurements   

  3. Run the container:

    It should be in priviledged mode in order to access Raspberry Pi GPIO.

    cd /home/pi/dgw
    docker run --privileged -v $(pwd):/home/dgw --entrypoint=/home/dgw/device-gateway-linux-arm --rm farshidtz/adafruit_dht --conf /home/dgw/conf/device-gateway.json
  4. If there were no errors, make a container that starts after boot and runs in detached mode (background):

    docker run --privileged -v $(pwd):/home/dgw --entrypoint=/home/dgw/device-gateway-linux-arm -p 8080:8080 --name dgw_dht --restart=unless-stopped --log-opt max-size=100m -d farshidtz/adafruit_dht --conf /home/dgw/conf/device-gateway.json

    Refer to docker run reference to understand the given arguments.