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.

Verifiziert (GNU Radio 3.10.12.0, tatsächlich ausgeführt): Da Message Strobe keinen Stream-Ausgang hat, lässt sich das Ergebnis nicht wie sonst mit einem Vector Sink abgreifen — als Gegenstück dient hier 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.

Für automatisierte, headless durchführbare Tests eines message-konsumierenden Blocks ist Message Strobe die naheliegende Ergänzung zum in „Testen mit GRC" beschriebenen Vector-Source/Vector-Sink-Muster für Stream-Blöcke: Statt eines festen Sample-Arrays liefert Message Strobe eine feste, reproduzierbare Nachricht als Ground Truth für den Eingang, ein 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.