Skip to content

Feature Request - FT8 logging to remote curl #25

Description

@jurajbujdoso

At the moment, I am not able to store or process FT8 received data on my own.

The file system is in RO mode. (So far this is good solution since sd card could gone with many writes.)
The other problem is that logs from FT8 does not have flag set to "L", which would mean, that they are stored on locall FS or rsyslog.

Currently reporting on the screen is done:

    char buf[CTIME_R_BUFSIZE];
        rcprintf(rx_chan, "PSKReporter spot %s %9.3f %8s %s %+3d %5dkm %s\n", mode, (double) freq / 1e3, call, grid, snr, km, var_ctime_r(&time, buf));

It would be great if, the same message from PSKReporte.cpp can be send to as remote [syslog /or https post request] to remote url.

Url or rsyslog IP could be defined in web config.

Thx a lot

Ps: Somewhere in kiwi forum , I have seen message that rsyslog redirect is available to wspr, but not ft8. But it should be placed in latest release. Probably having the solution to forward systems logs fully to remote rsyslog server would be best option for myself. Since it is most transparent solution.

Something like:

#include <curl/curl.h>

void send_post_request(const char *message) {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://machine.nowhere.com");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, message);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        }

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
}

Or rsyslog:

#include <syslog.h>

void send_to_syslog(const char *message) {
    openlog("KiwiSDR", LOG_PID | LOG_CONS, LOG_USER);
    syslog(LOG_INFO, "%s", message);
    closelog();
}
sudo nano /etc/rsyslog.d/remote.conf

# Forward all messages to remote rsyslog server
*.* @someIPadressOfRemoteServer.com:514

# Stop further processing of messages, do not write it to local file system
& stop

Activity

  1. howard0su commented on Oct 22, 2024

    @howard0su
    Contributor

    I think rsyslog is a good idea. I will go to add this. And expert can configure this easily.

  2. self-assigned this
    on Nov 5, 2024
  3. howard0su commented on Nov 14, 2024

    @howard0su
    Contributor

    I also receive a similar request to ask to pump the spots to a remote network URL. I want to check if this is a better option or syslog gives more flexibility?

  4. pinned this issue on Nov 14, 2024
  5. jurajbujdoso commented on Nov 14, 2024

    @jurajbujdoso
    Author

    web-888 is a great product. Any of the solution would be perfect.

    The syslog have benefit, due the fact that logging facility level could be adjusted.
    So I can log "PSKReporter spot" to IP_A and logs related to "ADMIN connection closed" to sec. log server IP_B.
    One integration place for all plugins, if they use system log feature.

    On the other hand sending it as http curl or something, will be better for public post processing using IOT sw like node-red, etc. Just simple processing of http get/post request could be parsed quickly.

    The report for pskreporter send currently batches of reports in one bundle to report.pskreporter.info using ip flow information exchange. The IP address of pskreporter is hard encoded, but I have seen some test address in source code for debug purpose. But for many people it would be hard to program just udp packet receiver for batch packets processing.

    But probably dirty solution could be also make IP redirect on the router :).
    Tcpdump/wireshark is also able to process this data, but it requires additional processing, since data are not nice to read. IMHO

    In any case great product which really work nice.
    Ps: Thx really for nice manual how to build firmware.

    Juraj

  6. mikerbts commented on Dec 14, 2024

    @mikerbts

    It would be great to have the ft8 data sent in the wsjt-x udp protocol as this is what numerous logging and support applications such as jtalert or gridtracker use for alerting on wanted spots.

    There is a kiwisdr implementation of exactly this documented on this webpage

    https://robertresearchradios.com/p/wsjt-x-and-digiskimmer-and-gridtracker-oh-my/

    All the code is linked at the bottom of the page and is hosted on github.

    A python library to generate or interpret wsjt udp packets is here:

    https://github.com/MeadeRobert/py-wsjtx/

  7. howard0su commented on Dec 15, 2024

    @howard0su
    Contributor
  8. mikerbts commented on Dec 15, 2024

    @mikerbts

    Hmmm that doesn't seem right. The protocol carries the full frequency they call "dial frequency" in the protocol.

    The full protocol spec is outlined here. The info captured in the pskreporter output should carry enough info to pipe out over the protocol to satisfy the apps.

    https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/Network/NetworkMessage.hpp

    And here are some client encoder and server decoding examples bundled with the wsjt software

    https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/UDPExamples/

  9. mikerbts commented on Dec 15, 2024

    @mikerbts

    There is also a python wsjt udp message encoder decoder located here :

    https://github.com/kholia/py-wsjtx

    This suggests the packet content could be as simple as:

    (self.dial_frequency, self.rx_df, self.tx_df, self.dx_call, self.dx_grid, self.report)

  10. howard0su commented on Dec 15, 2024

    @howard0su
    Contributor

    WSJT-X supports output the frequency to udp server via message code=1. But the decode message is output via message code=2, which doesn't include a freq but only Delta frequency.

     * Decode        Out       2                      quint32
     *                         Id (unique key)        utf8
     *                         New                    bool
     *                         Time                   QTime
     *                         snr                    qint32
     *                         Delta time (S)         float (serialized as double)
     *                         Delta frequency (Hz)   quint32
     *                         Mode                   utf8
     *                         Message                utf8
     *                         Low confidence         bool
     *                         Off air                bool
    
  11. mikerbts commented on Dec 15, 2024

    @mikerbts

    I see what you mean. Could both packets just be sent for each decoded station or would that cause too much overhead?

    Or not knowing how the decoder is called, could the udp code be called for each ft8 channel being decoded?

    Does it decode one channel at a time? If so would that provide opportunity to get the dial frequency and add the freqeuncy delta for each decoded station as each channel is processed?

    Appreciate you having looked into it. If it can't work i understand. I wish I was better at coding / programming.

  12. howard0su commented on Dec 16, 2024

    @howard0su
    Contributor
  13. howard0su commented on Dec 29, 2024

    @howard0su
    Contributor

    How about using MQTT to stream out the data as openwebrx?

  14. jurajbujdoso commented on Dec 29, 2024

    @jurajbujdoso
    Author

    I have a look on openwebrx implementation.
    Base on inside, it would be a great solution.

    OpenWebRX can report received data to an MQTT broker. The data for each mode is sent under the "openwebrx/" topic. For example, FT8 data is reported as "openwebrx/FT8". A typical report will look as follows:

    {
      "mode":      "FT8",
      "timestamp": 1722482895000,
      "freq":      7074985, 
      "msg":       "CQ YV6BXN FK60",
      "callsign":  "YV6BXN",
      "locator":   "FK60"
    }
    

    OpenWebRX+ uses MQTT to report SDR device changes and other internal events. For example, when an OpenWebRX+ server starts up or shuts down, it sends the following event under the "openwebrx/RX" topic:

    {
      "mode":      "RX",
      "timestamp": 1722737506393,
      "version":   "v1.2.64", 
      "state":     "ServerStarted"
    }
    

    OpenWebRX+ reports SDR device changes under the "openwebrx/RX" topic that can be used by various automation scripts. Thus, an SDR profile change will be reported as follows:

    {
      "mode":       "RX",
      "timestamp":  1722483751451,
      "source_id":  "rspdx", 
      "source":     "RSPdx",
      "profile_id": "air-1",
      "profile":    "Air Band 118-120", 
      "freq":       118900000,
      "samplerate": 2000000
    }
    

    OpenWebRX+ reports user activities under the "openwebrx/CLIENT" topic. Thus, a user connecting or disconnecting from the server will be reported as follows:

    {
      "mode":      "CLIENT",
      "timestamp": 1722738356255, 
      "ip":        "::ffff:101.23.45.67",
      "state":     "Connected",
      "banned":    false
    }
    

    I partially use http://mqtt.pskreporter.info for getting data about ft8, but I am not sure, how long it will work.

    As we have new year in 2 days.

    I want to wishing you a wonderful year ahead, filled with joy, success, and good health.
    May 2025 bring you new adventures and unforgettable moments!

    Juraj/George

  15. jurajbujdoso commented on Feb 3, 2025

    @jurajbujdoso
    Author

    I just want to ask, if it would be possible to increase time reporting in ft8 logs to mili seconds ?

    I want to play with TDOA and search some data point, where to start. FT8 seems as good field, since each signal is marked with time and location. I would like to be able to verify that locator provided in FT8 log match the TDOA.

    Mon Feb  3 07:51:45 17d:23:53:42.845 ..234567.....    3            PSKReporter spot FT8 14076.838   PE1CPJ JO21 -10  1184km Mon Feb  3 07:51:30 2025
    Mon Feb  3 07:51:45 17d:23:53:42.847 ..234567.....    3            PSKReporter spot FT8 14076.575   DL1YCK JN49 -10   888km Mon Feb  3 07:51:30 2025
    

    Current time stamp contains just seconds:

    Feb  3 07:51:30 2025
    

    Also the information from PSK reporter is just in UNIX time:

    {"sq":53332502268,"f":28076271,"md":"FT8","rp":-6,"t":1736607071,"sc":"DF1OLS","sl":"JO51en46sj","rc":"YO6SSW","rl":"KN25TP","sa":230,"ra":275,"b":"10m"}
    {"sq":53332506340,"f":28075744,"md":"FT8","rp":-4,"t":1736607071,"sc":"DF1OLS","sl":"JO51en46sj","rc":"HA4BF","rl":"JN97si38","sa":230,"ra":239,"b":"10m"}
    {"sq":53332514562,"f":28075763,"md":"FT8","rp":7,"t":1736607071,"sc":"DF1OLS","sl":"JO51en46sj","rc":"UT7UV","rl":"KO40vk77lk","sa":230,"ra":288,"b":"10m"}
    
    

    The radio signal would probably travel around the world in time less then 0.13 sec.
    Maybe additional topic for me, could be to have a look on Doppler shift.
    Similar when we receive signal from GEO satellite, programs try to calculate the right frequency shift in forecast.
    I would like to have a deeper look on FT8 Doppler shift in HF transmissions.

    Thx a lot.

  16. jurajbujdoso commented on Feb 23, 2025

    @jurajbujdoso
    Author

    Thx a lot for adding syslog support.

    Base on commit 1b0c70a
    I have seen that logging is already in Master, so I compile it and give it a try. Works wonderfully.

    Additional changes on my side in ssh:

    apk-add rsyslog
    
    
    vi /etc/rsyslog.conf
    #### Rules ####
    *.* @10.10.10.10:514
    & ~
    

    To avoid to store logs locally and just enable remote udp logging.

     /etc/init.d/rsyslog restart
    

    Thx

    Example from syslog server:

    Date	Time	Level	Host Name	Category	Program	Messages
    02/23/2025	22:13:16	Info	web-888	user		00:18:10.608 ..23456789... 2 FT8 DECODE: 7074.616 G6ORT IO83 -14 1749km Sun Feb 23 22:13:00 2025
    02/23/2025	22:13:02	Info	web-888	user		00:17:56.383 ..23456789... 8 FT8 DECODE: 10137.934 JH0JLP PM85 -14 8689km Sun Feb 23 22:12:45 2025
    02/23/2025	22:12:54	Info	web-888	syslog		-- MARK --
    02/23/2025	22:12:31	Info	web-888	user		00:17:25.368 ..23456789... 4 FT8 DECODE: 18101.519 CT7AIU IM67 -13 2596km Sun Feb 23 22:12:15 2025
    02/23/2025	22:12:01	Info	web-888	user		00:16:55.282 ..23456789... 2 FT8 DECODE: 7075.119 M0XLR IO83 -11 1749km Sun Feb 23 22:11:45 2025
    02/23/2025	22:11:46	Info	web-888	user		00:16:40.912 ..23456789... 8 FT8 DECODE: 10137.731 EB7CFU IM77 -15 2459km Sun Feb 23 22:11:30 2025
    
  17. jurajbujdoso commented on Feb 25, 2025

    @jurajbujdoso
    Author

    I just play a little and create an simplex app for visualize of ft8logs. Logs are send over syslog, then parsed and visualized using javascript. It is just POC, to have somethign on side:

    https://github.com/jurajbujdoso/playWith-web888-ft8-logs

    The nice think on syslog is, that I have 2 lines for sharing syslog data. One which send data to syslog server and the second line which send data just to the upper application. As I use UDP, there is no need that application is app all the time.

    Image view

  18. howard0su commented on Mar 5, 2025

    @howard0su
    Contributor

    In latest update, I added feature to log ft8 spots into syslog. and it is possible to remote pump syslog data into other machine. partially, the requirement in this thread can be met. Love to hear the feedback.

  19. gorzynsk commented on Mar 30, 2025

    @gorzynsk

    I've installed the rsyslog and redirected it to other machine where the playWith-web888-ft8-logs runs and it's working great. Can I somehow make rsyslog and its config persist?

    Not sure if that's only me, but my idea on using web-888 was to have it working 24/7 and maybe somehow notify me when there's a new DXCC received etc. Of course the user would have to provide ADIF logs. If that would be possible within web-888 then the dream would come true (-:

    Thank you for great work
    73
    Jakub SQ2WB

  20. howard0su commented on Mar 31, 2025

    @howard0su
    Contributor
  21. jurajbujdoso commented on Apr 1, 2025

    @jurajbujdoso
    Author

    I have add adif support for received rsyslog logs. Hope it helps to interconnect with your apps.
    Just change the location of the directory "$(pwd)/logs" where you want to create wsjtx_log.adi.

    #remove old container
    #create dir:
    mkdir logs
    
    docker run -d -p 5000:5000 -p 5140:5140/udp \
        -e LimitTime=900 \
        -e STATION_CALLSIGN=N0CALL \
        -e MY_GRIDSQUARE=AA00aa \
        -e ADIF_LOGS=Yes \
        --name ft8-visual \
        --restart unless-stopped \
        -v $(pwd)/logs:/app/logs \
        bujdo/ft8_visualisation_syslog_web888:010425
    

    Juraj om0ace

  22. gorzynsk commented on Apr 1, 2025

    @gorzynsk

    Wow. That's great, but... I proposed kind of reverse of that...

    I have an ADIF log in WSJTX and would like to upload this log to Web-888 or play-with-web888-ft-logs so it knows which counties are already on my list. Then compare newly received stations with my log and notify me on new country being received so I switch on a PC and TRX to make a QSO.

    I even found https://pyhamtools.readthedocs.io/en/latest/index.html

  23. mikerbts commented on Apr 1, 2025

    @mikerbts

    Wow. That's great, but... I proposed kind of reverse of that...

    I have an ADIF log in WSJTX and would like to upload this log to Web-888 or play-with-web888-ft-logs so it knows which counties are already on my list. Then compare newly received stations with my log and notify me on new country being received so I switch on a PC and TRX to make a QSO.

    This is what I was wanting. The WSJT UDP packets can feed into an app called GridTracker which shows currently heard stations you need via a criteria you set such as need states or dxcc, etc.

    That protocol is well documented but I don't have the tech skills to implement having the syslog data converted and broadcast via that format over UDP.

  24. howard0su commented on Apr 15, 2025

    @howard0su
    Contributor

    Just FYI, I plan to add MQTT support to web-888 like openwebrx is doing. I believe it should also solve some usecases discussed in this thread.

  25. jurajbujdoso commented on Apr 15, 2025

    @jurajbujdoso
    Author

    It would be great to have it.
    I have look on the internet, but I was not able to found some standards for MQTT sdr data format.

    Probably tools like gridtracker.org could benefits, when there would be some standard in the field.
    Even aggregate data from multiple sdr using similar interface for all.
    At the moment they have integration for wsjtx/jtdx but utilizing udp packets with some init section + data content. I try to create similar packet after transforming data from rsyslog, but I have not succeed yet.

    On psk-reporter there is already mqtt
    http://mqtt.pskreporter.info/ and they have about 2 application which actively consume that format.

    Beside that, I have search for description of PINs for EXTio and I found out "lbu commit -d" in the wiki in hostname section.
    [You have mention that rsyslog stream].

    So now I know, that is much more nicer way to install packages and save time. And not to search for own solution :)
    It would may be good for others, to mention it explicitly somewhere, because it is little bit hard to find.
    And I guess the linux lowers would like to have such option visible.

    Understanding how to integrate your own APK package to run persistently at boot would be a major step for anyone looking to develop a lightweight background daemon.

    Juraj

  26. howard0su commented on Apr 15, 2025

    @howard0su
    Contributor

    Thank you for your suggestion. I will put together some information regarding apk and lbu stuffs into a document "Advanced Linux User Guide".

    besides gridtracker, openwebrx+ has some definition as well. https://fms.komkon.org/OWRX/#HOW-MQTT

  27. howard0su commented on Apr 22, 2025

    @howard0su
    Contributor

    This is my current plan on mqtt messages. I am optimize for application which can filter topics via MQTT without parse all the events. Welcome suggestions and feedbacks.

    1. SDR events

    SDR Events are mainly used for the important events from application. The current planned events are
    Topic: websdr//
    Payload: Json payload for the details.

    deviceid is uniqe for every device.
    events: start/ stop / temp/ login/ logout
    payload: timestamp, and additional fields for each event

    1. FT8/WSPR events

    Topic: websdr/deviceid/{ft8|wspr|ft4}/prefix/callsign/
    Payload; JSON format, detailed about event like timestamp, callsign, target callsign, grid, etc. (To be finalized)

  28. jurajbujdoso commented on Apr 30, 2025

    @jurajbujdoso
    Author

    Sorry for the late update.
    Everything looks really good so far from your suggestions.

    In the meantime, I try to reach out on the Gridtracker2 team using Discord to ask if they could consider adding MQTT support, but I haven’t received a response for quite a while, so I’m not expecting much to change.

    I still believe MQTT could be a great solution, especially since it allows hams to handle their data more independently. It would also be great if the data visualization could support multiple streams from several FT8 SDR devices at the same time. Currently, most visualization tools seem to only handle a single stream, which is limiting.
    Receiving multiple streams could be very beneficial, as it would allow us to observe frequency shifts between different receiving stations in real time, as well as compare signal strength across various locations. I believe this could provide some really interesting insights.

    I also attempted 2. time to create a translation engine that grabs logs/JSON data from web-888 and converts it into a format that GridTracker2 can read via WSJT-X UDP, but unfortunately, I wasn’t successful—again.

    Juraj

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions