High Speed Modem für den QO100 NB Transponder

Interface Modem / Anwenderprogramm

 

Links zu diesem Thema:

Allgemeines
Modulator/Demodulator
Datensicherung, Paketierung, Interface zum Anwenderprogramm
Anwenderprogramm "oscardata", Dokumentation folgt in Kürze ...

Das Anwenderprogramm schickt Datenblöcke in der Größe einer Payload zum Modem. Will man also z.B. eine 20kB große Datei übertragen, so sendet man 20.000 / 219 = 92 Datenblöcke zum Modem. In Empfangsrichtung würde man in dem Fall 92 Blöcke bekommen und kann diese wieder zu einer Datei zusammensetzen. Sendet man Blöcke kleiner als die payload-Größe, so werden die Daten mit 0 aufgefüllt. Es ist Sache des Anwenderprogramms sich um Dateilängen, Dateinamen  usw. zu kümmern.

Datenformat Anwenderprogramm -> Modem:

221 Bytes, bestehend aus:

1 Byte ... Datentyp
1 Byte ... Statusbyte
219 Byte ... payload

der Datentyp und Statusbyte werden zusammen mit der payload zum Empfänger übertragen.

Datentyp:

4-Bit lang (16 Werte), derzeit sind definiert:

0 ... keine Sendung
1 ... z.B.: Bitfehlertest, wird benutzt um einen kontinuierlichen Datenstrom (ohne Ende) zu senden
2 ... Bilddatei
3 ... ASCII Textdatei
4 ... HTML Datei
5 ... Binärdatei
6 bis 15 ... derzeit nicht benutzt

Werte von 16 und darüber werden von internen Steuerbefehlen benutzt um im Modem Einstellungen vorzunehmen:

16 ... ResamplingRate
17 ... AutosendFile (derzeit nicht implementiert)
18 ... AutosendFolder (derzeit nicht implementiert)
19 ... Modem_shutdown (für Singleboard Computer mit SD Karte wichtig)
20 ... ResetModem (Reset des Demodulators)
21 ... SetPBvolume
22 ... SetCAPvolume

der Wert 16 (Resampling Rate) ist eine Spezialfunktion. Hier wird keine Payload übertragen, stattdessen wird im Statusbyte eine Zahl übertragen die im Modem eine Übertragungsgeschwindigkeit und Modulationsart umschaltet, diese sind:

Statusbyte bei Datentyp 16:

0: 3000 bit/s QPSK
1: 3150 bit/s QPSK
2: 3675 bit/s QPSK
3: 4000 bit/s QPSK
4: 4410 bit/s QPSK
5: 4800 bit/s QPSK
6: 5525 bit/s 8PSK
7: 6000 bit/s 8PSK

Statusbyte:

bei allen Datentypen (außer 6) wird hier folgender Wert eingetragen:

0 erster Datenblock einer Übertragung. Das ermöglicht einem Empfänger den Start einer Übertragung zu erkennen um z.B. eine Datei zur Speicherung eines Bildes zu öffnen.
1 Übertragung läuft (alle Blöcke zwischen Anfang und Ende werden so markiert)
2 letzter Datenblock einer Übertragung. Das ermöglicht einem Empfänger das Ende zu erkennen um z.B. eine Datei zu schließen oder die Daten zu präsentieren.

Payload:

zu übertragende Nutzdaten. Der Inhalt ist der Anwendung freigestellt.

Aus Gründen der Kompatibilität sollte bei der Übertragung von Dateien folgender Header am Anfang des ersten Datenblock gesendet werden:

50 bytes Dateiname, oder beliebiger Name der Daten. Ein Empfänger kann das z.B. als Dateinamen zum speichern benutzen
2 bytes beliebige ID Nummer (z.B. Prüsumme der Datei o.ä). Diese Nummer sollte für eine Datei eindeutig sein. Der Empfänger kann anhand dieser Nummer eine Wiederholung einer Übertragung erkennen und ggf. Datenlücken in einer vorhergehenden Übertragung füllen.
3 bytes Größe der Datei in Byte (MSB zuerst)

 

Datenformat Modem -> Anwenderprogramm:

vom Modem kommen jeweils 229 Bytes mit folgendem Inhalt:

Byte 0 ... Datentyp (siehe oben). Ist mit dem gesendeten Datentyp identisch.
Byte 1 ... Blocknummer MSB
Byte 2 ... Blocknummer LSB
Byte 3 ... Status (siehe oben). Ist mit dem gesendeten Statusbyte identisch.
Byte 4 ... RX Statusinfo
Byte 5 ... Übertragungsgeschwindigkeit in bit/s MSB
Byte 6 ... Übertragungsgeschwindigkeit in bit/s LSB
Byte 7 ... frei für zukünftige Erweiterungen
Byte 8 ... frei für zukünftige Erweiterungen
Byte 9 ... frei für zukünftige Erweiterungen
Byte ab 10  ab hier 219 Bytes payload

Datentyp ...
entspricht obiger Beschreibung, wird vom Modem einfach mitgesendet

Blocknummer ...
10 bit (0..1023) lange Nummer eines Datenblock. Diese Nummer wird vom Sender automatisch von 0 an bei jedem Block um 1 erhöht. Anhand dieser Nummer kann der Empfänger erkennen ob ein Block fehlt und diesen evt. bei einer neuen Aussendung ergänzen.

Statusbyte ...
entspricht obiger Beschreibung, wird vom Modem einfach mitgesendet

RX Statusinfo ...
0 ... alles OK
4 ... die Blocknummer war nicht kontinuierlich, mindestens ein Block fehlt

Übertragungsgeschwindigkeit ...
Brutto Bitrate (inkl. sämtlicher Daten), gemessen und gemittelt direkt an der Schnittstelle

 

Start des Modems:

das Modem kann auf irgendeinem Rechner, zB Raspberry, laufen und wird dann ohne Bildschirm und Tastatur irgendwo stehen. Das Anwenderprogramm läuft auf einem beliebigen Rechner im Heimnetzwerk. In diesem Fall startet das Modem automatisch sobald der z.B. Raspberry eingeschaltet wird.

Zu Entwicklungszwecken ist es evt nützlich das Modem per hand zu starten, üblicherweise einfach durch Eingabe von:  ./qo100modem

Für spezielle Anwendungen stehen zwei Parameter zur Verfügung:

Parameter m:

Im Fall dass man mehr als ein Modem im Heimnetzwerk laufen lassen möchte geht die (im folgenden beschriebene) Auto-Suchfunktion nicht, jedes Modem würde immer antworten. In dem Fall gibt es die Möglichkeit die IP fest anzugeben. Das wird beim Start des Programms qo100modem mit einem Parameter gemacht:  -m  IPadresseDerAnwendung

Mit dem Parameter m kann man dem Modem die IP der Anwendung sagen (z.b. 127.0.0.1 falls sie am gleichen Rechner läuft).

Anwendungsprogramm sucht das Modem:

die IP Adresse des Modems (ob es jetzt auf dem lokalen Rechner läuft oder einem anderen im Heimnetzwerk) muss nicht bekannt sein. Das Anwenderprogramm kann mit folgender Prozedur das Modem automatisch finden:

Sende eine UDP Nachricht mit Länge: 1Byte und Inhalt: 0x3C an die Broadcastadresse des Heimnetzwerks, an Port 40131. Die Broadcastadresse ist die IP die als letzte Zahl die 255 hat. Beispiel: mein Netzwerk hat den Adressraum 192.168.0.xx  wobei xx meinen verschiedenen Geräten zugewiesen ist. Meine Broadcastadresse ist also 192.168.0.255. An diese Adresse und Port 40131 sende ich eine UDP Nachricht mit Inhalt 0x3c.

Das Modem wird diese Nachricht empfangen und weiß damit schon mal die IP Adresse des Anwendungsprogramms. Jetzt sendet das Modem als Antwort ebenfalls eine kurze UDP Nachricht zurück (Inhalt egal) an Port 40133 (an diesem Port kommen alle Nachrichten des Modems an.

Das Anwenderprogramm liest aus dieser Antwort die IP Adresse des Modems aus, und die normale Kommunikation kann beginnen.

Spezialinformationen der Broadcast Nachricht:

Nach dem Byte 0x3c (siehe oben) werden noch folgende Infos gesendet:

txb[1] = Nummer des ausgewählten Audio Playback Gerätes, entsprechend der empfangenen Liste, die Liste beginnt bei 0 und wird dann einfach hochgezählt
txb[2] = Nummer des ausgewählten Audio Capture Gerätes, entsprechend der empfangenen Liste, die Liste beginnt bei 0 und wird dann einfach hochgezählt
txb[3] = %-Wert 0-100 der TX Lautstärke 
txb[4] = %-Wert 0-100 der RX Lautstärke
txb[5] = Intervall der Sprachansage der Betriebsart: 0=aus, n=1,2,3...  alle n Aussendungen wird eine Sprachansage gemacht.

Spezialinformation in der Antwort auf die Broadcastnachricht:

es wird ein längerer Teststring gesendet, der alle Sound-Geräte enthält die der Rechner (wo das Modem läuft) zur Verfügung hat. Diese Infos kann das Anwenderprogramm benutzen um den Anwender eine Liste zur Soundkartenauswahl anzubieten.

Datenübertragung zwischen Anwenderprogramm und Modem:

Anwenderprogram -> Modem:

UDP Nachricht mit Länge 221 entsprechend dem oben beschriebenen Format. Diese UDP Nachricht geht an die IP Adresse des Modems, Port 40132.

Modem -> Anwenderprogram:

Das Modem sendet 229 Bytes lange UDP Nachrichten an die IP des Anwenderprogramm, an Port Nummer 40133 im oben beschriebenen Format.

 

Beispiel für die Vorgänge im Anwenderprogramm:

1. suche die IP Adresse des Modems, Broadcast UDP Nachricht 0x3c an Port 40131

2. Empfange Antwort des Modem und merke dessen IP Adresse.Lese hier auch die verfügbaren Audio-Geräte aus. Zur Einstellung des gewünschten Audio-Geräts wiederhole 1)

3. Sende eine Nachricht mit Datentyp 16 zum Modem um die gewünschte Modulation/Geschwindigkeit einzustellen

4. Sende beliebige Datenblöcke im obigen Format als UDP Blöcke zur Modem IP Port 40132. Diese Datenblöcke werden sofort entsprechend verpackt, gesichert und ausgesendet. Bei einer kontinuierlichen Aussendung stelle sicher, dass die Daten schnell genug zum Modem gesendet werden um Lücken in der Aussendung zu vermeiden. Lücken führen zu Sync-Problemen beim Empfänger und ggf. Datenverlust. Zu dem Zweck kann der Füllstand des TX Puffers ausgelesen werden, siehe FFT Daten unten.

5. Empfange Datenblöcke die vom Modem an Port 40133 ankommen. Entsprechend obigem Format verarbeite diese Daten nach Wunsch.

Bei Betrieb via QO-100 arbeite Full-Duplex um die Qualität der eigenen Ausendung zu überwachen.

IQ-Daten für ein Konstellationsdiagramm:

 

FFT-Daten für eine Spektrumanzeige: