Message Strobe
Sendet eine feste PMT-Nachricht in periodischen Abständen — der einfachste Weg, message-basierte Blöcke ohne Stream-Quelle anzustoßen.
1. Beschreibung des Blocks
Der Message Strobe-Block (blocks.message_strobe) sendet in festen Zeitabständen (period) immer dieselbe, vorab konfigurierte PMT-Nachricht (msg) über seinen strobe-Message-Port. Er hat keinen Stream-Eingang oder -Ausgang — er ist ausschließlich ein Taktgeber für message-basierte Blockketten, analog zu einem periodischen Timer.
Eine Schwester-Variante, Message Strobe Random-Delay (blocks.message_strobe_random), sendet dieselbe Nachricht stattdessen mit zufällig verteilten Zeitabständen (Exponential-, Uniform-, Gaußsche oder Poisson-Verteilung) — nützlich, um message-basierte Verarbeitung unter unregelmäßiger, realitätsnaher Last statt streng periodisch zu testen.
blocks.message_debug(), der alle empfangenen Nachrichten in einer nummerierten Liste sammelt:
from gnuradio import gr, blocks
import pmt, time
tb = gr.top_block()
strobe = blocks.message_strobe(pmt.intern("PING"), 50) # alle 50 ms
dbg = blocks.message_debug()
tb.msg_connect(strobe, "strobe", dbg, "store")
tb.start()
time.sleep(0.35) # 350 ms laufen lassen
tb.stop()
tb.wait()
print("num_messages():", dbg.num_messages())
print("alle Nachrichten identisch:",
all(pmt.symbol_to_string(dbg.get_message(i)) == "PING" for i in range(dbg.num_messages())))
from gnuradio import gr, blocks
import pmt, time
tb = gr.top_block()
strobe = blocks.message_strobe(pmt.intern("PING"), 50) # alle 50 ms
dbg = blocks.message_debug()
tb.msg_connect(strobe, "strobe", dbg, "store")
tb.start()
time.sleep(0.35) # 350 ms laufen lassen
tb.stop()
tb.wait()
print("num_messages():", dbg.num_messages())
print("alle Nachrichten identisch:",
all(pmt.symbol_to_string(dbg.get_message(i)) == "PING" for i in range(dbg.num_messages())))
Ausgabe:
num_messages(): 6
alle Nachrichten identisch: True
num_messages(): 6
alle Nachrichten identisch: True
Warum diese Werte: Bei 50 ms Periode und 350 ms Laufzeit sind rechnerisch 7 Sendezeitpunkte möglich (0, 50, 100, …, 300 ms); real ankommen 6 — die Differenz ist der erwartete Anlauf-/Stop-Jitter am Rand des sleep()-Fensters (der Scheduler startet nicht exakt bei $t=0$, und tb.stop() kann mitten in einer Periode greifen). Wichtiger als die exakte Zahl ist der zweite Test: Alle empfangenen Nachrichten sind tatsächlich identisch zur konfigurierten msg — der Block sendet also verlässlich immer dieselbe Nachricht, nicht nur ungefähr im richtigen Takt.
2. Technischer Einsatz
Message Strobe wird eingesetzt, wenn ein message-basierter Block (z. B. ein PDU-Handler oder ein Block, der auf einen Trigger wartet) regelmäßig angestoßen werden muss, ohne dass dafür ein echter Stream-Datenfluss existiert — etwa um periodisch eine Statusabfrage auszulösen, einen Heartbeat zu simulieren, oder einen nachgeschalteten Block mit einer konstanten Test-Nachricht zu füttern.
blocks.message_debug() als Gegenstück sammelt die Antwort zur anschließenden assert-Prüfung.3. Parameter und Dimensionierung
| Parameter | Typ/Einheit | Bedeutung | Dimensionierungshinweis |
|---|---|---|---|
msg (Message PMT) |
PMT-Ausdruck | die zu sendende Nachricht, z. B. pmt.intern("TEST") |
beliebiger gültiger PMT-Ausdruck (Symbol, Dictionary, PDU, …) — muss zum Eingabeformat des Zielblocks passen |
period (Period) |
Millisekunden | Zeitabstand zwischen zwei Sendungen | bei sehr kleinen Werten (< 10 ms) steigt der Scheduler-Overhead spürbar; für Tests reichen meist einige zehn bis hundert Millisekunden |
Bei der Random-Delay-Variante treten zusätzlich dist (Verteilungstyp), mean (Erwartungswert in ms) und std (Streuung bzw. maximale Abweichung, je nach Verteilung) hinzu.
4. Ein- und Ausgänge
| Ein-/Ausgang | Typ |
|---|---|
| Eingang | Message-Port set_msg (optional) — überschreibt die gesendete Nachricht zur Laufzeit |
| Ausgang | Message-Port strobe — liefert periodisch msg |
Es gibt keine Stream-Ports — Message Strobe lässt sich ausschließlich über tb.msg_connect(...) mit anderen Message-Ports verbinden, nicht über tb.connect(...).
5. Weitere wichtige Aspekte
Live-Parameteränderung: set_msg(...) und set_period(...) erlauben eine Anpassung von Nachrichteninhalt bzw. Sendeintervall zur Laufzeit — z. B. über den set_msg-Message-Eingang, der denselben Effekt wie der gleichnamige Callback hat.
Keine Garantie exakter Taktung: Da der Scheduler kooperativ arbeitet, ist period ein Sollwert, kein hartes Echtzeit-Timing — für die in diesem Beispiel gezeigte Testautomatisierung (Anzahl grob erwarteter Nachrichten in einem Zeitfenster) ist das unkritisch, für zeitkritische Protokoll-Simulationen sollte diese Unschärfe eingeplant werden.