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 < Ein Klick auf die Nummer – das Telefon wählt.
- 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 ` und schließt -sie wieder. Der Anruf bleibt danach an der Basis bestehen. +sie wieder. Der Anruf bleibt danach am Telefon bestehen. -Wie das Protokoll gefunden wurde: [CodeForFire/lagebuch#617](https://github.com/CodeForFire/lagebuch/issues/617). +Freizeichen kennt kein bestimmtes Modell. Getestet ist das Gigaset DL500A; jedes Telefon, das über +Bluetooth AT-Befehle annimmt, sollte ebenso gehen – siehe [Getestete Geräte](docs/geraete.md). + +Wie das Protokoll am DL500A gefunden wurde: [CodeForFire/lagebuch#617](https://github.com/CodeForFire/lagebuch/issues/617). ## Voraussetzungen -- Ein **Gigaset DL500A** mit eingeschaltetem Bluetooth. +- Ein **Telefon mit Bluetooth und AT-Befehlen**, z. B. das Gigaset DL500A – siehe + [Getestete Geräte](docs/geraete.md). - Ein PC mit Bluetooth, auf dem das Telefon **gekoppelt** ist. - Das Telefon ist **nicht als Audiogerät** (Freisprechen/Headset) mit dem PC verbunden. Solange diese Audioverbindung besteht, antwortet das DL500A auf der seriellen Schnittstelle nicht – @@ -65,9 +69,10 @@ Release: `sha256sum -c SHA256SUMS.txt` (Linux) bzw. `shasum -a 256 -c SHA256SUMS Freizeichen-Einstellungen: Bluetooth-Port COM7, Ländervorwahl 49, Telefon antwortet. Alles bereit. -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. Bluetooth am Telefon eingeschaltet? Ist es mit diesem PC als Audiogerät verbunden, diese Verbindung trennen. **„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.` an. Prüfen im Terminal: + + ```sh + ls /dev/cu.* + ``` + +4. In Freizeichen unter **Bluetooth-Port** diesen Port wählen. Freizeichen zeigt nur die + `cu.`-Ports und blendet `Bluetooth-Incoming-Port` und `debug-console` aus. + +Ob neuere macOS-Versionen für jedes Telefon einen solchen Port anlegen, ist nicht geprüft. Fehlt +er, kann Freizeichen mit diesem Telefon unter macOS nicht wählen – dann bitte melden. + +Hat macOS das Telefon zusätzlich als Audiogerät verbunden und Freizeichen meldet „Telefon +antwortet nicht.“, die Audioverbindung in den Ton-Einstellungen bzw. unter **Bluetooth** +trennen. + +## Prüfen + +In den Einstellungen von Freizeichen: + +1. **Verbindung testen** – „Telefon antwortet. Alles bereit.“ +2. **Testanruf** auf das eigene Handy – das Telefon wählt. + +Kommt eine Fehlermeldung, hilft die [Fehlerbehebung](../README.md#fehlerbehebung) weiter. diff --git a/docs/geraete.md b/docs/geraete.md new file mode 100644 index 0000000..9f5d502 --- /dev/null +++ b/docs/geraete.md @@ -0,0 +1,36 @@ +# Getestete Geräte + +Freizeichen spricht mit dem Telefon nur über eine serielle Bluetooth-Schnittstelle und sendet dort +`AT` und `ATD `. Es weiß nichts über ein bestimmtes Modell. Getestet ist es bisher mit +einem Gerät; jedes andere Telefon, das die [Voraussetzungen](#was-ein-telefon-braucht) erfüllt, +sollte ebenso funktionieren. + +| Gerät | System | Status | Hinweise | +|---|---|---|---| +| Gigaset DL500A | Windows | **getestet** | SPP auf RFCOMM-Kanal 1. Antwortet nicht, solange es als Audiogerät verbunden ist. | +| Gigaset DL500A | Linux, macOS | theoretisch | Nur gegen `tools/fake-dl500a.py` geprüft, siehe [Bluetooth einrichten](bluetooth-einrichten.md). | + +**getestet** heißt: Mit diesem Gerät auf diesem System hat Freizeichen echte Anrufe aufgebaut. +**theoretisch** heißt: Es sollte funktionieren, ausprobiert hat es aber noch niemand. + +## Was ein Telefon braucht + +- **Bluetooth mit serieller Schnittstelle:** das Serial Port Profile (SPP) oder das Dial-up + Networking Profile (DUN). Das Betriebssystem macht daraus einen COM-Port, `/dev/cu.…` oder + `/dev/rfcomm0`. +- **AT-Befehle:** Auf `AT` antwortet das Telefon mit `OK`, auf `ATD ` baut es den Anruf + auf und antwortet mit `OK`. +- **Der Anruf bleibt bestehen,** wenn Freizeichen die Schnittstelle danach wieder schließt. + +In Frage kommen Tischtelefone und DECT-Basen mit Bluetooth sowie ältere Handys mit DUN – welche +es wirklich können, zeigt erst ein Test. Aktuelle Smartphones bieten meist keine serielle +Schnittstelle mit AT-Befehlen mehr an. + +Ob ein Telefon antwortet, zeigt in den Einstellungen **Verbindung testen**; ob es auch wählt, ein +**Testanruf**. + +## Gerät melden + +Freizeichen mit einem anderen Telefon ausprobiert – ob es geklappt hat oder nicht? Bitte +[Gerät melden](https://github.com/CodeForFire/freizeichen/issues/new?template=device_report.yml). +Die Meldung kommt in diese Liste. diff --git a/docs/screenshots/settings.png b/docs/screenshots/settings.png index 10b2c27..4efa29b 100644 Binary files a/docs/screenshots/settings.png and b/docs/screenshots/settings.png differ diff --git a/packaging/linux/build-linux.sh b/packaging/linux/build-linux.sh index c5281fd..3800033 100755 --- a/packaging/linux/build-linux.sh +++ b/packaging/linux/build-linux.sh @@ -54,7 +54,7 @@ cat > "$ROOT/usr/share/applications/freizeichen.desktop" <<'DESKTOP' [Desktop Entry] Type=Application Name=Freizeichen -Comment=Wählt tel:-Links über ein Gigaset DL500A per Bluetooth +Comment=Wählt tel:-Links über ein Bluetooth-Telefon Exec=/usr/bin/freizeichen %u Icon=freizeichen Terminal=false @@ -81,7 +81,7 @@ cat > "$ROOT/usr/share/metainfo/de.codeforfire.freizeichen.metainfo.xml" < de.codeforfire.freizeichen Freizeichen -

Wählt tel:-Links über ein Gigaset DL500A per Bluetooth + Wählt tel:-Links über ein Bluetooth-Telefon CC0-1.0 MIT @@ -90,8 +90,8 @@ cat > "$ROOT/usr/share/metainfo/de.codeforfire.freizeichen.metainfo.xml" <

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.desktop @@ -148,9 +148,10 @@ Homepage: https://github.com/CodeForFire/freizeichen Installed-Size: ${INSTALLED_KB} Depends: libc6, libstdc++6, libgcc-s1, zlib1g, libfontconfig1, libx11-6, libice6, libsm6, xdg-utils, hicolor-icon-theme, libicu72 | libicu74 | libicu76 | libicu77 | libicu78 Recommends: bluez -Description: Dial tel: links on a Gigaset DL500A over Bluetooth - Freizeichen registers as the tel: handler and dials the number on a Gigaset - DL500A through its Bluetooth serial port, after a confirm window. +Description: Dial tel: links on a Bluetooth phone + Freizeichen registers as the tel: handler and dials the number on a phone + through its Bluetooth serial port, after a confirm window. Tested with the + Gigaset DL500A. CONTROL chmod -R u=rwX,go=rX "$ROOT" diff --git a/packaging/windows/Freizeichen.wxs b/packaging/windows/Freizeichen.wxs index fa8ec3f..5c67b81 100644 --- a/packaging/windows/Freizeichen.wxs +++ b/packaging/windows/Freizeichen.wxs @@ -40,7 +40,7 @@ @@ -62,7 +62,7 @@ + Name="ApplicationDescription" Value="Wählt tel:-Links über ein Bluetooth-Telefon." Type="string" /> .Append("[Desktop Entry]\n") .Append("Type=Application\n") .Append("Name=Freizeichen\n") - .Append("Comment=Wählt tel:-Links über ein Gigaset DL500A per Bluetooth\n") + .Append("Comment=Wählt tel:-Links über ein Bluetooth-Telefon\n") .Append("Exec=").Append(QuoteExecArgument(executablePath)).Append(" %u\n") .Append("Icon=").Append(IconPath(executablePath)).Append('\n') .Append("Terminal=false\n") diff --git a/src/Freizeichen.App/Views/SettingsWindow.axaml b/src/Freizeichen.App/Views/SettingsWindow.axaml index fa68fdd..a21abb6 100644 --- a/src/Freizeichen.App/Views/SettingsWindow.axaml +++ b/src/Freizeichen.App/Views/SettingsWindow.axaml @@ -21,7 +21,7 @@ - +