diff --git a/.github/ISSUE_TEMPLATE/device_report.yml b/.github/ISSUE_TEMPLATE/device_report.yml
new file mode 100644
index 0000000..192d1bb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/device_report.yml
@@ -0,0 +1,62 @@
+name: Device report
+description: Freizeichen works — or does not work — with a phone that is not on the tested list yet
+labels: [documentation]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for trying Freizeichen with another phone! Every report, good or bad, goes into
+ [docs/geraete.md](https://github.com/CodeForFire/freizeichen/blob/main/docs/geraete.md).
+ Please use **fictional phone numbers only** in screenshots and examples.
+ - type: input
+ id: phone
+ attributes:
+ label: Phone
+ description: Manufacturer, model and firmware if known
+ placeholder: Gigaset DL500A
+ validations:
+ required: true
+ - type: dropdown
+ id: platform
+ attributes:
+ label: Platform
+ options:
+ - Windows
+ - macOS
+ - Linux
+ validations:
+ required: true
+ - type: input
+ id: port
+ attributes:
+ label: Port
+ description: The port selected in the settings
+ placeholder: COM7, /dev/cu.DL500A or /dev/rfcomm0
+ validations:
+ required: true
+ - type: dropdown
+ id: probe
+ attributes:
+ label: „Verbindung testen“
+ options:
+ - „Telefon antwortet. Alles bereit.“
+ - Another message (please quote it below)
+ validations:
+ required: true
+ - type: dropdown
+ id: call
+ attributes:
+ label: „Testanruf“
+ options:
+ - The phone dialled and the call went through
+ - The phone did not dial (please describe below)
+ - Not tried
+ validations:
+ required: true
+ - type: textarea
+ id: notes
+ attributes:
+ label: Notes
+ description: |
+ Anything that was needed to make it work, e.g. disconnecting the audio connection, a different
+ RFCOMM channel or Amtsholung. If you can, include the answer to `AT+CGMI` from a serial terminal.
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b248ce4..2066459 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -226,7 +226,7 @@ jobs:
PRERELEASE: ${{ needs.version.outputs.prerelease }}
run: |
cat > notes.md <
- tel:-Links über ein Gigaset DL500A, per Bluetooth.
+ tel:-Links über ein Bluetooth-Telefon wählen – getestet mit dem Gigaset DL500A.
@@ -19,7 +19,7 @@
Ein Klick auf eine Telefonnummer in [Lagebuch](https://github.com/CodeForFire/lagebuch) – oder in
jedem anderen Programm, das `tel:`-Links öffnet – zeigt ein kleines Fenster mit der Nummer. Nach
-*Wählen* baut das Gigaset DL500A den Anruf auf; das Gespräch wird am Telefon geführt.
+*Wählen* baut das Telefon den Anruf auf; das Gespräch wird am Telefon geführt.
Kein Gigaset QuickSync, kein TAPI, keine CSTA-Lizenz, kein Server.
@@ -34,15 +34,19 @@ nichts über das Telefon wissen, es erzeugt nur gewöhnliche `tel:`-Links.
## So funktioniert es
-Das DL500A stellt über Bluetooth eine serielle Schnittstelle (SPP) bereit und versteht dort
+Das Telefon stellt über Bluetooth eine serielle Schnittstelle (SPP) bereit und versteht dort
AT-Befehle wie ein Modem. Freizeichen öffnet diese Schnittstelle, sendet `ATD
Freizeichen wird zum Standardprogramm für tel:-Links und wählt die Nummer über die
- serielle Bluetooth-Schnittstelle eines Gigaset DL500A. Vor jedem Anruf zeigt es die Nummer
- zur Bestätigung.
+ serielle Bluetooth-Schnittstelle des Telefons, getestet mit dem Gigaset DL500A. Vor jedem
+ Anruf zeigt es die Nummer zur Bestätigung.
-Freizeichen ohne Nummer starten – es öffnet die Einstellungen.
+Freizeichen ohne Nummer starten – es öffnet die Einstellungen. Wie das Telefon unter Windows,
+macOS und Linux gekoppelt wird, steht ausführlich in [Bluetooth einrichten](docs/bluetooth-einrichten.md).
-1. Das DL500A in den Bluetooth-Einstellungen des PCs **koppeln**, nicht als Audiogerät verbinden.
+1. Das Telefon in den Bluetooth-Einstellungen des PCs **koppeln**, nicht als Audiogerät verbinden.
2. Unter **Bluetooth-Port** den Port des Telefons wählen: unter Windows ein ausgehender
COM-Port, unter macOS `/dev/cu.…`, unter Linux `/dev/rfcomm0`.
3. **Ländervorwahl** und, falls die Leitung eine braucht, **Amtsholung** eintragen,
@@ -100,8 +105,8 @@ Sicherheitslücken bitte vertraulich melden – siehe [SECURITY.md](SECURITY.md)
**„Telefon antwortet nicht.“** Fast immer besteht noch eine Audioverbindung (Freisprechen) vom PC
-zum DL500A. Dann wird die serielle Verbindung nicht abgelehnt, sondern läuft ins Leere. In den
-Bluetooth-Einstellungen des PCs die Audioverbindung trennen – gekoppelt bleibt das Telefon.
+zum Telefon. Dann lehnt zumindest das DL500A die serielle Verbindung nicht ab, sie läuft ins Leere.
+In den Bluetooth-Einstellungen des PCs die Audioverbindung trennen – gekoppelt bleibt das Telefon.
**„Port … nicht gefunden.“** Das Telefon ist nicht (mehr) gekoppelt, oder unter Linux fehlt
`rfcomm bind`. Koppeln, dann in den Einstellungen **Aktualisieren**.
@@ -127,8 +132,9 @@ make run ARGS=tel:0891234567 # Wählfenster
## Mitmachen
-Fehler gefunden, Idee, anderes Telefon? [Issues](../../issues) und
-[Discussions](../../discussions) sind offen – in den Discussions gern auf Deutsch.
+Fehler gefunden, Idee? [Issues](../../issues) und [Discussions](../../discussions) sind offen –
+in den Discussions gern auf Deutsch. Freizeichen mit einem anderen Telefon ausprobiert? Bitte
+[Gerät melden](../../issues/new?template=device_report.yml), ob es geklappt hat oder nicht.
Wie Pull Requests aussehen sollen, steht in [CONTRIBUTING.md](CONTRIBUTING.md).
---
@@ -137,7 +143,8 @@ Wie Pull Requests aussehen sollen, steht in [CONTRIBUTING.md](CONTRIBUTING.md).
Freizeichen is a small .NET 10 / Avalonia 12 desktop app for Windows, macOS and Linux. It
registers as the operating system's `tel:` handler, shows a confirm window and sends `ATD` to a
-Gigaset DL500A over Bluetooth SPP. It exists so that [Lagebuch](https://github.com/CodeForFire/lagebuch)
+phone over Bluetooth SPP. Nothing in it is specific to one model; the Gigaset DL500A is the one it
+is tested with ([docs/geraete.md](docs/geraete.md)). It exists so that [Lagebuch](https://github.com/CodeForFire/lagebuch)
and every other program in the ELW can keep emitting plain `tel:` links.
### Build and run
diff --git a/SECURITY.md b/SECURITY.md
index 8d22c3b..3bc24c7 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -49,8 +49,8 @@ hand it input**. Whatever reaches the phone after `ATD` is executed by the phone
## Out of scope
-- The Bluetooth security of the DL500A itself (pairing, SPP access by another paired device).
- Report those to Gigaset.
+- The Bluetooth security of the phone itself (pairing, SPP access by another paired device).
+ Report those to its manufacturer.
- Anyone who can already run code as the logged-in user can open the serial port directly and
needs no help from Freizeichen.
- The installers are not code-signed yet. This is a known limitation, not a vulnerability.
diff --git a/docs/bluetooth-einrichten.md b/docs/bluetooth-einrichten.md
new file mode 100644
index 0000000..5161d6d
--- /dev/null
+++ b/docs/bluetooth-einrichten.md
@@ -0,0 +1,123 @@
+# Bluetooth einrichten
+
+Freizeichen braucht vom Betriebssystem nur eines: eine serielle Schnittstelle zum Telefon. Dafür
+wird das Telefon **gekoppelt**, aber **nicht als Audiogerät verbunden**. Solange der PC die
+Audioverbindung (Freisprechen/Headset) hält, antwortet zumindest das DL500A auf der seriellen
+Schnittstelle nicht.
+
+Jeder Abschnitt sagt, wie gut er belegt ist:
+
+- **getestet** – so eingerichtet hat Freizeichen mit einem echten Telefon gewählt.
+- **theoretisch** – so sollte es gehen, mit einem echten Telefon geprüft hat es noch niemand.
+ Klappt es (oder nicht), bitte [Gerät melden](https://github.com/CodeForFire/freizeichen/issues/new?template=device_report.yml).
+
+Welche Telefone getestet sind: [Getestete Geräte](geraete.md).
+
+## Windows
+
+**Status: getestet** mit dem Gigaset DL500A.
+
+1. Am Telefon Bluetooth einschalten und sichtbar machen.
+2. **Einstellungen → Bluetooth und Geräte → Gerät hinzufügen → Bluetooth**, das Telefon wählen und
+ die PIN bestätigen.
+3. Die Audioverbindung abschalten: **Systemsteuerung → Geräte und Drucker**, Rechtsklick auf das
+ Telefon → **Eigenschaften → Dienste**, die Haken bei den Audio-Diensten
+ (*Freisprechtelefonie*, *Headset*) entfernen. Gekoppelt bleibt das Telefon.
+4. Den COM-Port ablesen: **Einstellungen → Bluetooth und Geräte → Geräte → Weitere
+ Bluetooth-Einstellungen → COM-Anschlüsse**. Gebraucht wird der Port mit der Richtung
+ **Ausgehend** und dem Namen des Telefons. Fehlt er: **Hinzufügen… → Ausgehend**, das Telefon
+ wählen.
+5. In Freizeichen unter **Bluetooth-Port** diesen COM-Port wählen.
+
+## Linux
+
+**Status: theoretisch.** Freizeichen ist unter Linux bisher nur gegen das simulierte Telefon
+`tools/fake-dl500a.py` gelaufen.
+
+Gebraucht werden BlueZ (Paket `bluez`) und die Werkzeuge `rfcomm` und `sdptool`. Neuere
+Distributionen liefern die beiden nicht mehr überall mit; unter Debian und Ubuntu sind sie im
+Paket `bluez` enthalten.
+
+1. Koppeln, aber **nicht** verbinden – `connect` würde die Audioverbindung aufbauen:
+
+ ```sh
+ bluetoothctl
+ [bluetooth]# scan on # warten, bis das Telefon mit seiner Adresse erscheint
+ [bluetooth]# pair AA:BB:CC:DD:EE:FF
+ [bluetooth]# trust AA:BB:CC:DD:EE:FF
+ [bluetooth]# quit
+ ```
+
+2. Den RFCOMM-Kanal der seriellen Schnittstelle finden (beim DL500A: Kanal 1):
+
+ ```sh
+ sdptool browse AA:BB:CC:DD:EE:FF | grep -A8 'Serial Port\|Dial-up'
+ ```
+
+3. Den Port anlegen. Er verbindet sich erst, wenn Freizeichen ihn öffnet:
+
+ ```sh
+ sudo rfcomm bind 0 AA:BB:CC:DD:EE:FF 1
+ ```
+
+4. Den eigenen Benutzer in die Gruppe `dialout` aufnehmen, damit Freizeichen `/dev/rfcomm0` öffnen
+ darf, dann ab- und wieder anmelden:
+
+ ```sh
+ sudo usermod -aG dialout "$USER"
+ ```
+
+5. In Freizeichen unter **Bluetooth-Port** `/dev/rfcomm0` wählen.
+
+`rfcomm bind` gilt nur bis zum Neustart. Damit der Port bei jedem Start da ist, kann ihn eine
+systemd-Unit anlegen, z. B. `/etc/systemd/system/rfcomm0.service`:
+
+```ini
+[Unit]
+Description=Serielle Bluetooth-Schnittstelle zum Telefon
+After=bluetooth.service
+Requires=bluetooth.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/rfcomm bind 0 AA:BB:CC:DD:EE:FF 1
+ExecStop=/usr/bin/rfcomm release 0
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Danach `sudo systemctl enable --now rfcomm0.service`.
+
+## macOS
+
+**Status: theoretisch.** Mit einem echten Telefon unter macOS ist Freizeichen noch nicht gelaufen.
+
+1. Am Telefon Bluetooth einschalten und sichtbar machen.
+2. **Systemeinstellungen → Bluetooth**, beim Telefon **Verbinden** und die PIN bestätigen.
+3. Bietet das Telefon eine serielle Schnittstelle an, legt macOS dafür einen Port
+ `/dev/cu.