adding documentations
|
@ -0,0 +1,39 @@
|
|||
name: Build LaTeX document
|
||||
run-name: ${{ GITHUB.ACTOR }} is compiling a Latex Document 🚀
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- ".github/workflows/docs-latex.yml"
|
||||
- "content/**"
|
||||
- "main.tex"
|
||||
jobs:
|
||||
build_latex:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set up Git repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Search for directory
|
||||
run: ls -l
|
||||
- name: Compile LaTeX document
|
||||
uses: xu-cheng/latex-action@v2
|
||||
with:
|
||||
root_file: main.tex
|
||||
latexmk_use_xelatex: true
|
||||
- name: Upload PDF file as Release
|
||||
uses: "marvinpinto/action-automatic-releases@latest"
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
automatic_release_tag: "latest"
|
||||
prerelease: true
|
||||
title: "Development Build"
|
||||
files: |
|
||||
main.pdf
|
||||
- name: Upload PDF file as Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Latex Dokumentation
|
||||
path: main.pdf
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
name: Build Documentation from Markdown
|
||||
run-name: ${{ GITHUB.ACTOR }} is generating a Documentation from Markdown 🚀
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- ".github/workflows/docs-markdown.yml"
|
||||
- "docs/**"
|
||||
jobs:
|
||||
build_markdown_documentation:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set up Git repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Generate HTML from Markdown
|
||||
uses: ldeluigi/markdown-docs@latest
|
||||
with:
|
||||
src: docs/
|
||||
dst: ./gh-pages
|
||||
title: Markdown Docs
|
||||
language: de
|
||||
icon: library
|
||||
primary-color: indigo
|
||||
secondary-color: indigo
|
||||
hide-repository: false
|
||||
- name: Deploy GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
publish_dir: ./gh-pages
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
@ -0,0 +1,28 @@
|
|||
name: Build Documentation with mkdocs
|
||||
run-name: ${{ GITHUB.ACTOR }} is generating a Documentation from Markdown 🚀
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- ".github/workflows/docs-mkdocs.yml"
|
||||
- "docs/**"
|
||||
jobs:
|
||||
build_markdown_documentation:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set up Git repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Generate HTML from Markdown
|
||||
uses: actions/setup-python@v4
|
||||
- run: pip install -r requirements.txt
|
||||
- run: mkdocs build --clean
|
||||
- run: mkdocs gh-deploy
|
||||
# - name: Deploy GitHub Pages
|
||||
# uses: peaceiris/actions-gh-pages@v3
|
||||
# with:
|
||||
# publish_dir: ./gh-pages
|
||||
# github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
@ -0,0 +1,5 @@
|
|||
nav:
|
||||
- Das Projekt: index.md
|
||||
- Android APP: app.md
|
||||
- PFC200: pfc200.md
|
||||
- Android Quellcode: app_code.md
|
|
@ -0,0 +1,89 @@
|
|||
# Die Anwendung (APP)
|
||||
|
||||
Um den Funktionsablauf des Endproduktes besser zu verstehen, wird hier näher auf die App eingegangen. Es wird erklärt, welche Funktionen enthalten sind und was zu erwarten ist, quasi wie eine kleine Betriebsanleitung.
|
||||
|
||||
## Home und Navigation
|
||||
|
||||
<img src="assets/sreenshots/screen_home.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Auf dem Home Screen gibt es nicht viel zu sehen, lediglich den Hardware-Controller. Unter (1) kann die Navigation (siehe folgende Abbildung) aufgerufen werden. Alternativ kann diese mit einem Swipe von links nach rechts aufgerufen werden.
|
||||
|
||||
<img src="assets/sreenshots/screen_navigation.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Hier werden die verschiedenen Menüpunkte aufgelistet:
|
||||
|
||||
1. `Home`: Der Startbildschirm
|
||||
2. `Connect Device`: Die Funktionalität, eine Verbindung mit dem Gerät aufzubauen und dieses auf der Cloud zu registrieren.
|
||||
3. `Registered Devices`: Eine Liste von Geräten, welche in der Cloud registriert sind.
|
||||
4. `Settings`: Einstellungen zur Verbindung mit der Cloud (Hostname, Username, Password)
|
||||
|
||||
## Settings (Einstellungen)
|
||||
|
||||
<img src="assets/sreenshots/screen_settings.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Für die volle Funktionstüchtigkeit benötigt die App drei Angaben:
|
||||
|
||||
1. die URL (Host ohne Schema und Pfad)
|
||||
2. Benutzername für den Zugriff auf die Daten
|
||||
3. Passwort für den Benutzer
|
||||
|
||||
Sollten diese Daten nicht gegeben sein, kann die App nicht auf die Cloud zugreifen.
|
||||
|
||||
## Connect Devices (Registrierung des Gerätes)
|
||||
|
||||
Für die Nutzung von Bluetooth erfordert die App Standort-Berechtiungungen. Beim Aufrufen der Scan-Funktion wird diese über ein Popup angefragt. Wenn ein Scann gestartet wird, öffnet sich ein zweites Fenster. Für eine bessere Funktionalität sollte der präzise Standort ausgewählt werden.
|
||||
|
||||
Es wird kein GPS verwendet, um den Standort von Nutzern auszulesen!
|
||||
|
||||
<img src="assets/sreenshots/screen_discovery_permissions-1.png" alt="" style="width: 25%;"/>
|
||||
|
||||
<img src="assets/sreenshots/screen_discovery_permissions-2.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Nachdem die Berechtigungen erteilt wurden, erscheint die Discovery Page. Diese dient dazu, Bluetooth Geräte aus der Nähe anzuzeigen und eine Verbindung aufzubauen.
|
||||
|
||||
<img src="assets/sreenshots/screen_discovery.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Eine Liste aus Bluetooth-Adaptern in der Nähe wird mit Gerätenamen (falls verfügbar) und zugehöriger Hardware-Adresse angezeigt. Ein kurzer Klick auf den Eintrag startet eine Bluetooth Verbindung, ein langer Klick das Bluetooth Pairing.
|
||||
|
||||
Legende:
|
||||
|
||||
1. Ein Button, um zur Startseite zurück zu kehren. Wird dieser ausgelöst, werden alle bestehenden Verbindungen getrennt
|
||||
2. Entweder ein Indikator, um einen Suchvorgang anzuzeigen oder ein Button, um die Suche neu zu starten
|
||||
3. Eine Checkliste um die Voraussetzungen zu prüfen. Wenn beide Harken grün sind, ist die Suche funktionstüchtig. Beide Textfelder können angeklickt werden, um notwendige Änderungen durchzuführen.
|
||||
4. Sollten die Harken nicht grün sein und ein klick auf's Textfeld nicht geholfen haben, kann man hier für Benutzerrechte auf den zugehörigen Screen wechseln.
|
||||
5. Ein Indikator, falls eine Verbindung mit dem Gerät hergestellt wurde (blaues Icon)
|
||||
6. Zeigt an, ob das Gerät gepairt wurde
|
||||
7. Zeigt die Signalstärke an
|
||||
8. Hier wird der nächste Schritt nach einer Verbindung gestartet
|
||||
|
||||
<img src="assets/sreenshots/screen_device-settings.png" alt="" style="width: 25%;" style="width: 25%;"/>
|
||||
|
||||
Dieser Screen führt die letzten Schritte durch. Eine Übersicht optionaler Gerätedaten wird aufgelistet. Zusätzlich mit zwei Buttons, um das Gerät erneut zu verbinden oder die Verbindung zu trennen.
|
||||
|
||||
Darunter ist ein Textfeld gegeben. Hier wird die künftige ID des Gerätes eingetippt, und kann mit dem Button rechts bestätigt werden. Bei einer Bestätigung wird zunächst die Verfügbarkeit der ID in der Cloud geprüft. Sollte die ID (nicht) verfügbar sein, wird untem auf dem bildschirm eine kurze Benachrichtigung angezeigt (siehe folgende Abbildung). Danach wird dir ID an das Gerät geschickt. Das Gerät Antwortet mit einem Fingerprint, welcher zur Registrierung des Gerätes verwendet wird. Für diesen Prozess fehlt der Ladeindikator, denn es benötigt ein wenig Geduld. Sollte die Registrierung (nicht) funktioniert haben, wird der Nutzer über ein Popup informiert (siehe zweite folgende Abbildung).
|
||||
|
||||
<img src="assets/sreenshots/screen_device-settings_available.png" alt="" style="width: 25%;"/>
|
||||
|
||||
<img src="assets/sreenshots/screen_device-settings_registered.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Lief der Prozess wie abgebildet ab, ist das Gerät erfolgreich registriert wurden und ist einsatzbereit.
|
||||
|
||||
## Registered Device (bereits registrierte Geräte)
|
||||
|
||||
<img src="assets/sreenshots/screen_registered-devices.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Dieser Screen zeigt eine Liste von in der Cloud registrierten Geräten an. Diese werden anhand ihrer ID angezeigt. Hier kann überprüft werden, ob die verwendete ID auch in der Cloud gelistet ist.
|
||||
|
||||
Legende:
|
||||
|
||||
1. Ein Suchfeld, um die Liste zu filtern
|
||||
2. Ein Button, um die Suche zu bestätigen
|
||||
3. Entweder ein Indikator, um einen Suchvorgang anzuzeigen oder ein Button, um die Suche neu zu starten
|
||||
4. Der Listeneintrag (kann angeklickt werden)
|
||||
|
||||
Wenn der Listeneintrag ausgewählt wird, erscheint ein Popup.
|
||||
|
||||
<img src="assets/sreenshots/screen_registered-devices_info.png" alt="" style="width: 25%;"/>
|
||||
|
||||
Das Popup zeigt sämtliche hinterlegte Informationen zu einem Eintrag in der Cloud an. Entweder wird die Anzeige für genannte Informationen verwendet, oder das Gerät kann über Remote aus der Cloud entfernt werden.
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
# Flutter App
|
||||
|
||||
Gerade für zukünftige Entwickler wäre ein Grundverständnis des Quellcodes vom Vorteil. Die App wurde mit Flutter entwickelt und benötigt daher ein Verständnis von Dart und im Kontext von Flutter das Wissen über Widgets.
|
||||
|
||||
## Vortwort
|
||||
|
||||
Künftige Generationen könnten `dart doc` im Root-Verzeichnis der App ausführen, um eine etwas deutlichere Doku zu erhalten. Daher wird oberflächlich auf einzelne Dateien eingegangen.
|
||||
|
||||
## Übersicht
|
||||
|
||||
Der grundlegende Code liegt unter `lib` und ist in mehrere Bereiche aufgeteilt.
|
||||
|
||||
Die Struktur:
|
||||
|
||||
1. `objects`: Eigenständige Objekte, welche autonom über verschiedene Seiten hinweg verwendet werden können.
|
||||
2. `schemas`: Objektklassen, die zum parsen für Objekte verwendet werden.
|
||||
3. `screens`: Sämtliche Widgets, welche Screens generieren.
|
||||
4. `widgets`: Widgets, welche autonom über verschiedene Seiten hinweg verwendet werden können.
|
||||
|
||||
Des weiteren werden die Dateien beschrieben, welche signifikant für das Projekt zum Verständnis des Ablaufes sind.
|
||||
|
||||
## Objects / bluetooth_object.dart
|
||||
|
||||
die BluetoothObject-Klasse dient dazu, eine Bluetooth-Verbindung an ein Objekt zu binden und darin zu verwalten.
|
||||
|
||||
### Methoden
|
||||
|
||||
* `bondDevice(BuildContext context)`: startet ein Pairing oder trennt eine solche Verbindung.
|
||||
* `disconnectDevice()`: Trennt die Bluetooth-Verbindung zum Gerät
|
||||
* `connectDevice()`: Verbindet die App zum Gerät über Bluetooth
|
||||
* `connectionOnListen(Uint8List data)`: Ein Event Listener, welcher bei eingehenden Daten ausschlägt. Die Methode wartet auf das ASCII-Symbol "10", um den Input auf den String "fingerprint {fingerprint}" zu untersuchen. "{fingerprint}" steht hierbei für den Fingerprint der Key-File
|
||||
* `sendData(BuildContext context, String output)`: Nutzt die Bluetooth-Verbindung, um Daten encodiert als ASCII zu verschicken.
|
||||
* `_registerDevice()`: Startet die Geräte-Registrierung
|
||||
* `_confirmRegistration(bool registered)`: Erzeugt einen Bestätigungs-Katalog
|
||||
|
||||
## Objects / cloud_service_api.dart
|
||||
|
||||
Die CloudServiceAPI-Klasse dient dazu, um sich mit der Azure Cloud auszutauschen.
|
||||
Die Klasse enthält Methoden, um mit der API zu interagieren, wie z.B. das Abrufen von Gerätelisten,
|
||||
das Abrufen von Geräteinformationen, das Erstellen von Geräten
|
||||
und das Überprüfen der Verfügbarkeit von Gerätenamen.
|
||||
|
||||
### Methoden
|
||||
|
||||
* `getDevices()`:
|
||||
HTTP-GET-Aufruf an den Endpunkt /api/devices
|
||||
der API und gibt die Antwort als Liste von DeviceModel-Objekten zurück.
|
||||
* `getDeviceInfo(String deviceID)`:
|
||||
HTTP-GET-Aufruf an den Endpunkt /api/devices/{deviceID}
|
||||
der API und gibt die Antwort als DeviceInfoModel-Objekt zurück.
|
||||
* `getDevicesInfo()`:
|
||||
HTTP-GET-Aufruf an den Endpunkt /api/devices
|
||||
der API und gibt die Antwort als Liste von DeviceInfoModel-Objekten zurück.
|
||||
* `createDevice(String id, String pThumbprint, String sThumbprint)`:
|
||||
HTTP-POST-Aufruf an den Endpunkt /api/devices
|
||||
der API und erstellt ein neues Gerät mit den übergebenen Parametern id, primaryThumbprint, secondaryThumbprint.
|
||||
* `checkNameAvailability(String inputID)`:
|
||||
Überprüft die Verfügbarkeit einer ID,
|
||||
indem die aktuelle Liste der Geräte abgefragt wird und
|
||||
die übergebene ID mit den vorhandenen IDs verglichen wird.
|
||||
* `showNameAvailabilityStatus(bool status)`:
|
||||
Zeigt eine Meldung an, ob die ID verfügbar ist oder nicht.
|
||||
* `reloadConfig()`:
|
||||
Erneuert die HTTP-Header mit den aktuellen Anmeldeinformationen.
|
||||
* `getInformation()`:
|
||||
HTTP-GET-Aufrufen der Endpunkt /api/app
|
||||
der API und gibt die Antwort als Map<String, dynamic> zurück.
|
||||
* `deleteDevice(String clientId)`:
|
||||
HTTP-DELETE-Aufruf an die Endpunkt /api/{id}
|
||||
und löscht das Gerät in der Cloud
|
After Width: | Height: | Size: 61 KiB |
|
@ -0,0 +1 @@
|
|||
<mxfile host="Electron" modified="2022-10-28T09:29:24.956Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.7.3 Chrome/91.0.4472.164 Electron/13.6.1 Safari/537.36" etag="vq2YyG1-7f6kTsKC97u6" version="15.7.3" type="device"><diagram id="kgpKYQtTHZ0yAKxKKP6v" name="Page-1">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</diagram></mxfile>
|
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 157 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 236 KiB |
After Width: | Height: | Size: 738 KiB |
After Width: | Height: | Size: 173 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 172 KiB |
After Width: | Height: | Size: 58 KiB |
|
@ -0,0 +1,22 @@
|
|||
# Das Projekt
|
||||
|
||||
`Titel`: Out-Of-Band Provisioning für industrielle IoT Geräte
|
||||
|
||||
## Kurze Projektbeschreibung:
|
||||
|
||||
Die Provisionierung, also die initiale Einrichtung, von IoT-Geräten ist in vielen Szenarien eine Herausforderung. Oft ist es nicht möglich Geräte vollständig konfiguriert auszuliefern. Die finale Konfiguration erfolgt dann erst im Feld durch die Anwender:innen. Eine besondere Herausforderung ist hierbei das Einrichten der Netzwerk- und Authentifizierungsdaten. Bei sogenannten Out-of-Band (OOB) Verfahren wird hierfür ein weiterer Kommunikationsweg wie WLAN, Bluetooth oder NFC genutzt. Für IoT-Geräte im Consumerbereich wird dies oft mit einer App, sicher und nutzerfreundlich umgesetzt.
|
||||
|
||||
## Ziel des Semesterprojektes
|
||||
|
||||
Dieses Verfahren soll für die Provisionierung einer linuxbasierten Steuerung umgesetzt werden. Dafür werden zwei Implementierungen berücksichtigt:
|
||||
1. Der Provisionierungsprozess seitens der Steuerung
|
||||
2. Eine App, dich sich mit der Steuerung über Bluetooth verbindet und diesen Prozess auslöst und das Gerät in der Cloud registriert.
|
||||
|
||||
## Verfahren im Überblick
|
||||
|
||||
<img src="assets/diagrams/ablauf_allgemein.jpg" alt="allgemeiner ablauf" style="width:100%;"/>
|
||||
|
||||
Der allgemeine Ablauf besteht zunächst aus drei Komponenten: Einem Azure IoT Hub (künftig referenziert als die Cloud), einem WAGO PFC200 (künftig referenziert als das Gerät) mit Bluetooth-Dongle und einem Android-Smartphone mit einer eigens angefertigten App.
|
||||
Im Konzept verbindet sich die App mit einem passenden Bluetooth-Dongle. Über die Verbindung wird dem Gerät erklärt, welche ID es erhält, woraufhin auf dem Gerät ein Zertifikat erzeugt wird. Das Gerät überträgt ein Fingerprint des Zertifikates per Bluetooth an das Smartphone. Mit der ID und dem Fingerprint wird das Gerät über die App auf der Cloud registriert. Sollte das Gerät korrekt konfiguriert sein, kann nun die Cloud mit dem Gerät kommunizieren. Der genauere Verbindungsablauf wird folgend schematisch dargestellt:
|
||||
|
||||
<img src="assets/diagrams/provisionierungssequenz.drawio.jpg" alt="provisionierungssequenz" style="width:100%;"/>
|
|
@ -0,0 +1,63 @@
|
|||
# PFC200 mit Bluetooth Dongle
|
||||
|
||||
Um mit dem Gerät arbeiten zu können, sollte verstanden werden, wie eine Verbindung aufgebaut wird und welche Skripte eingerichtet werden sollten.
|
||||
|
||||
## Per SSH mit dem Gerät verbinden
|
||||
1. sich per LAN physisch mit dem Gerät verbinden (äußerer Port)
|
||||
2. sich statisch eine IPv4-Adresse zuweisen (empfohlen: `192.168.123.10`)
|
||||
3. sich mit dem Gerät per ssh verbinden: `ssh root@192.168.123.200`
|
||||
4. passwort: in grün auf dem Gerät (Kleinbuchstaben)
|
||||
|
||||
## Skripte
|
||||
|
||||
Die Aufgaben des Gerätes werden über verschiedene Skripte durchgeführt.
|
||||
|
||||
**Hinweis**: Der Pfad für jedes Skript ist hier mit aufgelistet. Eventuell müssten die Skripte mit `chmod +x ${Dateiname}` ausführbar gemacht werden.
|
||||
|
||||
### (1) Initale Skripte
|
||||
|
||||
Das Skript wird bei Systemstart ausgeführt, um auto_read.sh automatisch auszuführen.
|
||||
|
||||
Der Aufruf über init.d läuft folgend ab:
|
||||
|
||||
1. `/etc/inittab` startet `/etc/init.d/rcS`
|
||||
2. `/etc/init.d/rcS` startet alle Skripte unter `/etc/rc.d` mit dem Argument `start`, also auch `S99_init_bluetooth_listener`.Hierbei handelt es sich um einen Symlink `S99_init_bluetooth_listener -> /etc/init.d/initBluetoothListener`.
|
||||
|
||||
### (2) auto_read.sh
|
||||
|
||||
Das Skript konfiguriert das Bluetooth-Dongle für eingehende Bluetooth-Verbindungen und startet einen Listening-Prozess auf diesem, um eingehende Strings direkt als Argument mit auto_cert.sh auszuführen.
|
||||
|
||||
Dateipfad: `/home/script/auto_read.sh`
|
||||
|
||||
Beispiel: `/home/script/auto_read.sh`
|
||||
|
||||
### (3) auto_cert.sh
|
||||
|
||||
Das Skript erzeugt aus mittels einer ID ein SSL-Zertifikat, womit das Gerät sich in der Cloud authentifizieren kann, und konfiguriert entsprechend das Gerät. Das Zertifikat benutzt einen RSA-Algorithmus und wird unter `/etc/ssl` abgelegt.
|
||||
|
||||
Dateipfad: `/home/script/auto_cert.sh`
|
||||
|
||||
Beispiel: `/home/script/auto_cert.sh example-ID`
|
||||
|
||||
Parameter:
|
||||
|
||||
* `$1 (first argument)`: Device ID
|
||||
|
||||
|
||||
### (4) auto_conf.sh
|
||||
|
||||
Das Skript konfiguriert die `/etc/dataagent/dataagent.config` auf dem Gerät entsprechend der Eingaben.
|
||||
* Die Einstellungen werden erst als Flag mit - benannt und dann wird der Wert hierzu angegeben (z.B. `-enabled true`).
|
||||
* Das Skript prüft automatisch ob die Eingabe Sinn macht ( z.B. prüft ob Eingabe Boolean ist) und gibt im Problemfall aus welche Eingabe nicht erlaubt ist.
|
||||
* Optionen welche nicht als Flag angegeben wurden werden automatisch geleert.
|
||||
|
||||
Dateipfad: `/home/script/auto_conf.sh`
|
||||
|
||||
Beispiel: `/home/script/auto_conf.sh -enabled true -clientid ${CN} -host example.azure-devices.net -usetls false`
|
||||
|
||||
Parameter:
|
||||
|
||||
* `-enabled`: gibt an ob der Konfigurations Slot aktiv ist
|
||||
* `-clientid`: ein String, der die ID des Gerätes bestimmt
|
||||
* `-host`: die Cloud-URL
|
||||
* `-usetls`: gibt an ob tls benutzt werden soll
|
|
@ -0,0 +1,36 @@
|
|||
site_name: Documentation mkdocs-print-site-plugin
|
||||
repo_url: https://github.com/oob-provisioning-for-iot/dokumentation_provisioning_latex
|
||||
site_url: https://oob-provisioning-for-iot.github.io
|
||||
site_description:
|
||||
site_author: Justin Dretvic
|
||||
|
||||
use_directory_urls: false
|
||||
|
||||
theme:
|
||||
name: material
|
||||
palette:
|
||||
# Palette toggle for light mode
|
||||
- scheme: default
|
||||
toggle:
|
||||
icon: material/brightness-7
|
||||
name: Switch to dark mode
|
||||
# Palette toggle for dark mode
|
||||
- scheme: slate
|
||||
toggle:
|
||||
icon: material/brightness-4
|
||||
name: Switch to light mode
|
||||
|
||||
plugins:
|
||||
- search
|
||||
- awesome-pages
|
||||
- print-site:
|
||||
add_to_navigation: true
|
||||
add_full_urls: false
|
||||
add_table_of_contents: true
|
||||
toc_title: "Table of Contents"
|
||||
toc_depth: 3
|
||||
add_full_urls: false
|
||||
enumerate_headings: true
|
||||
enumerate_figures: true
|
||||
add_cover_page: true
|
||||
path_to_pdf: "assets/site.pdf"
|
|
@ -0,0 +1,29 @@
|
|||
bracex==2.3.post1
|
||||
certifi==2022.12.7
|
||||
charset-normalizer==3.0.1
|
||||
click==8.1.3
|
||||
colorama==0.4.6
|
||||
ghp-import==2.1.0
|
||||
idna==3.4
|
||||
Jinja2==3.1.2
|
||||
Markdown==3.3.7
|
||||
MarkupSafe==2.1.2
|
||||
mergedeep==1.3.4
|
||||
mkdocs==1.4.2
|
||||
mkdocs-awesome-pages-plugin==2.8.0
|
||||
mkdocs-material==9.0.6
|
||||
mkdocs-material-extensions==1.1.1
|
||||
mkdocs-print-site-plugin==2.3.4
|
||||
natsort==8.2.0
|
||||
packaging==23.0
|
||||
Pygments==2.14.0
|
||||
pymdown-extensions==9.9.2
|
||||
python-dateutil==2.8.2
|
||||
PyYAML==6.0
|
||||
pyyaml_env_tag==0.1
|
||||
regex==2022.10.31
|
||||
requests==2.28.2
|
||||
six==1.16.0
|
||||
urllib3==1.26.14
|
||||
watchdog==2.2.1
|
||||
wcmatch==8.4.1
|