jks
About
- Username
- jks
- Joined
- Visits
- 32,307
- Last Active
- Roles
- Member, Administrator, Moderator
- Points
- 331
Reactions
-
Camp Features
-
rx-tx.info: preview/table/map of WebSDR, OpenWebRX & KiwiSDRs
From the new OpenWebRX fork developer I think: https://rx-tx.info
-
About Python KiwiClient [Kiwi API question]
The Kiwi protocol requires the client to send "keep alive" messages at least once every 60 seconds. Otherwise it is assumed the client (Javascript in the browser usually) isn't really running even if the web socket connection is still open for some reason. This had to be done in order to prevent connections from remaining open for long periods of time even through no one was really there. If no keep alive is received the connection is closed.
I don't know if it helps, but I was able to make web socket connections and send Kiwi commands and receive Kiwi sound and waterfall binary data using a program called
websocat
(web socket concatenate). See: https://github.com/vi/websocat There are binaries available for Windows, Linux and Mac and I was able to run the Mac one without problems.So, to connect to a Kiwi and get sound data do something like this from the Mac command line:
cat snd.ws.txt | websocat_mac -n ws://my_kiwi:8073/12345678/SND
Where
my_kiwi
is the name of the Kiwi and the filesnd.ws.txt
contains these commands to send to the Kiwi:SET auth t=kiwi p=
SET AR OK in=12000 out=44100
SET squelch=0 max=0
SET genattn=0
SET gen=0 mix=-1
SET ident_user=kiwirecorder.py
SET mod=am low_cut=-5000 high_cut=5000 freq=7550.000
SET agc=1 hang=0 thresh=-100 slope=6 decay=1000 manGain=50
SET keepalive
12345678
is a number and needs to be unique for each connection (hence a timestamp in msec). Thewebsocat -n
argument keeps the connection to the Kiwi open after all the commands in the file are sent. But note the connection will still close because additionalSET keepalive
commands are not being periodically sent.What you will receive from the Kiwi will be a combination of messages and data looking something like this:
MSG client_public_ip=[your public ip address as seen by the Kiwi]
MSG rx_chans=4
MSG chan_no_pwd=0
MSG chan_no_pwd_true=0
MSG is_local=0,1
MSG max_camp=4
MSG badp=0
MSG version_maj=1 version_min=447
MSG load_cfg= (large amount of configuration data omitted)
MSG center_freq=15000000 bandwidth=30000000 adc_clk_nom=66666600
MSG audio_init=1 audio_rate=12000 sample_rate=12001.062106
MSG stats_cb={"ct":4633,"ce":0,"cf":1000,"cc":0,"cu":[51],"cs":[49],"ci":[0],"ac":0,"wc":0,"fc":0,"ah":0,"as":0,"sr":12001.062106,"ga":0,"gt":0,"gg":0,"gf":0,"gc":66.665900,"go":0,"gr":"RF82ci","ad":0,"au":0,"ae":0,"ar":0,"an":4,"an2":32,"ap":[0,7439,0,0],"ai":[0,2121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"sa":9,"sh":9,"tu":"04:04","tl":"17:04","ti":"NZDT","tn":"Pacific%5c%2fAuckland"}
SND [binary sound data]
SND [binary sound data]
...
You can do something similar for the waterfall with the command line:
cat wf.ws.txt | websocat_mac -n ws://my_kiwi:8073/12345678/W/F
And the
wf.ws.txt
file:SET auth t=kiwi p=
SET zoom=0 cf=7550.000000
SET maxdb=-10 mindb=-110
SET wf_comp=0
SET wf_speed=1
SET ident_user=kiwirecorder.py
SET keepalive
And you'll receive the waterfall data:
MSG rx_chans=4
MSG chan_no_pwd=0
MSG chan_no_pwd_true=0
MSG max_camp=4
MSG badp=0
MSG version_maj=1 version_min=447
MSG center_freq=15000000 bandwidth=30000000 adc_clk_nom=66666600
MSG kiwi_up=1 rx_chan=0
MSG extint_list_json=%5b%22colormap%22,%22cw_decoder%22,%22devl%22,%22DRM%22,%22fax%22,%22FFT%22,%22fsk%22,%22IBP_scan%22,%22iframe%22,%22iq_display%22,%22loran_c%22,%22navtex%22,%22noise_blank%22,%22noise_filter%22,%22sig_gen%22,%22S_meter%22,%22SSTV%22,%22TDoA%22,%22timecode%22,%22wspr%22%5d
MSG wf_fft_size=1024 wf_fps=23 wf_fps_max=23 zoom_max=14 rx_chans=4 wf_chans=4 wf_chans_real=4 wf_setup
MSG zoom=0 start=0
MSG wf_fps=1
MSG request_dx_update
W/F [binary waterfall data]
W/F [binary waterfall data]
...
This discussion is not complete because we need to talk about the parameters for the various
SET
commands and also the content of the returned binary data. These details are all handled by the kiwiclient / kiwirecorder Python code and that's why you should really try and make an effort to understand it. -
v1.446/445/444
From the CHANGE_LOG file. Not a lot new here. Except for days of tedious checking for memory errors (buffer overruns) and memory leaks to rule out a possible cause of the Windows 10 audio problems.
v1.446 March 28, 2021
WSPR extension:
By request: Added 6 & 13 MHz ISM bands (UK balloon-mobile operation).
Can restart autorun decoders via an admin page button instead of server restart.
Windows 10 audio "popping" problem:
Looked for memory addressing errors and leaks with the Clang address sanitizer.
A few minor issues fixed but nothing that changes the audio problem.
This was expected, but also had to be ruled out.
v1.445 March 24, 2021
SNR measurement:
Take transverter frequency offset into account.
Display SNR value(s) on user (top bar) and admin pages (status tab).
Added SAM PLL loop control to audio tab.
Has a slow loop setting "DX" that can be used to better track weak stations.
v1.444 March 23, 2021
Include two most recent SNR values in /status query. This implies all the SNR values
for public Kiwis will be aggregated in the rx.kiwisdr.com/index.html file
HTML comments.
TDoA extension:
Improved help panel contents.
Added warning against prematurely using too many sampling stations because of
the large number of computation timeouts we see on the server.
-
sd card problem during backup
If the Linux "lsblk" command doesn't see the mmcblk1 device (note "1", not "0" which is the on-board filesystem) then as far as Linux is concerned the sd card isn't plugged in (or recognized). The Kiwi software has nothing to do with it at that point. That's why the lsblk command is run in the script -- to show that state of the sd card before doing anything.
So while everything is still running try pushing on the sd card to eject (unlatch) it, then re-seat it and try the backup again. I sometimes find I have to do this a couple of times. I don't know why.