QtSoundModem KISS Port Setup

KISS Protocol

Pros

  • Allows for on the fly NETROM capability
  • Allows use of the L2 BPQ DIGIPEATER facility.

Cons

  • Bypasses QtSoundModem’s frame-collector optimizer.
  • Bypasses QtSoundModem’s dynamic MAXFRAME optimizer.
  • Ports cannot be interlocked so TX collisions will occur when several users try to use two or more ports at once.
  • Does not support ATTACH or RADIO rig control commands.
  • Does not support dynamic MODEM selection or FREQ center frequency adjustment TNC parameters.
  • Nothing will appear in the connection statistics window of QtSoundModem (located above the waterfall/below the monitor window).

Notes

  • QtSoundModem.ini settings for port parameters are ignored. PACLEN, TXDELAY, FRACK, PERSIST, SLOTTIME etc is taken from the BPQ32.cfg
  • Connection syntax is slightly different to that of single-session type TNCs, with a KISS port one can specify the port and destination in one command.

BPQ32.cfg Example

This example is running 4 ports on a single HF SSB transceiver. If you only wish to have two ports, omit ports declared PORTNUM=3 and PORTNUM=4 from the configuration.

; KISS Mode QtSoundModem, all _4_ modems enabled for
; a single SSB transceiver.
;
; WARNING: UZ7HO‘s SoundModem only supports max of _2_ modems so use
; caution if copying this for use with SoundModem instead of
; QtSoundModem.
;
; Modems are differentiated by tonal frequency, so for SSB mode only.

PORT
        PORTNUM=1
        ID=Modem A
        TYPE=ASYNC
	KISSOPTIONS=ACKMODE
        IPADDR=127.0.0.1 ; QTSM IP
        TCPPORT=8100     ; QTSM KISS PORT
        PROTOCOL=KISS
        CHANNEL=A
	QUALITY=0 	; Default to NETROM OFF.
                        ; Can be overriden on cmd line to bring port up for backup netrom (90)
	MINQUAL=236	; Only broadcasts nodes higher than x on this port.
        PACLEN=40
        TXDELAY=300     ; Transmit keyup delay (ms)
        SLOTTIME=100    ; CMSA interval timer (ms)
        TXTAIL=50
        FRACK=8000
        PERSIST=63
        DIGIFLAG=1
        DIGIPORT=0      ; Port on which to send digi'd frames (0 = same port)
        RETRIES=10      ; Level 2 maximum retry value
        MAXFRAME=1      ; Max outstanding frames (1 thru 7)
        L3ONLY=0        ; 1=No user downlink connects on this port
	USERS=1		; Maximum number of L2 sessions, 0 = no limit
        CONFIG
                UPDATEMAP
ENDPORT

PORT
        PORTNUM=2
        ID=Modem B
        TYPE=ASYNC
	KISSOPTIONS=ACKMODE
        IPADDR=127.0.0.1 ; QTSM IP
        TCPPORT=8100     ; QTSM KISS PORT
        PROTOCOL=KISS
        CHANNEL=B
	QUALITY=0 	; Default to NETROM OFF.
                        ; Can be overriden on cmd line to bring port up for backup netrom (90)
	MINQUAL=236	; Only broadcasts nodes higher than x on this port.
        PACLEN=40
        TXDELAY=300     ; Transmit keyup delay (ms)
        SLOTTIME=100    ; CMSA interval timer (ms)
        TXTAIL=50
        FRACK=8000
        PERSIST=63
        DIGIFLAG=1
        DIGIPORT=0      ; Port on which to send digi'd frames (0 = same port)
        RETRIES=10      ; Level 2 maximum retry value
        MAXFRAME=1      ; Max outstanding frames (1 thru 7)
        L3ONLY=0        ; 1=No user downlink connects on this port
	USERS=1		; Maximum number of L2 sessions, 0 = no limit
        CONFIG
                UPDATEMAP
ENDPORT

PORT
        PORTNUM=3
        ID=Modem C
        TYPE=ASYNC
	KISSOPTIONS=ACKMODE
        IPADDR=127.0.0.1 ; QTSM IP
        TCPPORT=8100     ; QTSM KISS PORT
        PROTOCOL=KISS
        CHANNEL=C
	QUALITY=0 	; Default to NETROM OFF.
                        ; Can be overriden on cmd line to bring port up for backup netrom (90)
	MINQUAL=236	; Only broadcasts nodes higher than x on this port.
        PACLEN=40
        TXDELAY=300     ; Transmit keyup delay (ms)
        SLOTTIME=100    ; CMSA interval timer (ms)
        TXTAIL=50
        FRACK=8000
        PERSIST=63
        DIGIFLAG=1
        DIGIPORT=0      ; Port on which to send digi'd frames (0 = same port)
        RETRIES=10      ; Level 2 maximum retry value
        MAXFRAME=1      ; Max outstanding frames (1 thru 7)
        L3ONLY=0        ; 1=No user downlink connects on this port
	USERS=1		; Maximum number of L2 sessions, 0 = no limit
        CONFIG
                UPDATEMAP
ENDPORT

PORT
        PORTNUM=4
        ID=Modem D
        TYPE=ASYNC
	KISSOPTIONS=ACKMODE
        IPADDR=127.0.0.1 ; QTSM IP
        TCPPORT=8100     ; QTSM KISS PORT
        PROTOCOL=KISS
        CHANNEL=D
	QUALITY=0 	; Default to NETROM OFF.
                        ; Can be overriden on cmd line to bring port up for backup netrom (90)
	MINQUAL=236	; Only broadcasts nodes higher than x on this port.
        PACLEN=40
        TXDELAY=300     ; Transmit keyup delay (ms)
        SLOTTIME=100    ; CMSA interval timer (ms)
        TXTAIL=50
        FRACK=8000
        PERSIST=63
        DIGIFLAG=1
        DIGIPORT=0      ; Port on which to send digi'd frames (0 = same port)
        RETRIES=10      ; Level 2 maximum retry value
        MAXFRAME=1      ; Max outstanding frames (1 thru 7)
        L3ONLY=0        ; 1=No user downlink connects on this port
	USERS=1		; Maximum number of L2 sessions, 0 = no limit
        CONFIG
                UPDATEMAP
ENDPORT

QtSoundModem.ini Example


[Window]
Waterfall1=1
Waterfall2=0

[Init]
CM108Addr=
DispMode=1
DualChan=1
DualPTT=0
HamLibHost=127.0.0.1
HamLibPort=4532
MinimizetoTray=0
PTT=None
PTTBAUD=19200
PTTMode=1
PTTOffString=
PTTOnString=
RXSampleRate=12000
SCO=1
SndRXDeviceName=:dsnooped0
SndTXDeviceName=:dmix0
SoundMode=0
TXPort=8884
TXRotate=0
TXSampleRate=12000
UDPClientPort=8888
UDPHost=127.0.0.1\n
UDPServer=0
UDPServerPort=8884
multiCore=0
pttGPIOPin=17
pttGPIOPinR=17

[Modem]
CWIDCall=
CWIDInterval=
CWIDLeft=0
CWIDRight=0
CWIDType=1
DCDThreshold=72
ModemType1=0
ModemType2=0
ModemType3=0
ModemType4=0
NRRcvrPairs1=3
NRRcvrPairs2=3
NRRcvrPairs3=0
NRRcvrPairs4=0
PreEmphasisAll1=1
PreEmphasisAll2=1
PreEmphasisAll3=1
PreEmphasisAll4=1
PreEmphasisDB1=0
PreEmphasisDB2=0
PreEmphasisDB3=0
PreEmphasisDB4=0
RXFreq1=1000
RXFreq2=2000
RXFreq3=2300
RXFreq4=2600
RcvrShift1=30
RcvrShift2=30
RcvrShift3=30
RcvrShift4=30
TxDelay1=350
TxDelay2=350
TxDelay3=350
TxDelay4=350
TxTail1=30
TxTail2=30
TxTail3=30
TxTail4=30
rxOffset=0
soundChannel1=1
soundChannel2=1
soundChannel3=1
soundChannel4=1


[AGWHost]
Port=8000
Server=0

[KISS]
Port=8100
Server=1

[AX25_A]
MyDigiCall="PE1RRR-7,RIJEN,RRR"
BitRecovery=0
FX25=2
IPOLL=80
KISSOptimization=1
NonAX25Frm=0
TXFrmMode=1

[AX25_B]
BitRecovery=0
FX25=2
IPOLL=80
KISSOptimization=1
NonAX25Frm=0
TXFrmMode=1

[AX25_C]
BitRecovery=0
FX25=2
IPOLL=80
KISSOptimization=1
NonAX25Frm=0
TXFrmMode=1

[AX25_D]
BitRecovery=0
FX25=2
IPOLL=80
KISSOptimization=1
NonAX25Frm=0
TXFrmMode=1

This example is running four modems (sound channels) on a single HF SSB transceiver. The following example disables all but one modem (sound channel).

soundChannel1=1
soundChannel2=0
soundChannel3=0
soundChannel4=0

Confused? 1=A, 2=B, 3=C, 4=D

QtSoundModem Frame Display

The number preceding packet frames indicates the sound channel, somewhat confusingly indicated in the GUI above with A, B, C and D. Additionally, the sections inside the QtSoundModem.ini file are declared with [AX25_A], [AX25_B], [AX25_C] and [AX25_D].

Testing The KISS Ports

Initialising Port 01     TCPKISS IP 127.0.0.1 Port 8100 Chan A
Initialising Port 02     TCPKISS IP 127.0.0.1 Port 8100 Chan B
Initialising Port 03     TCPKISS IP 127.0.0.1 Port 8100 Chan C
Initialising Port 04     TCPKISS IP 127.0.0.1 Port 8100 Chan D

From the BPQ terminal command line, the PORTNUM is used to identify the KISS port. If PORTNUM is not set, then BPQ assigns a PORTNUM automatically. PORTNUM is not affiliated with the sound channel number, they may look the same but that would be purely coincidental.

Output of the Ports command (bold emphasis is my input):

ports
RIJEN:PE1RRR-7} Ports
  1 Modem A                       
  2 Modem B                       
  3 Modem C                       
  4 Modem D  

Issuing the following commands will produce the output that follows:

C 1 TEST1
- Wait a few seconds
- Press enter to abort previous connect
C 2 TEST2
- Wait a few seconds
- Press enter to abort previous connect
C 3 TEST3
- Wait a few seconds
- Press enter to abort previous connect
C 4 TEST4
- Wait a few seconds
- Press enter to abort final connect
1:Fm PE1RRR To TEST1 <SABM C  P>[00:15:59T]
1:Fm PE1RRR To TEST1 <DISC C  P>[00:16:03T]
2:Fm PE1RRR To TEST2 <SABM C  P>[00:16:10T]
2:Fm PE1RRR To TEST2 <DISC C  P>[00:16:14T]
3:Fm PE1RRR To TEST3 <SABM C  P>[00:16:24T]
3:Fm PE1RRR To TEST3 <DISC C  P>[00:16:27T]
4:Fm PE1RRR To TEST4 <SABM C  P>[00:16:35T]
4:Fm PE1RRR To TEST4 <DISC C  P>[00:16:39T]

Soundcard Definition – .asoundrc file

A snippet from the .asoundrc file that comes from the RPI4 Trifecta: VARA, Packet & ARDOP – One Audio Interface tutorial. The hardware (hw:1,0) interface number is derived from the number displayed next to the sound interface by the command aplay -l


pcm.dsnooped0 {
    type dsnoop
    ipc_key 50000
    ipc_key_add_uid false   # let multiple users share
    ipc_perm 0666           # IPC permissions for multi-user sharing (octal, default 0600)
    slave {
        pcm "hw:1,0"
        channels 1
    }
}

pcm.dmix0 {
    type dmix
    ipc_key 60000
    ipc_key_add_uid false   # let multiple users share
    ipc_perm 0666           # IPC permissions for multi-user sharing (octal, default 0600)
    slave {
        pcm "hw:1,0"
        rate 48000
    }
}

If you find the articles, or content in general posted here useful, enjoyable or maybe even something else, please consider making a small contribution towards my hosting fund so that I may continue to provide my services for free to as many people as possible.