bergclimber.deArcher MR600

Archer MR600: LTE-Signal auslesen und überwachen

RSRP, RSRQ, SNR und Netztyp des TP-Link Archer MR600 per Skript statt App: die Login-Fallen, ein fertiges Python-Skript mit Prometheus-Ausgabe und ein Bewerter für deine Werte.

Werte einordnen

Die drei Zahlen aus der Web-UI (Erweitert → Status → LTE) oder aus dem Skript eintragen. Die Einordnung folgt den üblichen Praxis-Richtwerten für LTE; es sind keine Herstellerangaben.

–
–
–
Gesamt

Noch keine Werte.

Worum es geht

Der Archer MR600 ist ein LTE-Router mit SIM-Slot, oft als Backup-Uplink oder auf dem Land als Hauptanschluss. Wie gut der Empfang gerade ist, weiß nur der Router selbst: UniFi, Fritz!Box oder ein Ping sehen Latenz und Ausfälle, nicht ob die Antenne richtig steht oder die Zelle voll ist. Die Web-UI zeigt die Werte, aber niemand schaut jede Minute hin. Die Tether-App gibt es nur fürs Telefon.

Die Bibliothek tplinkrouterc6u spricht das Login-Protokoll der TP-Link-Router; das eigentliche Problem ist, welcher ihrer Clients zu welcher Firmware passt und wie man den Router nicht aus Versehen sperrt. Genau das steht hier, verifiziert am Archer MR600 v3.0 mit Firmware 1.3.0 (Build 250915), der seit Wochen jede Minute abgefragt wird.

Schnellstart

# Bibliothek und Skript (Linux, Raspberry Pi, Mac)
python3 -m venv ~/mr600 && ~/mr600/bin/pip install tplinkrouterc6u
curl -o ~/mr600/mr600.py https://bergclimber.de/mr600/dl/mr600.py

# Passwort der Web-UI (Benutzer gibt es dort keinen, intern heißt er "admin")
export MR600_PASSWORD='…'

# In der Web-UI abmelden, dann:
~/mr600/bin/python3 ~/mr600/mr600.py status --host http://192.168.1.1 --firmware
~/mr600/bin/python3 ~/mr600/mr600.py json
~/mr600/bin/python3 ~/mr600/mr600.py prometheus

Der erste Aufruf sollte mit abgemeldeter Web-UI passieren. Schlägt er mit „Passwort falsch" fehl, nicht blind wiederholen: nach fünf Fehlversuchen sperrt der Router den Login für längere Zeit. Erst Benutzername, Client und Passwort prüfen (siehe Fallen).

Die Fallen

1. Der falsche Client sieht aus wie ein falsches Passwort

tplinkrouterc6u hat drei Clients für die MR-Serie. Für den MR600 v3 mit aktueller Firmware passt TPLinkMR6400v7Client (MD5-Hash, RSA-Signatur, Sequenznummer aus /cgi/getParm). TPLinkMR600Client erwartet ECC und scheitert, TPLinkMR200Client bringt Fehler 71234. Die Auto-Erkennung der Bibliothek wählt hier richtig, das Skript nutzt MR6400v7 als Standard und lässt sich per --client umstellen.

2. username="admin" ist Pflicht, obwohl die Web-UI kein Benutzerfeld hat

Die Login-Seite hasht MD5("admin" + Passwort). Der MR6400v7-Client nimmt per Default einen leeren Benutzernamen und bekommt Fehler 71233 „Passwort falsch", obwohl das Passwort stimmt. Das kostet eine Stunde, wenn man es nicht weiß.

3. Eine Admin-Session, und nur eine

Solange jemand in der Web-UI angemeldet ist, scheitert jeder weitere Login (/cgi/getBusy meldet isLogined). Umgekehrt sperrt ein Skript, das die Session hält, dich aus der Web-UI aus. Deshalb pro Abfrage anmelden, lesen, abmelden. Das Skript macht das immer, auch im Fehlerfall.

4. Fünf Fehlversuche, dann ist zu

TP-Link sperrt den Login nach fünf Ablehnungen für längere Zeit, auch per Web-UI. Ein Monitor, der jede Minute mit falschem Passwort anklopft, sperrt sich selbst aus. Das Skript legt nach einer Ablehnung 30 Minuten Pause ein, bevor es wieder versucht.

5. SNR kommt in Zehntel-dB

Das Feld rfInfoSnr liefert 152 für 15,2 dB; die Web-UI zeigt gerundete ganze dB. RSRP und RSRQ kommen dagegen direkt in dBm bzw. dB. Wer den Rohwert ungeteilt in ein Dashboard schreibt, wundert sich über SNR 150.

6. SIM-Status 3 ist der Normalzustand

sim_status 3 heißt „SIM card prepared" und ist bei dieser Firmware der Zustand bei funktionierender Verbindung, nicht ein Zwischenschritt. connect_status 4 ist „verbunden". Alerts auf andere Werte als diese beiden setzen, nicht auf vermeintlich „fertigere" Codes.

Das Skript

mr600.py ist ein einzelnes Python-Skript über der Bibliothek: Login, Status, Logout, mit Backoff bei Ablehnung. Drei Ausgabeformate: lesbar, JSON und Prometheus-Textformat, letzteres wahlweise direkt an ein Pushgateway. Passwort per Umgebungsvariable oder Datei, nie als Argument (das stünde in der Prozessliste).

mr600.py status [--firmware]            lesbar, mit Einordnung
mr600.py json                            für eigene Skripte
mr600.py prometheus [--push URL]         Metriken lte_* (Pushgateway: PUT)
mr600.py watch --format prometheus --interval 60 --push http://localhost:9091/metrics/job/lte_signal
Optionen: --host http://192.168.1.1  --username admin  --client MR6400v7|MR600|MR200|auto  --password-file PFAD

Als Dienst mit Prometheus und Grafana

Beispiel-Unit: mr600.service. Prometheus scrapt das Pushgateway (honor_labels), die Metriken heißen lte_rsrp_dbm, lte_rsrq_db, lte_snr_db, lte_signal_level, lte_network_type, lte_sim_status, lte_connect_status, lte_rx/tx_speed_bytes_per_second, lte_total_statistics_bytes, lte_sms_unread und lte_signal_up. Sinnvolle Alerts aus unserem Betrieb:

  • LteSignalWeak: lte_rsrp_dbm < -110 für 15 min
  • LteSignalNoisy: lte_snr_db < 3 für 15 min
  • LteNoNetwork: lte_network_type == 0 für 5 min (kritisch)
  • LteSignalMonitorDown: keine Werte seit 15 min, zum Beispiel weil die Web-UI offen ist
sudo mkdir -p /opt/mr600 && sudo cp ~/mr600/mr600.py /opt/mr600/ && sudo cp -r ~/mr600 /opt/mr600/venv
echo '…' | sudo tee /opt/mr600/password >/dev/null && sudo chmod 600 /opt/mr600/password
sudo curl -o /etc/systemd/system/mr600.service https://bergclimber.de/mr600/dl/mr600.service
sudo nano /etc/systemd/system/mr600.service      # User=, --host, --push anpassen
sudo systemctl daemon-reload && sudo systemctl enable --now mr600
journalctl -u mr600 -f

Eine Lehre aus dem Betrieb: Wenn der Dienst nach einem Neustart keine Werte liefert, ist meist die Web-UI offen oder die Passwortdatei noch nicht lesbar. Beides ist kein Grund, am Router etwas zu ändern.

Werte-Referenz

Felder von get_lte_status() der Bibliothek, Bedeutung und beobachtete Werte am MR600 v3.

FeldBedeutungBeobachtet / Hinweis
rsrpReference Signal Received Power, dBm−97 mit Fensterantennen; > −100 brauchbar, < −110 Kante
rsrqReference Signal Received Quality, dB−8 bis −9; > −10 gut, < −16 schlecht
snrSignal-Rausch-Abstand, Zehntel-dB152 = 15,2 dB; > 10 dB gut, < 3 dB schlecht
sig_levelBalken 0–54
network_typeNetztyp-Code0 kein Netz, 1 GSM, 2 WCDMA, 3 4G LTE, 7 4G+ LTE, 8 5G NR
connect_statusVerbindungsstatus, rohe TP-Link-Kodierung4 = verbunden
sim_statusSIM-Status-Code3 = „SIM card prepared" = normal
isp_nameNetzname laut SIMz. B. „Congstar Internet" bei fraenk
cur_rx_speed / cur_tx_speedMomentane Rate, Byte/sMomentaufnahme des Routers
total_statisticsVolumen seit Zähler-Reset, ByteZähler des Routers, nicht des Skripts
sms_unread_countUngelesene SMS auf dem RouterNetzbetreiber-SMS landen hier

Richtwerte

Wertsehr gutgutbrauchbarschwachKante
RSRP (dBm)≥ −80−80 … −90−90 … −100−100 … −110< −110
RSRQ (dB)≥ −10−10 … −15−15 … −20< −20
SNR (dB)≥ 2013 … 200 … 13< 0

RSRP sagt, wie stark der Mast ankommt (Position, Antenne, Entfernung). SNR sagt, wie sauber (Störung, Nachbarzellen). RSRQ reagiert auf Auslastung der Zelle. Für die Datenrate zählen alle drei, für die Frage „Antenne oder nicht" fast nur RSRP.

Kompatibilität

Verifiziert: Archer MR600 v3.0, Firmware 1.3.0 0.9.1 Build 250915. Die Bibliothek listet außerdem MR600 v1/v2, MR200, MR400, MR550 und TL-MR6400 als unterstützt; welcher Client dort passt, sagt im Zweifel --client auto. Melde gern, was bei dir funktioniert hat.

Häufige Fragen

Geht das auch mit der Tether-App oder der Web-UI?

Zum Nachsehen ja, zum Überwachen nein. Beide zeigen nur den Moment, und die Web-UI blockiert dabei jeden Skript-Login. Für Verlauf und Alarme braucht es ein Skript, das die Werte regelmäßig abholt.

Warum meldet der Router „Passwort falsch", obwohl es stimmt?

Fast immer der leere Benutzername oder der falsche Client der Bibliothek. Siehe Fallen 1 und 2. Nicht weiterprobieren, sonst greift die Sperre nach fünf Versuchen.

Wie lange dauert die Sperre nach fünf Fehlversuchen?

Die Firmware nennt keine feste Zeit; in der Praxis waren es rund 30 Minuten bis einige Stunden. Ein Neustart des Routers hebt sie auf. Das Skript wartet nach einer Ablehnung 30 Minuten, bevor es erneut versucht.

Lohnen sich externe Antennen?

Wenn RSRP unter −100 dBm liegt, meist ja. Der MR600 hat zwei SMA-Buchsen; ein Fenster-Flachpanel mit zwei Kabeln brachte hier von „keine Verbindung" auf −100 dBm mit 44 Mbit/s. Vorher die Position ausreizen, das ist umsonst.

Der Dienst liefert nach einem Neustart nichts.

Ist jemand in der Web-UI angemeldet? Ist die Passwortdatei lesbar? Beides sind die häufigsten Ursachen, lange vor einem Router-Problem.

Funktioniert das mit Home Assistant?

Home Assistant hat eine Integration auf Basis derselben Bibliothek, die auch LTE-Werte liefern kann. Dieses Skript ist für alle, die Prometheus und Grafana oder einfach ein JSON im eigenen Werkzeug wollen.

Werden Daten übertragen oder gespeichert?

Nein. Der Bewerter auf dieser Seite rechnet im Browser. Das Skript spricht nur mit deinem Router im lokalen Netz und mit dem Ziel, das du ihm nennst.