Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/ISSUE_TEMPLATE/device_report.yml
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ jobs:
PRERELEASE: ${{ needs.version.outputs.prerelease }}
run: |
cat > notes.md <<NOTES
Freizeichen ${VERSION} – wählt \`tel:\`-Links über ein Gigaset DL500A per Bluetooth.
Freizeichen ${VERSION} – wählt \`tel:\`-Links über ein Bluetooth-Telefon, getestet mit dem Gigaset DL500A.

**Installation**
- **Windows**: \`freizeichen-${VERSION}-windows-x64.msi\` ausführen. Danach Freizeichen starten, den Bluetooth-Port wählen und „Als Standard festlegen“ drücken.
Expand Down
5 changes: 3 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Agent instructions

Freizeichen registers as the operating system's `tel:` handler and dials the number on a Gigaset
DL500A over Bluetooth. It exists so that Lagebuch (CodeForFire/lagebuch) and every other program
Freizeichen registers as the operating system's `tel:` handler and dials the number on a phone
that accepts AT commands over Bluetooth SPP. The Gigaset DL500A is the one it is tested with
(`docs/geraete.md` lists tested devices). It exists so that Lagebuch (CodeForFire/lagebuch) and every other program
in the ELW can keep emitting plain `tel:` links; see CodeForFire/lagebuch#617 for how the
protocol was found.

Expand Down
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Contributing to Freizeichen

Thanks for your interest in contributing! Freizeichen dials `tel:` links on a Gigaset DL500A over
Bluetooth, so that [Lagebuch](https://github.com/CodeForFire/lagebuch) and every other program in
the ELW can offer one-click calling. Every contribution is welcome, from a typo fix to support for
another phone.
Thanks for your interest in contributing! Freizeichen dials `tel:` links on a phone that speaks AT
commands over Bluetooth (tested with the Gigaset DL500A), so that [Lagebuch](https://github.com/CodeForFire/lagebuch) and every other program in
the ELW can offer one-click calling. Every contribution is welcome, from a typo fix to a report that
another phone works — see [Getestete Geräte](docs/geraete.md).

## Before you start

Expand Down
33 changes: 20 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<p align="center">
<strong>Ein Klick auf die Nummer – das Telefon wählt.</strong><br />
<code>tel:</code>-Links über ein Gigaset DL500A, per Bluetooth.
<code>tel:</code>-Links über ein Bluetooth-Telefon wählen – getestet mit dem Gigaset DL500A.
</p>

<p align="center">
Expand All @@ -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.

Expand All @@ -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 <Nummer>` 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 –
Expand All @@ -65,9 +69,10 @@ Release: `sha256sum -c SHA256SUMS.txt` (Linux) bzw. `shasum -a 256 -c SHA256SUMS

<img src="docs/screenshots/settings.png" width="420" align="right" alt="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,
Expand Down Expand Up @@ -100,8 +105,8 @@ Sicherheitslücken bitte vertraulich melden – siehe [SECURITY.md](SECURITY.md)
<img src="docs/screenshots/dial-timeout.png" width="420" align="right" alt="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**.
Expand All @@ -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).

---
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
123 changes: 123 additions & 0 deletions docs/bluetooth-einrichten.md
Original file line number Diff line number Diff line change
@@ -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.<Gerätename>` 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.
36 changes: 36 additions & 0 deletions docs/geraete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Getestete Geräte

Freizeichen spricht mit dem Telefon nur über eine serielle Bluetooth-Schnittstelle und sendet dort
`AT` und `ATD <Nummer>`. 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 <Nummer>` 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.
Binary file modified docs/screenshots/settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 8 additions & 7 deletions packaging/linux/build-linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -81,7 +81,7 @@ cat > "$ROOT/usr/share/metainfo/de.codeforfire.freizeichen.metainfo.xml" <<METAI
<component type="desktop-application">
<id>de.codeforfire.freizeichen</id>
<name>Freizeichen</name>
<summary>Wählt tel:-Links über ein Gigaset DL500A per Bluetooth</summary>
<summary>Wählt tel:-Links über ein Bluetooth-Telefon</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>MIT</project_license>
<developer id="de.codeforfire">
Expand All @@ -90,8 +90,8 @@ cat > "$ROOT/usr/share/metainfo/de.codeforfire.freizeichen.metainfo.xml" <<METAI
<description>
<p>
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.
</p>
</description>
<launchable type="desktop-id">freizeichen.desktop</launchable>
Expand Down Expand Up @@ -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"
Expand Down
Loading
Loading