app | ||
display | ||
entity | ||
migration | ||
.envrc | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
COPYING | ||
deny.toml | ||
flake.lock | ||
flake.nix | ||
README.md | ||
rust-toolchain.toml |
Alert-Me
Alertswiss is an information hub collecting all relevant information pertaining to precautions and behaviour during disasters and emergencies in Switzerland.
The usual way of getting that information (the alerts) is via a proprietary smartphone app and push notifications. While this works very well and is perfectly fine for most, I think that such data is a nice stepping stone to build upon.
Fortunately, the data is not hidden and easily accessible through a JSON endpoint. In order to prepare this for consumption, the service in app periodically polls the JSON data and persists alerts that changed or have not been seen yet. Additionally it publishes all changes to an MQTT broker where other clients can use that data as they see fit.
An example client is implemented for an nRF52840 microcontroller in display.
Workspace Organization
app
Backend service to poll alerts and publish new ones to an MQTT broker.
display
Microcontroller (nRF52840) application to show basic alert information on an LCD. Because cargo has trouble with different target architectures (see issue 9406) this can not be part of the workspace. Go into the directory to run build commands. There is a separate readme in its project directory.
entity
Entity definitions (tables) for SeaORM. This translates the RDBMS entities to rust structs.
migration
Database migrations that get run at the start of the alert-me app.
Building
The recommended way is to use nix with nix flakes. It still is not for the faint of heart but worth the investment.
Otherwise, rustup and other tools can be installed manually.
Nix
Install nix and enable nix flakes.
Enter the dev environment with nix develop
. From there on the usual rust
commands work.
To build for different architectures use nix-build .#cross-<architecture>
with
the desired architecture.
The following architectures are supported so far (different operating systems would be nice but makes it more complicated):
- x86_64-linux
- i686-linux
- aarch64-linux
- armv6l-linux
The resulting binary (statically linked with musl) is
written to result/bin
.
Manual Way
Install rustup and an MQTT broker (such as
mosquitto). When running rust commands (such as
cargo build
), rustup should pull in the specified toolchain. However, I can
not test this.
Usage
During development the typical way is to run cargo run -p alert-me --
,
followed by the cli arguments. Nothing changes if instead one runs an already
built binary directly (such as result/bin/alert-me
) apart from that first
part.
Usage: alert-me [OPTIONS] --mqtt-broker <MQTT_BROKER> --mqtt-user <MQTT_USER> --mqtt-password <MQTT_PASSWORD>
Options:
-i, --interval <INTERVAL> Update interval in seconds [default: 10]
-c, --connection <CONNECTION> Database connection string where timestamps are stored (SQLite, Postgres or MySql) [default: sqlite::memory:]
-m, --mqtt-broker <MQTT_BROKER> MQTT broker where alerts get published
-p, --mqtt-port <MQTT_PORT> MQTT port [default: 1883]
-u, --mqtt-user <MQTT_USER> MQTT user
-P, --mqtt-password <MQTT_PASSWORD> MQTT password
-h, --help Print help
-V, --version Print version
MQTT Broker
The alert-me app needs to connect to an MQTT broker to publish alerts. The following is an example of running your own with mosquitto).
Create a file mosquitto.conf
with a content of:
A password for publishing is set, so not everyone can just publish alerts. This is not mandatory though.
Run the broker with mosquitto -v -c mosquitto.conf
. With
mosquitto_sub -v -h localhost -p 1883 -t 'alerts'
new alerts will be shown as
they arrive.