From 762605c5c4dea846072427bfaa5d8bd1c61b0cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Sat, 20 Jun 2020 14:41:50 +0200 Subject: [PATCH] Add testing suite (#18) * Add some tests * Add an example of NTP with encryption * Enable TravisCI * Run sims via Docker * Improve simulators stage * Final fix for travis * Add README docs [skip ci] --- .travis.yml | 47 + README.md | 120 + arduino/tempLightSensor/tempLightSensor.fzz | Bin 0 -> 82830 bytes arduino/tempLightSensor/tempLightSensor.svg | 5175 +++++++++++++++++ arduino/tempLightSensor/tempLightSketch.svg | 3280 ----------- bite/api/tests.py | 27 +- .../migrations/0008_auto_20200619_1627.py | 20 + bite/telemetry/models.py | 8 +- bite/telemetry/tests.py | 54 +- docker/edge/docker-compose.edge.yml | 5 +- docker/edge/docker-compose.modules.yml | 19 +- docker/ntpd/Dockerfile.enc | 9 + docker/ntpd/chrony.keys.sample | 1 + 13 files changed, 5465 insertions(+), 3300 deletions(-) create mode 100644 .travis.yml create mode 100644 arduino/tempLightSensor/tempLightSensor.fzz create mode 100644 arduino/tempLightSensor/tempLightSensor.svg delete mode 100644 arduino/tempLightSensor/tempLightSketch.svg create mode 100644 bite/telemetry/migrations/0008_auto_20200619_1627.py create mode 100644 docker/ntpd/Dockerfile.enc create mode 100644 docker/ntpd/chrony.keys.sample diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7f592ce --- /dev/null +++ b/.travis.yml @@ -0,0 +1,47 @@ +language: python +dist: bionic + +services: + - docker + +before_install: + - pip -q install -U docker-compose + +simulator: &simulator + stage: simulator + install: + - docker-compose -f docker/docker-compose.yml pull + - docker-compose -f docker/docker-compose.yml build + before_script: + - docker-compose -f docker/docker-compose.yml -f docker/edge/docker-compose.edge.yml up -d + - DOCKER_HOST='127.0.0.1:22375' docker-compose -f docker/docker-compose.yml -f docker/edge/docker-compose.edge.yml pull + - DOCKER_HOST='127.0.0.1:22375' docker-compose -f docker/docker-compose.yml -f docker/edge/docker-compose.edge.yml build + script: + - sleep 5 # warm-up + - sed -i 's/# IOT_SERIAL/IOT_SERIAL/g' docker/edge/docker-compose.modules.yml + - DOCKER_HOST='127.0.0.1:22375' docker-compose -f docker/edge/docker-compose.modules.yml up -d + - sleep 30 # collect some telemetry + - curl -sf http://localhost/telemetry/${IOT_TL}1234/last/ + +jobs: + include: + - stage: build + before_script: + - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + script: + - docker-compose -f docker/docker-compose.yml build + - docker push daniviga/bite + - docker push daniviga/ntpd + if: branch = master + - stage: django + install: + - docker-compose -f docker/docker-compose.yml pull + - docker-compose -f docker/docker-compose.yml build + before_script: + - docker-compose -f docker/docker-compose.yml up -d + script: + - docker-compose -f docker/docker-compose.yml exec bite python manage.py test + - <<: *simulator + env: IOT_TL=http + - <<: *simulator + env: IOT_TL=mqtt diff --git a/README.md b/README.md index 683f84c..8b4838e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,123 @@ # BITE - Basic/IoT/Example Playing with IoT + +This project is for educational purposes only. It does not implement any authentication and/or encryption protocol, so it is not suitable for real production. + +## Installation + +### Requirements + +- `docker-ce` or `moby` +- `docker-compose` + +The project is compatible with Docker for Windows (using Linux executors), but it is advised to directly use a minimal Linux VM instead (via the preferred hypervisor). + +The application stack is composed by the following components: + +- [Django](https://www.djangoproject.com/) with [Django REST framework](https://www.django-rest-framework.org/) web application (running via `gunicorn` in production mode) + - `mqtt-to-db` custom daemon to dump telemetry into the timeseries database + - telemetry payload is stored as json object (via PostgreSQL JSON data type) +- [Timescale](https://www.timescale.com/) DB, a [PostgreSQL](https://www.postgresql.org/) database with a timeseries extension +- [Mosquitto](https://mosquitto.org/) MQTT broker (see alternatives below) +- [Nginx](http://nginx.org/) as ingress for HTTP (see alternative below) +- [Chrony](https://chrony.tuxfamily.org/) as NTP server (with optional `MD5` encryption) + +## Deployment + +### Development + +```bash +docker-compose -f docker/docker-compose.yml up -d [--scale {bite,mqtt-to-db)=N] +``` +It exposes: +- `http://localhost:80` (HTTP) +- `tcp://localhost:1883` (MQTT) +- `udp://localhost:123` (NTP) + +Django runs with `DEBUG = True` and `SKIP_WHITELIST = True` + +### Development with direct access to services + +```bash +docker-compose -f docker/docker-compose.yml -f docker-compose.dev.yml up -d [--scale {bite,mqtt-to-db)=N] +``` +It exposes: +- `http://localhost:80` (HTTP) +- `http://localhost:8080` (Django's `runserver`) +- `tcp://localhost:1883` (MQTT) +- `udp://localhost:123` (NTP) +- `tcp://localhost:5432` (PostgreSQL/Timescale) + +Django runs with `DEBUG = True` and `SKIP_WHITELIST = True` + +### Production + +```bash +docker-compose -f docker/docker-compose.yml -f docker-compose.prod.yml up -d [--scale {bite,mqtt-to-db)=N] +``` +It exposes: +- `http://localhost:80` (HTTP) +- `tcp://localhost:1883` (MQTT) +- `udp://localhost:123` (NTP) + +Django runs with `DEBUG = False` and `SKIP_WHITELIST = False` + +## Extra features + +The project provides multiple modules that can be combined with the fore-mentioned configurations. + +### Traefik + +To use [Traefik](https://containo.us/traefik/) instead of Nginx use: +```bash +docker-compose -f docker/docker-compose.yml up -f docker/ingress/docker-compose.traefik.yml -d +``` + +### VerneMQ + +A ~8x memory usage can be expected compared to Mosquitto. + +To use [VerneMQ](https://vernemq.com/) instead of Mosquitto use: +```bash +docker-compose -f docker/docker-compose.yml up -f docker/mqtt/docker-compose.vernemq.yml -d +``` + +### RabbitMQ + +RabbitMQ does provides AMQP protocol too, but ingestion on the application side is not implemented yet. +A ~10x memory usage can be expected compared to Mosquitto. + +To use [RabbitMQ](https://www.rabbitmq.com/) (with the MQTT plugin enabled) instead of Mosquitto use: +```bash +docker-compose -f docker/docker-compose.yml up -f docker/mqtt/docker-compose.rabbitmq.yml -d +``` + +## EDGE gateway simulation (via dind) + +An EDGE gateway, with containers as modules, may be simulated via dind (docker-in-docker). + +### Start the EDGE + +```bash +docker-compose -f docker/docker-compose.yml up -f docker/edge/docker-compose.edge.yml -d +``` + +### Run the modules inside the EDGE + +```bash +DOCKER_HOST='127.0.0.1:22375' docker-compose -f docker-compose.modules.yml up -d [--scale {device-http,device-mqtt}=N] +``` + +## Ardunio + +A simple Arduino UNO sketch is provided in the `arduino/tempLightSensor` folder. The sketch reads temperature and light from sensors. The simple schematic is: + +![tempLightSensor](./arduino/tempLightSensor/tempLightSensor.svg) + +The sketch does require an Ethernet shield and a bunch of libraries which are available as git submodules under `arduino/libraries`. +Be advised that some libraries (notably the NTP one) are customized. + +Configuration parameters are stored and retrieved from the EEPROM. An helper sketch to update the EEPROM is available under `arduino/eeprom_prog` + +An `ESP32` board (or similar Arduino) may be used, with some adaptions, too. diff --git a/arduino/tempLightSensor/tempLightSensor.fzz b/arduino/tempLightSensor/tempLightSensor.fzz new file mode 100644 index 0000000000000000000000000000000000000000..ea9a27464337a6e228cd8538d657663e27c5c81b GIT binary patch literal 82830 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[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 literal 0 HcmV?d00001 diff --git a/arduino/tempLightSensor/tempLightSensor.svg b/arduino/tempLightSensor/tempLightSensor.svg new file mode 100644 index 0000000..476b030 --- /dev/null +++ b/arduino/tempLightSensor/tempLightSensor.svg @@ -0,0 +1,5175 @@ + + + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + 5 + + + 5 + + + 10 + + + 10 + + + 15 + + + 15 + + + 20 + + + 20 + + + 25 + + + 25 + + + 30 + + + 30 + + + A + + + A + + + B + + + B + + + C + + + C + + + D + + + D + + + E + + + E + + + F + + + F + + + G + + + G + + + H + + + H + + + I + + + I + + + J + + + J + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + layer 21 + + text:MADE IN + + + text:ITALY + + + text:Prototype + + + text:Limited + + + text:Edition + + + + + + + + + + + + + 13 + + + + + + + + + + + + + + + + + + + + + + + 12 + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + + + + + + ETH + + + + + + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + + + + + + SDCS + + + + + + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + element:C1 + + package:C0603-ROUND + + + + element:C2 + + package:C0603-ROUND + + + + element:C3 + + package:C0603-ROUND + + + + element:C4 + + package:C0603-ROUND + + + + element:C5 + + package:C0603-ROUND + + + + element:C6 + + package:C0603-ROUND + + + + element:C7 + + package:C0603-ROUND + + + + element:C8 + + package:C0603-ROUND + + + + element:C9 + + package:C0603-ROUND + + + + element:C11 + + package:C0603-ROUND + + + + element:F1 + + package:L1812 + + + + element:FD1 + + package:FIDUCIA-MOUNT + + + + element:FD2 + + package:FIDUCIA-MOUNT + + + + element:FD3 + + package:FIDUCIA-MOUNT + + + + element:GROUND + + package:SJ + + + + element:R1 + + package:R0603-ROUND + + + + element:R2 + + package:R0603-ROUND + + + + element:RN1 + + package:CAY16 + + + + element:RN2 + + package:CAY16 + + + + element:RN3 + + package:CAY16 + + + + element:RN4 + + package:CAY16 + + + + element:Z1 + + package:CT/CN0603 + + + + element:Z2 + + package:CT/CN0603 + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + TX + + + + + + + + + + + + + + + + + + + + + + + RX + + + + + + + + + + + + + + + + + + + + + + + AREF + + + + + + + + + + + + + + + + + + + + + + + GND + + + + + + + + + + + + + + layer 25 + + + + + + 5V + + + + + + + text:A0 + + + + A0 + + + + + + + + + + ANALOG IN + + + + + + + text:M.Banzi + + + text:D.Cuartielles + + + text:D.Mellis + + + + + + + TX + + + + + + + + + + + RX + + + + + + + text:G.Martino + + + text:T.Igoe + + + + + + + + + + + + + RESET + + + + + + + + + + + + + + + + + + + + + + + 3V3 + + + + + + + + + + + + + text:A1 + + + + A1 + + + + + + text:A2 + + + + A2 + + + + + + text:A3 + + + + A3 + + + + + + text:A4 + + + + A4 + + + + + + text:A5 + + + + A5 + + + + + + + + + + VIN + + + + + + + + + + + GND + + + + + + + + + + + GND + + + + + + + text:[#=PWM] + + + + DIGITAL (PWM SPI ) + + + + + + + SCL + + + + + + + SDA + + + + + + + + < + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IOREF + + + + + + + + + + + + + text:SDA + + + text:SCL + + + element:AD + + package:1X06 + + + + element:C1 + + package:C0603-ROUND + + + + element:C2 + + package:C0603-ROUND + + + + element:C3 + + package:C0603-ROUND + + + + element:C4 + + package:C0603-ROUND + + + + element:C5 + + package:C0603-ROUND + + + + element:C6 + + package:C0603-ROUND + + + + element:C7 + + package:C0603-ROUND + + + + element:C8 + + package:C0603-ROUND + + + + element:C9 + + package:C0603-ROUND + + + + element:C11 + + package:C0603-ROUND + + + + element:D1 + + package:SMB + + + + element:D2 + + package:MINIMELF + + + + element:D3 + + package:MINIMELF + + + + element:F1 + + package:L1812 + + + + element:FD1 + + package:FIDUCIA-MOUNT + + + + element:FD2 + + package:FIDUCIA-MOUNT + + + + element:FD3 + + package:FIDUCIA-MOUNT + + + + element:GROUND + + package:SJ + + + + element:ICSP + + text:ICSP + + + + + + + + + + ICSP + + + + + + + + + + + + package:2X03 + + + + element:ICSP1 + + package:2X03 + + + + element:IOH + + package:1X10@1 + + + + element:IOL + + package:1X08 + + + + element:JP2 + + package:2X02 + + + + element:L + + package:CHIP-LED0805 + + + + element:L1 + + package:0805 + + + + element:PC1 + + package:PANASONIC_D + + + + element:PC2 + + package:PANASONIC_D + + + + element:R1 + + package:R0603-ROUND + + + + element:R2 + + package:R0603-ROUND + + + + element:RESET + + package:TS42 + + + + element:RESET-EN + + package:SJ + + + + element:RN1 + + package:CAY16 + + + + element:RN2 + + package:CAY16 + + + + element:RN3 + + package:CAY16 + + + + element:RN4 + + package:CAY16 + + + + element:RX + + package:CHIP-LED0805 + + + + element:T1 + + package:SOT-23 + + + + element:TX + + package:CHIP-LED0805 + + + + element:U1 + + package:SOT223 + + + + element:U2 + + package:SOT23-DBV + + + + element:U3 + + package:MLF32 + + + + element:U5 + + package:MSOP08 + + + + element:X1 + + package:POWERSUPPLY_DC-21MM + + + + element:X2 + + package:PN61729 + + + + element:Y1 + + package:QS + + + + element:Y2 + + package:RESONATOR + + + + element:Z1 + + package:CT/CN0603 + + + + element:Z2 + + package:CT/CN0603 + + + + element:ZU4 + + package:DIL28-3 + + + + + + + + + + + + + + + + + + + + + + + + CS + + + < + + + < + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TMP + 36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/arduino/tempLightSensor/tempLightSketch.svg b/arduino/tempLightSensor/tempLightSketch.svg deleted file mode 100644 index cf07828..0000000 --- a/arduino/tempLightSensor/tempLightSketch.svg +++ /dev/null @@ -1,3280 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SCL - SDA - AREF - GND - IOREF - RESET - 3V3 - PWM - PWM - PWM - L - TX - RX - ON - ICSP - PWM - PWM - PWM - TX - RX - 3 - 1 - 2 - 1 - 1 - 1 - 0 - 1 - 9 - 8 - DIGITAL - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 - 1 - 5V - Gnd - POWER - www.arduino.cc - ANALOG IN - Vin - 0 - 1 - 2 - 3 - 4 - 5 - Arduino - UNO - - - - - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 1 - 5 - 5 - 10 - 10 - 15 - 15 - 20 - 20 - 25 - 25 - 30 - 30 - A - A - B - B - C - C - D - D - E - E - F - F - G - G - H - H - I - I - J - J - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AREF - GND - RESET - 3V3 - LINK - PWR - 100M - FULLD - COLL - RX - TX - INT - WP - ICSP - RESET - 13 - 12 - 11 - 10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - TX - RX - 0 - 5V - Gnd - MEGA compatible - ANALOG IN - 9V - A0 - 1 - 2 - 3 - 4 - A5 - Arduino - ETHShield - SD - - - - - - - - - - - - - - - - - - - - - - - - - - - TMP - 36 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AREF - GND - RESET - 3V3 - LINK - PWR - 100M - FULLD - COLL - RX - TX - INT - WP - ICSP - RESET - 13 - 12 - 11 - 10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - TX - RX - 0 - 5V - Gnd - MEGA compatible - ANALOG IN - 9V - A0 - 1 - 2 - 3 - 4 - A5 - Arduino - ETHShield - SD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bite/api/tests.py b/bite/api/tests.py index 7ce503c..75f1ee4 100644 --- a/bite/api/tests.py +++ b/bite/api/tests.py @@ -1,3 +1,26 @@ -from django.test import TestCase +from django.test import TestCase, Client +from api.models import Device, WhiteList -# Create your tests here. + +class ApiTestCase(TestCase): + c = Client() + + def setUp(self): + WhiteList.objects.create(serial='test1234') + Device.objects.create(serial='test1234') + + def test_no_whitelist(self): + response = self.c.post('/api/device/subscribe/', + {'serial': 'test12345'}) + self.assertEqual(response.status_code, 400) + + def test_subscribe_post(self): + WhiteList.objects.create(serial='test12345') + response = self.c.post('/api/device/subscribe/', + {'serial': 'test12345'}) + self.assertEqual(response.status_code, 201) + + def test_subscribe_get(self): + response = self.c.get('/api/device/list/') + self.assertEqual( + response.json()[0]['serial'], 'test1234') diff --git a/bite/telemetry/migrations/0008_auto_20200619_1627.py b/bite/telemetry/migrations/0008_auto_20200619_1627.py new file mode 100644 index 0000000..799aa39 --- /dev/null +++ b/bite/telemetry/migrations/0008_auto_20200619_1627.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0.7 on 2020-06-19 16:27 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations +import telemetry.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemetry', '0007_telemetry_transport'), + ] + + operations = [ + migrations.AlterField( + model_name='telemetry', + name='payload', + field=django.contrib.postgres.fields.jsonb.JSONField(validators=[telemetry.models.telemetry_validation]), + ), + ] diff --git a/bite/telemetry/models.py b/bite/telemetry/models.py index 60f1ff0..bf6e23e 100644 --- a/bite/telemetry/models.py +++ b/bite/telemetry/models.py @@ -1,10 +1,16 @@ from django.db import models from django.core.validators import MinValueValidator +from django.core.exceptions import ValidationError from django.contrib.postgres.fields import JSONField from api.models import Device +def telemetry_validation(value): + if not value: + raise ValidationError("No telemetry has been sent") + + class Telemetry(models.Model): device = models.ForeignKey(Device, on_delete=models.CASCADE) time = models.DateTimeField(primary_key=True, auto_now_add=True) @@ -14,7 +20,7 @@ class Telemetry(models.Model): clock = models.IntegerField( validators=[MinValueValidator(0)], null=True) - payload = JSONField() + payload = JSONField(validators=[telemetry_validation]) class Meta: ordering = ['-time', 'device'] diff --git a/bite/telemetry/tests.py b/bite/telemetry/tests.py index 7ce503c..a6f3159 100644 --- a/bite/telemetry/tests.py +++ b/bite/telemetry/tests.py @@ -1,3 +1,53 @@ -from django.test import TestCase +import json +from django.test import TestCase, Client +from api.models import Device, WhiteList -# Create your tests here. + +class ApiTestCase(TestCase): + c = Client() + + payload = { + 'id': 'sensor.server.domain', + 'light': 434, + 'temperature': { + 'celsius': 27.02149, + 'raw': 239, + 'volts': 0.770215 + } + } + + telemetry = { + 'device': 'test1234', + 'clock': 1591194712, + 'payload': json.dumps(payload) + } + + def setUp(self): + WhiteList.objects.create(serial='test1234') + Device.objects.create(serial='test1234') + + def test_no_device(self): + fake_telemetry = dict(self.telemetry) # make a copy of the dict + fake_telemetry['device'] = '1234test' + response = self.c.post('/telemetry/', fake_telemetry) + self.assertEqual(response.status_code, 400) + + def test_empty_telemetry(self): + fake_telemetry = dict(self.telemetry) # make a copy of the dict + fake_telemetry['payload'] = '' + response = self.c.post('/telemetry/', fake_telemetry) + self.assertEqual(response.status_code, 400) + + def test_telemetry_post(self): + response = self.c.post('/telemetry/', self.telemetry) + self.assertEqual(response.status_code, 201) + + def test_telemetry_get(self): + response = self.c.post('/telemetry/', self.telemetry) + response = self.c.get('/telemetry/test1234/last/') + self.assertEqual( + response.json()['device'], 'test1234') + self.assertEqual( + response.json()['transport'], 'http') + self.assertJSONEqual( + json.dumps(response.json()['payload']), self.payload) diff --git a/docker/edge/docker-compose.edge.yml b/docker/edge/docker-compose.edge.yml index 7c028c3..f82d6a1 100644 --- a/docker/edge/docker-compose.edge.yml +++ b/docker/edge/docker-compose.edge.yml @@ -2,12 +2,11 @@ version: "3.7" services: edge-host: - <<: *service_default image: docker:dind privileged: true environment: DOCKER_TLS_CERTDIR: - # networks: - # - net + networks: + - net ports: - "127.0.0.1:22375:2375" diff --git a/docker/edge/docker-compose.modules.yml b/docker/edge/docker-compose.modules.yml index 0d4cfab..7157150 100644 --- a/docker/edge/docker-compose.modules.yml +++ b/docker/edge/docker-compose.modules.yml @@ -1,8 +1,5 @@ version: "3.7" -networks: - localnet: - x-op-service-default: &service_default restart: always init: true @@ -15,12 +12,11 @@ services: context: ../simulator image: daniviga/bite-device-simulator environment: - IOT_HTTP: "http://192.168.10.123:8000" - # IOT_SERIAL: "abcd1234" + IOT_HTTP: "http://ingress" + # IOT_SERIAL: "http1234" # IOT_DELAY: 10 IOT_DEBUG: 1 - networks: - - localnet + network_mode: "host" device-mqtt: <<: *service_default @@ -28,11 +24,10 @@ services: context: ../simulator image: daniviga/bite-device-simulator environment: - IOT_HTTP: "http://192.168.10.123:8000" - IOT_MQTT: "192.168.10.123:1883" - # IOT_SERIAL: "abcd1234" + IOT_HTTP: "http://ingress" + IOT_MQTT: "broker:1883" + # IOT_SERIAL: "mqtt1234" # IOT_DELAY: 10 IOT_DEBUG: 1 command: ["/opt/bite/device_simulator.py", "-t", "mqtt"] - networks: - - localnet + network_mode: "host" diff --git a/docker/ntpd/Dockerfile.enc b/docker/ntpd/Dockerfile.enc new file mode 100644 index 0000000..b0f8fcc --- /dev/null +++ b/docker/ntpd/Dockerfile.enc @@ -0,0 +1,9 @@ +FROM daniviga/ntpd + +COPY ./chrony.keys /etc/chrony/chrony.keys + +RUN echo "keyfile /etc/chrony/chrony.keys" \ + >> /etc/chrony/chrony.conf + +EXPOSE 123/udp +ENTRYPOINT ["chronyd", "-d", "-s", "-x"] diff --git a/docker/ntpd/chrony.keys.sample b/docker/ntpd/chrony.keys.sample new file mode 100644 index 0000000..2c452ee --- /dev/null +++ b/docker/ntpd/chrony.keys.sample @@ -0,0 +1 @@ +1 MD5 HEX:D8ACA3A254EF59F83C35CEEFF6EBD2C7C67DB3D9